実際、私の本当の質問は、次のコードの指定された行に何か問題がありますか (「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();
}
浄化ソフトウェアに問題があることを証明するために IBM/Rational に送信する最小限のテスト ケースを作成しようとしているので、最初に SO コミュニティで実行しています。はい、2行目で意図的にメモリをリークしています。例外がスローされたときに「リークした」ポインタが初期化されることはわかっています。
上記のコードは、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行目は私が示した行になることに注意してください。