哪些工具可以报告未初始化变量的此类使用

What tools can report such uses of uninitialized variables?

本文关键字:变量 初始化 工具 报告      更新时间:2023-10-16

考虑以下程序

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=address以及g++ -fsanitize=undefinedvalgrind。但这些工具并没有告诉我x.d在读取时未初始化。

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

扫描提供的示例

$ 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.

我读了很多关于PVS Studio工具的文章。它应该注意到这样的警告。不幸的是,它不是免费的,但至少你可以尝试一个演示来检查它是否对你足够好。

您已接近-fsanitize=address。内存清理程序应该可以执行您想要的操作(-fsanitize=memory)。