1

実際、私の本当の質問は、次のコードの指定された行に何か問題がありますか (「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行目は私が示した行になることに注意してください。

4

1 に答える 1

1

myFunc の return ステートメントが欠落していることを除けば、上記のコードに問題はありません。ただし、他の人によるコード (特に広く使用されているコード) のせいにする前に、この前に悪いことが何も起こらなかったことを再確認します (ご存知のように、100 万回実行された命令の前に何かが UB デーモンを呼び出した可能性がある場合は、今しか存在しない可能性があります)。目に見える効果)。

main を呼び出すだけで、カスタム グローバル アロケータのような手の込んだものを使用せずに、表示されているコードだけをコンパイルしてtest_non_happy_myFuncも問題が発生する場合にのみ、検索をツール (つまり、純度、コンパイラなど) に移動します。問題があることは 100% 肯定的です。

于 2011-02-02T20:34:11.197 に答える