下面的代码总结了我目前遇到的问题。我当前的执行流程如下,我正在 GCC 4.3 中运行。
jmp_buf a_buf;
jmp_buf b_buf;
void b_helper()
{
printf("entering b_helper");
if(setjmp(b_buf) == 0)
{
printf("longjmping to a_buf");
longjmp(a_buf, 1);
}
printf("returning from b_helper");
return; //segfaults right here
}
void b()
{
b_helper();
}
void a()
{
printf("setjmping a_buf");
if(setjmp(a_buf) == 0)
{
printf("calling b");
b();
}
printf("longjmping to b_buf");
longjmp(b_buf, 1);
}
int main()
{
a();
}
上述执行流程在 b_helper 返回后立即创建了一个段错误。几乎就好像只有 b_helper 堆栈帧有效,并且它下面的堆栈被擦除。
谁能解释为什么会发生这种情况?我猜这是一个 GCC 优化,正在删除未使用的堆栈帧或其他东西。
Thanks.
你只能longjmp()
back up调用堆栈。致电给longjmp(b_buf, 1)
是事情开始出错的地方,因为引用的堆栈帧b_buf
之后不再存在longjmp(a_buf)
.
从文档中longjmp
:
在调用 setjmp() 例程的例程返回后,不能再调用 longjmp() 例程。
这包括通过longjmp()
脱离函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)