g++ 中抛出异常是否存在已知问题? Purify 导致 SIGABRT?
实际上,我真正的问题是:以下代码中指示的行是否有任何问题(“导致 SIGABRT”):
char* myFunc(char *param) {
char* leaked = new char[80]; // Intentionally leaked
if (param == NULL) throw logic_error("Parameter was null!"); // Causes SIGABRT
strcpy(leaked, param);
// Missing return, but never gets this far, so should be okay.
}
void test_non_happy_myFunc()
{
try {
myFunc(NULL);
} catch (logic_error&) {
cout << "Test succeeded!" << endl;
return;
}
cout << "Test FAILED!" << endl;
}
int main()
{
test_non_happy_myFunc();
}
我正在尝试提出一个最小的测试用例发送给 IBM/Rational 以证明存在问题与他们的净化软件,所以我首先由 SO 社区运行它。是的,我故意在第二行泄漏内存,是的,我知道抛出异常时指针“泄漏”被初始化。
当使用 g++ 编译时,上面的代码在 purify 之外正常运行,但在 purify 内部运行时会导致核心转储。我在上面的代码中是否犯了一个菜鸟错误(使 SIGABRT 成为我的错),或者我可以将矛头指向 IBM/Rational Purify?
编辑:(说明)
在没有 purify 的情况下在命令行上运行,上面的完整程序打印:
Test succeeded!
在 purify 内部运行,purify 报告:
COR: Fatal core dump
This is occurring while in thread 1299:
_p450static [rtlib.o]
abort [libc.so.6]
uw_init_context_1 [unwind-dw2.c:1256]
_Unwind_RaiseException [unwind.inc:88]
__cxa_throw [eh_throw.cc:78]
myFunc(char*) [exception_test.cc:9]
test_non_happy_myFunc() [exception_test.cc:17]
main [exception_test.cc:28]
请注意,在先决条件包含等之后,第 9 行最终成为行 I表明的。
Actually, my real question is: is there anything wrong with the indicated line in the following code ("Causes SIGABRT"):
char* myFunc(char *param) {
char* leaked = new char[80]; // Intentionally leaked
if (param == NULL) throw logic_error("Parameter was null!"); // Causes SIGABRT
strcpy(leaked, param);
// Missing return, but never gets this far, so should be okay.
}
void test_non_happy_myFunc()
{
try {
myFunc(NULL);
} catch (logic_error&) {
cout << "Test succeeded!" << endl;
return;
}
cout << "Test FAILED!" << endl;
}
int main()
{
test_non_happy_myFunc();
}
I'm trying to come up with a minimal test case to send to IBM/Rational to prove that there's an issue with their purify software, so I'm running it by the S.O. community first. Yes, I'm intentionally leaking memory on the 2nd line, and yes, I know the pointer "leaked" is unitialized when the exception is thrown.
The above code runs normally outside of purify when compiled with g++, but causes a core dump when run inside of purify. Did I make a rookie mistake in the above code (making the SIGABRT my fault), or can I point the finger at IBM/Rational Purify?
Edit: (clarifications)
Run on the command line without purify, the above complete program prints:
Test succeeded!
Run inside of purify, purify reports:
COR: Fatal core dump
This is occurring while in thread 1299:
_p450static [rtlib.o]
abort [libc.so.6]
uw_init_context_1 [unwind-dw2.c:1256]
_Unwind_RaiseException [unwind.inc:88]
__cxa_throw [eh_throw.cc:78]
myFunc(char*) [exception_test.cc:9]
test_non_happy_myFunc() [exception_test.cc:17]
main [exception_test.cc:28]
Note that after prerequisite includes and such, line 9 winds up being the line I indicated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
除了 myFunc 中缺少 return 语句之外,我在上面的代码中没有看到任何错误。然而,在将责任归咎于其他人的代码(特别是广泛使用的代码)之前,我会仔细检查在此之前没有发生任何不好的事情(正如你所知,如果一百万个执行指令前调用 UB 守护进程的东西可能仍然有可能,只有现在才会有效果可见)。
仅当仅使用 main 调用
test_non_happy_myFunc
编译显示的代码并且没有自定义全局分配器等花哨的东西仍然显示问题时,我才会将搜索移至您的工具(即纯度、编译器等)在百分百确定问题确实存在之前我不会停止。Except for the missing return statement in myFunc I don't see anything wrong in the above code. Before however putting the blame on code by others (especially widely used code) I'd double check that nothing bad happened BEFORE this (as you know if something summoned UB daemons one million executed instructions ago may still be possible that only now there will be visible effects).
Only if compiling just the shown code with main just calling
test_non_happy_myFunc
and without fancy stuff like custom global allocators still shows the problem then I'd move the search to your tools (i.e. purity, compiler, etc.) and I wouldn't stop before being 100% positive the problem is there.