setjmp/longjmp 在 x86_64-w64-mingw32
setjmp/longjmp in x86_64-w64-mingw32
不久前 setjmp/longjmp 在 mingw-w64 中被破坏 (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!_setjmpex、msvcrt!RtlUnwindEx 中的某处出现段错误。
我查看了代码,最初我没有注意到我们的代码中有任何违反 C (99/11) 标准为 setjmp/longjmp 定义的规则的行为。上述解决方法 ("use gcc builtins") 对我也不起作用。
我无法创建最小的可重现示例。示例有效。没有完整代码。当然,我可以开始从完整的源代码中删除功能,但这不是一项简单的任务。
所以,这里的问题基本上是,mingw-w64 中的 setjmp/longjmp 是否(仍然)被破坏?
是的,对于使用 x86_64-w64-mingw32 编译器编译的某些代码,看起来 setjmp/longjmp 仍然存在问题。它适用于更简单的测试用例,我试图重现一个问题。因此,如果您遇到此 longjmp/setjmp 问题,请尝试使用 __builtin_setjmp 和 __builtin_longjmp(如 here 所述)。
我的错误是重新定义了 longjmp/setjmp 宏,所以我可以通过简单的定义来选择要使用的版本,但在任何地方都没有这样做。这导致编译后的程序同时使用不兼容的内置版本和库版本。
不久前 setjmp/longjmp 在 mingw-w64 中被破坏 (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!_setjmpex、msvcrt!RtlUnwindEx 中的某处出现段错误。
我查看了代码,最初我没有注意到我们的代码中有任何违反 C (99/11) 标准为 setjmp/longjmp 定义的规则的行为。上述解决方法 ("use gcc builtins") 对我也不起作用。
我无法创建最小的可重现示例。示例有效。没有完整代码。当然,我可以开始从完整的源代码中删除功能,但这不是一项简单的任务。
所以,这里的问题基本上是,mingw-w64 中的 setjmp/longjmp 是否(仍然)被破坏?
是的,对于使用 x86_64-w64-mingw32 编译器编译的某些代码,看起来 setjmp/longjmp 仍然存在问题。它适用于更简单的测试用例,我试图重现一个问题。因此,如果您遇到此 longjmp/setjmp 问题,请尝试使用 __builtin_setjmp 和 __builtin_longjmp(如 here 所述)。
我的错误是重新定义了 longjmp/setjmp 宏,所以我可以通过简单的定义来选择要使用的版本,但在任何地方都没有这样做。这导致编译后的程序同时使用不兼容的内置版本和库版本。