我一直在尝试查找代码中的间歇性崩溃错误(使用setjmp),并将其范围缩小到:使用/O2进行编译时显示,使用/O2/Oy-消失,即仅使用omit出现框架指针。

http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建议setjmp需要帧指针。因此:

  • 似乎当使用/O2编译使用setjmp的程序时,Visual C++会静默生成导致间歇性堆栈损坏的代码。这是真的,还是我错过了什么?
  • 在我看来,只有调用setjmp的函数才需要使用帧指针进行编译,而程序的其余部分(甚至是调用longjmp的函数)也应该可以省略帧指针。这是真的?

  • 编辑:我将其范围缩小了一些。

    在正在调用setjmp的函数上启用帧指针没有什么区别,但这是因为编译器已经按照预期执行了此操作,显然注意到它需要完成并自动执行。

    确实有所作为的是在main上启用了帧指针。这并不像听起来那样奇怪,因为坠机事件是从main处返回而来的。现在,我想起来了,我可以在google快速搜索setjmp用法时找到所有示例,都可以在main中完成。可能是Microsoft编译器团队仅以这种方式进行了测试。

    那是使用它的惯用方式,也许最好的解决方法是对我来说,是将setjmp-using函数内联到main中。

    最佳答案

    好的,我已经发布了一个包含独立测试用例的错误报告,因此希望有一个修复程序正在发布:http://connect.microsoft.com/VisualStudio/feedback/details/666704/visual-c-generates-incorrect-code-with-omit-frame-pointer-and-setjmp

    同时,解决方法是不使用忽略帧指针,或者将调用setjmp的代码放在main中,或者将调用longjmp的函数与对setjmp的调用放在同一源文件中。

    关于c - setjmp和省略帧指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5887552/

    10-11 15:31