В документации по setjmp (3) на страницах руководства (в моей системе) указано, что
Все доступные объекты имеют значения на момент вызова подпрограммы longjmp (), за исключением того, что значения объектов продолжительности автоматического вызова хранилища, которые не имеют изменчивого типа и были изменены между вызовом setjmp () и вызовом longjmp (), равны неопределенный.
Включает ли это только объекты, которые находятся в той же области видимости, что и функция, вызывающая setjmp
, или также любые объекты в области действия функций выше по стеку вызовов?
Например, правильный ли следующий код?
#include <stdio.h>
#include <setjmp.h>
jmp_buf env;
void function_that_longjmps(void)
{
longjmp(env, 1);
}
int setjmp_wrapper(jmp_buf env)
{
if (setjmp(env) == 0)
return 0;
else
return 1;
}
int main()
{
int i = 0;
if (setjmp_wrapper(env) == 0) {
i = 1;
function_that_longjmps();
}
printf("i = %d\n", i);
return 0;
}
Локальная переменная i
изменяется между вызовами setjmp
и longjmp
, но не существует в области setjmp_wrapper
. Есть ли вероятность, что в этом случае переменная будет заторможена?
longjmp
вsetjmp_wrapper
после того, как он уже был возвращен, сама по себе является неопределенным поведением. - person user2357112 supports Monica   schedule 06.08.2017