我有这段代码,
#include <iostream>
void foo(int *a)
{
std::cout<<*a<<std::endl;
}
int main()
{
int i;
foo(&i);
}
很明显,正在使用未初始化的变量。
我已尝试/RTCu并依赖error C4700,但对于上述代码,编译器并未将此标记为错误。
我也尝试过运行代码分析,将其报告为代码片段没有问题。
那么在源代码中确定未初始化变量的可靠方法是什么?
我知道valgrind
在这里做了一个很棒的工作,但它不是我的选择,因为我有很多调用Windows API和MFC。
答案 0 :(得分:1)
编译器没有可靠的方法来确定所有未初始化变量的情况。 Valgrind(以及其他类似的工具)不是编译器,而是动态分析工具,如上面的用户 gx 。还有静态分析工具可以检测使用单元化变量的许多情况。但是通常编译器与那些专用工具不匹配。
答案 1 :(得分:1)
关于静态分析部分:从VS2013开始,如果您可以访问另一个静态分析工具,我不会依赖默认分析器来捕获太多(尽管使用VS来捕获别人可能错过的内容是好的) 。虽然这可能不是这种情况,但请注意静态分析器可能会忽略他们在许多地方看到的模式,或者被其他开发人员视为可接受的标准的模式。如果Coverity没有报告此案,我会感到惊讶(抱歉,没有安装ATM进行测试)。如果确实忽略了它,可能会解释它被认为是可能的共享内存地址。