setjmp / longjmp在发布中的不同行为&调试

时间:2018-05-17 00:53:25

标签: c++ c

这个问题来自 SetJmp/LongJmp: Why is this throwing a segfault?

当我使用调试模式时,运行它确实崩溃的代码。 但如果我使用release,它将输出如下:

1 setjmping a_buf
2 calling b                // loop start
3 entering b_helper
4 longjmping to a_buf
5 longjmping to b_buf
6 returning from b_helper  // loop
2 calling b
3 entering b_helper
4 longjmping to a_buf
5 longjmping to b_buf
6 returning from b_helper
...

根据我的理解,longjmp可以被视为return,因此b_helper的堆栈内存将被删除,访问将变为非法。使程序崩溃变得合理。 但是为什么它在release中给出了不同的行为?看起来return的行为与longjmp相似。 所以释放的结果是正确的,我的理解是错误的。

Mingw:5.3

2 个答案:

答案 0 :(得分:3)

相关代码会导致undefined behaviour。该程序不正确,没有预期的行为。您不应期望或对任何特定输出或其他行为感到惊讶。

答案 1 :(得分:0)

您使用哪种编译器?如果使用g ++编译器,即编程语言是C ++,函数b_helper将内联到函数b中,函数b将内联到函数a中。启用优化的发布模式。在这种情况下,不再需要调用setjmp并返回。