Parasoft C++testを使用して、コードを静的に分析します。次のようなコードで問題が発生しています。
void foo(int* x) {
try {
bar();
} catch(...) {
delete x;
throw;
}
*x;
}
*x;
次の行で警告します。
解放されたメモリは、その後いかなる状況でもアクセスされるべきではありません
catch(...)
どういうわけか、制御フローはブロックに渡され、 を削除しx
、 を通り過ぎて、 に到達できると結論付けられthrow;
ました*x;
。他にもいくつか試しthrow std::exception("");
てみましたが、同じ結果になりました。Parasoft は確かに例外を認識しており、制御フローに組み込みます。これは、例外チェックを伴うテストが他にも多数あるためです。この場合、混乱しているだけですか、それとも、このプログラムの実行で と の両方をヒットする方法が実際にdelete x;
あり*x;
ますか?