gpt4 book ai didi

c - setjmp 并省略帧指针

转载 作者:太空狗 更新时间:2023-10-29 15:06:25 26 4
gpt4 key购买 nike

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

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

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

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

编辑:我进一步缩小了范围。

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

真正有所不同的是在 main 上启用了帧指针。这并不像听起来那么奇怪,因为崩溃是在从 main 返回时出现的。既然我想到了,我可以在 setjmp 用法的快速谷歌搜索中找到的所有示例,都在 main 中执行。也许碰巧微软编译器团队只是这样测试的。

这是使用它的惯用方式,也许最好的解决方法是将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com