5

Iは、コードのこの部分を持っているに初期化されていない変数が使用されていることは明らかであるは、VC++

#include <iostream> 

void foo(int *a) 
{ 
    std::cout<<*a<<std::endl; 
} 

int main() 
{ 
    int i; 
    foo(&i); 
} 

を未初期化変数を決定します。

私は/RTCuと同様にerror C4700に頼ってみましたが、上記のコードではコンパイラはエラーとしてこれを報告していません。

私もコード分析を実行しようとしましたが、問題がないようにコードフラグメントとして報告しました。

ソースコードの初期化されていない変数を確認する信頼できる方法は何ですか?

私が知っているのはvalgrindですが、ここで素晴らしい仕事をしていますが、Windows APIとMFCをたくさん呼び出しているので、私にとってはオプションではありません。

+2

コンパイラではなく「明白」です。ポインタインダイレクションによって変数を(非インラインの)関数に渡します(関数をインライン化し、インライン化を有効にするとgccで警告が発生します)。今、答えではなく、最初に初期化されていない変数を定義するのはなぜですか?問題を避ける簡単な方法は、変数を定義する際に常に初期化することです(初期化するまで定義しないことを意味します)。 –

+0

@gx_:初期化されていない変数を定義するのではなく、潜在的な問題のコードベースを持つコードベースをサニタイズしています。また、私はそれが "あなたには明らかですが、コンパイラにはない"と反対します。私のポイントを証明するために、上記のコードベースでValgrindを実行し、その応答を決定する必要があります。 – Abhijit

+0

返事をありがとう(私は "私のコードではない"と疑っていたが、それは正確ではない)。しかし、私はそれが明らかにコンパイラにとって明白ではないことを認めています。もしそれがあればそれを警告するでしょう( 'foo'をインライン化し、コンパイラには明らかになります)。また、valgrindはコンパイラでも静的解析ツールでも_dynamic_チェッカーではありません。 –

答えて

1

初期化されていない変数のすべてのケースをコンパイラが判断する信頼できる方法はありません。 Valgrind(およびそのようなツール)はコンパイラではありませんが、ユーザgxのような動的解析ツールは上記のとおりです。単位化された変数の使用の多くのケースを検出できる静的分析ツールもあります。しかし、一般に、コンパイラはこれらの特殊なツールにはマッチしません。

1

VS2013では、別の静的解析ツールにアクセスすると、デフォルトのアナライザにはあまりにも多くのキャッチが必要です(VSを使用して、 )。ここではそうではありませんが、スタティックアナライザは、多くの場所で見られるパターンや他の開発者によって受け入れられるノルムとして上書きされたパターンを無視する場合があります。私はCoverityがこのケースを報告しなかった場合には驚きます(申し訳ありませんが、テストのためにATMをインストールしていないでください)。それを無視した場合、共有メモリアドレスと考えられている可能性があります。

+0

Coverity(少なくとも私の設定では)これをキャッチしませんでした。明らかに、分析の機能深度は非常に制限されています。初期化されていない変数の他のケースでは、コンパイルプロセスが通常それをキャッチしているので、おそらく彼らはそれに頼っています。興味深いケースは、推測していないでしょう。 – dwn

関連する問題