2011-02-02 7 views
1

は実は、私の本当の問題は、次のコード(「SIGABRTが発生する」)で示された行に何か問題があります:Purifyでg ++で例外をスローして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のなしのコマンドラインで実行、上記の完全なプログラムを印刷:

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] 
:Purifyの内部

Test succeeded! 

ランは、レポートを浄化

前提条件を満たしていれば、9行目が私が指定した行になることに注意してください。

+0

どのような行が失敗したかをどのように判断したか教えてください。また、私は古くからPurifyを使用していないので、どのようにしてPurify内でコンパイルして実行しますか?上記の最小限のバージョン(例えば、 'test_non_happy_myFunc'を呼び出す' main'関数)を作成してテストしましたか? –

+0

コメントありがとう - 私は上記の説明を追加しました。はい、私は実際に上記のプログラムを正確に実行することができます(iostream、stdexcept、およびstring.hのincludeも含みます)。外部ライブラリや他のコードをリンクせず、記述された結果を取得します。あなたが見たもの、それがあなたの手に入れたものだ。 –

+0

私は言及を忘れた。 Purifyは、コマンド行またはMakefileのlinkコマンドに "purify"を付加することで実行されます。リンク中にコードにフックを挿入します。あなたのアプリケーションを実行すると、デフォルトでは、GUIウィンドウが表示され、実行中のコードに潜在的なメモリの問題のリストが蓄積されます(GUIを起動する代わりにstdoutまたはファイルにこれをダンプするオプションがあると思います) )。 –

答えて

1

myFuncのreturn文がないことを除いて、私は上記のコードに間違いはありません。しかし、他者(特に広く使われているコード)によるコードに責任を負う前に、私はこの前に何も悪いことがないことを二重にチェックしたいと思います(UBデーモンを呼び出す何かが、目に見える効果)。

メインコードがちょうどtest_non_happy_myFuncであり、カスタムグローバルアロケータのような面白いものがない場合にのみ、私はあなたのツール(純度、コンパイラなど)に検索を移動します100%肯定的になる前に止めておいて問題がある。

+0

それは実際に私がやったことです。test_non_happy_myFunc()を呼び出すmain()という単純なテストケースがあるまで、クラッシュの原因を絞り込んだ。上記のとおりです。私は元の投稿に説明を追加します。 –

関連する問題