在调用longjmp()后,如果非易失性限定符的本地对象自调用setjmp()以来可能已经发生变化,则不应访问它们。在这种情况下,它们的值被认为是不确定的,并且访问它们是未定义行为。
现在我的问题是,为什么在这种情况下使用volatile会起作用?即使那个易失性变量发生了变化,longjmp也不会失败吗?例如,在下面给出的示例中,longjmp将如何正确工作?当代码在longjmp之后返回到setjmp时,local_var的值不会是2而是1吗?
void some_function()
{
volatile int local_var = 1;
setjmp( buf );
local_var = 2;
longjmp( buf, 1 );
}
setjmp
时变为易失性。类似这样:int x; /* 做一些事情 */ volatile int save_x = x; if(setjmp(buf)) { x = save_x; /* 做一些事情 */ }
。这个方法通过使用非易失性变量,在调用setjmp
前后最大化了性能,但是在调用过程中使用易失性变量确保了安全性。 - Adam Rosenfield