实际上,我真正的问题是:以下代码中的指示行是否有任何问题(“导致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以证明他们的purify软件存在问题,所以我是由S.O.运行的。社区第一。是的,我故意在第二行泄漏内存,是的,我知道当抛出异常时,指针“泄露”是单元化的。
上面的代码在使用g ++编译时通常在purify之外运行,但在purify内部运行时会导致核心转储。我是否在上面的代码中犯了一个新手错误(使SIGABRT成为我的错),还是我可以指责IBM / Rational Purify?
编辑:(澄清)
在没有purify的命令行上运行,上面的完整程序打印:
Test succeeded!
在净化内部运行,净化报告:
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行结束为我指示的行。
答案 0 :(得分:1)
除了myFunc中缺少的return语句,我在上面的代码中没有看到任何错误。然而,在将其归咎于其他人的代码(特别是广泛使用的代码)之前,我会仔细检查在此之前没有发生任何不好的事情(因为你知道如果召唤UB守护进程前一百万个执行指令可能仍然有可能只有现在才会有可见效果)。
只有在仅使用main调用test_non_happy_myFunc
编译所显示的代码并且没有像自定义全局分配器这样的花哨的东西仍然显示问题时,我才会将搜索移动到您的工具(即纯度,编译器等)在100%肯定之前,我不会停止问题。