x86_64-w64-mingw32中的setjmp / longjmp

时间:2018-12-10 15:47:02

标签: c windows mingw-w64

不久前,已知mingw-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版本也可以正常工作,但是在第一个longjmp返回setjmp位置后,64位Windows版本会崩溃。

我在msvcrt!_setjmpex,msvcrt!RtlUnwindEx中出现段错误。

我已经研究了代码,最初我没有注意到我们的代码中C(99/11)标准为setjmp / longjmp定义的任何规则的违反。上述解决方法(“使用gcc内置函数”)对我也不起作用。

创建最小的可重现示例时遇到麻烦。示例作品。没有完整的代码。当然,我可以开始从完整的源代码中删除功能,但这不是一个简单的任务。

所以,这里的问题基本上是,已知(仍然)被破坏的mingw-w64中的setjmp / longjmp吗?

1 个答案:

答案 0 :(得分:2)

是的,对于使用x86_64-w64-mingw32编译器编译的某些代码,setjmp / longjmp仍然无法正常工作。它适用于更简单的测试用例,我尝试重现一个问题。因此,如果遇到longjmp / setjmp问题,请改用__builtin_setjmp和__builtin_longjmp(如here所述)。

我的错误是重新定义了longjmp / setjmp宏,因此我可以通过简单的define选择要使用的版本,但是却到处都找不到。这导致编译后的程序同时使用内置版本和库版本,这两者不兼容。