1

次のプログラムを検討してください

struct X
{
    int d;
    X(){} // forget to initialize d
};

int main()
{
    X x;
    volatile int y=x.d; // read uninitialized d
    (void)y; // (kill useless warning)
}

明らかに、未定義の動作があり、一般的にデバッグ ツールを使用してキャッチできるようにしたいと考えています。cppcheck (オンラインデモを使用) と 、およびg++ -fsanitize=addressg++ -fsanitize=undefined試しましvalgrindた。x.dしかし、これらのツールは、読み取り時に初期化されていないことを報告しません。

この種の未定義の動作 (できれば Linux で実行) をキャッチするには、どのツールを使用できますか?

4

3 に答える 3

2

提供された例のスキャン

$ more test.cpp 
struct X
{
  int d;
  X(){} // forget to initialize d
};

int main()
{
  X x;
  volatile int y=x.d; // read uninitialized d
  (void)y; // (kill useless warning)
}

最新バージョンの cppcheck (バージョン 1.72 dev) を使用すると、次のようになります。

$ cppcheck --enable=all test.cpp 
 Checking test.cpp...
 [test.cpp:4]: (warning) Member variable 'X::d' is not initialized in the constructor.
于 2016-01-03T20:15:30.743 に答える