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=address以及g++ -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 回答
0

你很亲密-fsanitize=address。内存消毒剂应该做你想做的事(-fsanitize=memory)。

于 2019-01-28T21:35:24.053 回答
0

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

于 2015-12-27T08:44:51.420 回答