不久前,明威-w64的setjmp/longjmp被认为是坏的(http://www.agardner.me/golang/windows/cgo/64-bit/setjmp/longjmp/2016/02/29/go-windows-setjmp-x86.html)。
我们有一个遗留代码,我们曾经在32位Linux和32位Windows上运行,它(仍然)工作得很好。64位Linux版本也可以正常工作,但是64位Windows版本在第一个longjmp返回到setjmp位置后会崩溃。
我在msvcrt的某个地方找到了segfault!_setjmpex,msvcrt!特伦温德克斯。
我已经研究过代码,最初在代码中没有发现任何违反C(99/11)标准为setjmp/longjmp定义的规则的行为。上面描述的解决方法(“使用gcc内置函数”)对我也不起作用。
我很难创建最小的可复制示例。榜样起作用。没有完整的代码。当然,我可以开始从完整的源代码中删除功能,但这不是一个简单的任务。
所以,这里的问题是,mingw-w64中的setjmp/longjmp是否已知(仍然)被破坏?
最佳答案
是的,看起来setjmp/longjmp仍然会因使用x86_-w64-mingw32编译器编译的某些代码而崩溃。它适用于更简单的测试用例,我试图重现一个问题。因此,如果您遇到这个longjmp/setjmp问题,请尝试使用“uu-builtin-setjmp”和“uu-builtin-longjmp”(如here所述)。
我的错误是重新定义了longjmp/setjmp宏,所以我可以通过简单的define来选择要使用的版本,但是没有在任何地方都这样做。这导致编译后的程序同时使用不兼容的内置版本和库版本。
关于c - x86_64-w64-mingw32中的setjmp/longjmp,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53709069/