哪些工具可以报告未初始化变量的这种用法?

时间:2015-12-27 08:35:14

标签: c++ debugging undefined-behavior sanitizer

考虑以下计划

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(使用他们的online demo)和g++ -fsanitize=address以及g++ -fsanitize=undefinedvalgrind。但是这些工具没有报告我x.d在阅读时未初始化。

我可以使用哪些工具来捕获这些未定义的行为(最好在Linux上运行)?

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

我读了很多关于工具PVS-Studio的内容。它应该抓住这样的警告。不幸的是它不是免费的,但至少你可以尝试一个演示来检查它是否适合你。

答案 2 :(得分:0)

您与-fsanitize=address关系密切。内存清理程序应该执行您想要的操作(-fsanitize=memory)。