以下代码:
- 使用 gcc 版本 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5/32bits) 编译时运行良好
- 使用 MSVC10 (Win7/32bits) 编译时运行良好
- 使用 gcc 版本 4.5.2 运行时崩溃(Win7/32 位上的 MinGW)
主.cpp:
# include <iostream>
# include <csetjmp>
# include <stdexcept>
using namespace std ;
void do_work(jmp_buf context)
{
try
{
throw runtime_error("Ouch !") ;
}
catch(exception & e)
{
}
longjmp(context, -1) ; //BP1
}
int main(int, char *[])
{
jmp_buf context ;
try
{
if( setjmp(context) != 0 )
{
throw runtime_error("Oops !") ; //BP2
}
do_work(context) ;
}
catch(exception & e)
{
cout << "Caught an exception saying : " << e.what() << endl ;
}
}
我尝试调试它,但程序的行为很奇怪。有时我可以通过第一个断点 (BP1),然后在 BP2 处崩溃,有时控制永远不会到达 BP1,就像程序陷入无限循环一样。我不能用我的调试技能说更多。
这段代码是我能得到的最少的代码,它展示了 MinGW 4.5 的奇怪行为。我还注意到:
- 如果我用
do_work
它的内容替换函数调用,程序运行良好。 - 如果我删除
try{ ... } catch(...){ }
里面的块do_work
,程序运行正常。 - 优化标志无效(总是崩溃)。
我知道setjmp/longjmp
C++ 代码中的问题,但我不得不使用它来与一些遗留 C 代码交互。
我的问题 :
- 这是错误/错误/错误的代码吗?还是 MinGW 4.5 对代码处理不当?(责备该工具是苛刻和冒昧的,但我怀疑其中的一些设置)。
感谢您的任何建议。
如有必要,请重新标记。