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;ますか?