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

  • 本文关键字:调试 longjmp setjmp c++ c
  • 更新时间 :
  • 英文 :


这个问题来自 SetJmp/LongJmp:为什么会抛出一个段错误?

当我使用调试模式运行代码时,它确实按预期崩溃了。 但是如果我使用 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. 所以释放的结果应该是对的,我的理解是错误的。

明夫:5.3

有问题的代码会导致未定义的行为。 程序不正确,没有预期的行为。 您不应该期望或惊讶于任何特定的输出或其他行为。

你使用哪个编译器?如果使用 g++ 编译器,即编程语言C++,函数b_helper内联到函数b中,函数b内联到函数a中,在启用优化的发布模式下。在这种情况下,不再有呼叫setjmp和返回的路由。

最新更新