setjmp并省略帧指针

rwa*_*ace 5 c visual-c++ longjmp setjmp

我一直试图在我的代码中查找间歇性崩溃错误(使用setjmp),并将其缩小为:在使用/ O2进行编译时显示,使用/ O2/Oy-消失,即仅显示省略帧指针.

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

  1. 似乎当使用/ O2编译使用setjmp的程序时,Visual C++会静默生成导致间歇性堆栈损坏的代码.这是真的吗,还是我错过了什么?

  2. 在我看来,只有调用setjmp的函数才需要用帧指针编译,程序的其余部分 - 甚至是调用longjmp的函数 - 应该可以省略帧指针.这是真的?

编辑:我把它缩小了一点.

在调用setjmp的函数上启用帧指针没有任何区别,但那是因为编译器已经这样做了,就像它应该的那样,显然注意到它需要完成,并自动完成.

有什么区别是在主要上启用帧指针.这并不像听起来那么奇怪,因为坠机是从主要的回归中显现出来的.现在,我想到了它,我可以在快速谷歌搜索setjmp使用中找到的所有示例,在main中执行.也许碰巧Microsoft编译器团队只是以这种方式测试它.

这是使用它的惯用方法,也许最好的解决方法是让我将setjmp-using函数内联到main中.

rwa*_*ace 3

好的,我已经发布了带有独立测试用例的错误报告,因此希望修复程序正在酝酿中:http://connect.microsoft.com/VisualStudio/feedback/details/666704/visual-c-generates-带有省略帧指针和 setjmp 的错误代码

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