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をたくさん呼び出しているので、私にとってはオプションではありません。
コンパイラではなく「明白」です。ポインタインダイレクションによって変数を(非インラインの)関数に渡します(関数をインライン化し、インライン化を有効にするとgccで警告が発生します)。今、答えではなく、最初に初期化されていない変数を定義するのはなぜですか?問題を避ける簡単な方法は、変数を定義する際に常に初期化することです(初期化するまで定義しないことを意味します)。 –
@gx_:初期化されていない変数を定義するのではなく、潜在的な問題のコードベースを持つコードベースをサニタイズしています。また、私はそれが "あなたには明らかですが、コンパイラにはない"と反対します。私のポイントを証明するために、上記のコードベースでValgrindを実行し、その応答を決定する必要があります。 – Abhijit
返事をありがとう(私は "私のコードではない"と疑っていたが、それは正確ではない)。しかし、私はそれが明らかにコンパイラにとって明白ではないことを認めています。もしそれがあればそれを警告するでしょう( 'foo'をインライン化し、コンパイラには明らかになります)。また、valgrindはコンパイラでも静的解析ツールでも_dynamic_チェッカーではありません。 –