7

C ++プロジェクトの静的コード分析用にCppcheckツールをインストールしましたが、パフォーマンスが低いと感じました。たとえば、Cppcheckが次のコードで配列の範囲外エラーを見つけられない理由を誰かに教えてもらえますか?

void f(int c) { 
    char *p = new char[10]; 
    p[c] = 42; 
} 

void g() { 
    f(100); 
} 

このコードをCppcheckを使用して簡単にチェックできるオンラインデモがあります。4行目でのメモリリークだけで、バッファオーバーフローの兆候は見られません。

4

3 に答える 3

10

私は Cppcheck 開発者です。

Cppcheck がそれを検出できないのは、設計によるものではありません。

現在、Cppcheck は、すべての関数呼び出しから与えられたすべてのパラメーターを使用して関数を評価するわけではありません。これについてはチケットがあり、いつか修正されることを願っています。それはいいだろう。

Cppcheck を使用すると、すべてのバグが検出されるとは考えないでください。Cppcheck はおそらくほとんどのバグを検出できません。私の謙虚な意見では、ソフトウェアのすべてのバグを検出する方法はありません。Cppcheck は、他の方法では検出できないバグの一部を検出するためだけに使用してください。バグの数をいくらか減らします。

あまりがっかりせず、引き続き Cppcheck をご利用いただければ幸いです。

于 2012-08-15T19:40:32.650 に答える
9

現在サポートされていないためです。

これは実際には、コンパイラにとって明らかなエラーではありません。何かのようなもの

char c[5];
for (int i=0; i<10; ++i)
    c[i] = 0;

すべてが同じコード内にあるため、より明白です。

何かのようなもの

#define f(c) { \
    char *p = new char[10];  \
    p[c] = 42; \
}

void g() { 
    f(100); 
} 

cppcheck とコンパイラは、実際のチェックの前にすべてのマクロをその場で展開するため、より明白です。

ただし、cppcheck とコンパイラはその関数内のコード全体を必要とし、パラメーターに関してそれを評価するため、投稿されたコードは簡単ではありません。もちろん、機能が見えている場合は可能ですが (翻訳単位をまたがるとかなり難しくなり、不可能になることもあります)、現在 cppcheck にはその機能がありません。

于 2012-08-15T09:37:22.700 に答える
4

Cppcheck 1.70 dev の最新バージョンでは、このバグを検出できます。

$ cppcheck test.cpp 
Checking test.cpp...
[test.cpp:3]: (error) Array 'p[10]' accessed at index 100, which is out of bounds.
[test.cpp:4]: (error) Memory leak: p
于 2015-06-19T06:22:40.753 に答える