哪些工具可以报告未初始化变量的此类使用
What tools can report such uses of uninitialized variables?
考虑以下程序
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上运行)?
扫描提供的示例
$ 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
)。
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持