考虑以下计划
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=undefined
和valgrind
。但是这些工具没有报告我x.d
在阅读时未初始化。
我可以使用哪些工具来捕获这些未定义的行为(最好在Linux上运行)?
答案 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
)。