Безопасно ли использовать longjmp через блок try?

У меня есть следующая функция lua_CFunction, написанная на C ++:

int my_function(lua_State* L) {
int x = 0;
try {
x = do_cpp_stuff_that_invokes_lua_API_as_well();
} catch(const std::exception& ex) {
lua_pushstring(ex.what().c_str());
lua_error(L);
}
return x;
}

Мой вопрос заключается в следующем: нормально ли делать lua_error (L) или вызывать любую функцию lua, которая может longjmp:

  • в блоке try?
  • в блоке улова?

Я позабочусь о переменных, размещенных в стеке, просто не выделяя ничего, что будет зависеть от деструктора (строка и т. Д.). Если мне нужно сделать это, тогда все функции lua в этой области обернуты в pcall, и если этот pcall терпит неудачу, исключение выдается для этой функции, которую я опубликовал. Просто меня интересуют блоки try-catch.

Большое спасибо

1

Решение

Соответствующее правило (§18.10 [support.runtime] / p4):

Подпись функции longjmp(jmp_buf jbuf, int val) имеет больше
ограниченное поведение в этом международном стандарте. setjmp/longjmp
Пара вызовов имеет неопределенное поведение при замене setjmp а также
longjmp от catch а также throw будет ссылаться на любой нетривиальный
деструкторы для любых автоматических объектов.

Стандарт C ++ не ограничивает использование setjmp а также longjmp,

3

Другие решения

Если вы делаете длинный прыжок из блока catch, вы, по крайней мере, собираетесь утратить память, используемую для хранения объекта исключения. Компилятор генерирует код, освобождающий эту память на путях потока управления, выходящих из области действия блока catch. Если вы делаете длинный прыжок, ни один из этих путей не будет взят.

Документация Sun Studio запрещает смешивать исключения и longjmp явно:

В частности, вы не должны делать longjmp в или из блока try или catch (прямо или косвенно) или longjmp после инициализации или нетривиального уничтожения авто переменных или временных переменных.

1

По вопросам рекламы [email protected]