5

我有这段代码,

#include <iostream>

void foo(int *a)
{
    std::cout<<*a<<std::endl;
}

int main()
{
    int i;
    foo(&i);
}

很明显,正在使用未初始化的变量。

我已经尝试过/RTCu并且依赖于错误 C4700,但是对于上面的代码,编译器没有将其标记为错误。

我还尝试运行代码分析,它报告为代码片段没有问题。

那么在我们的源代码中确定未初始化变量的可靠方法是什么?

我知道valgrind在这里做了很棒的工作,但它不是我的选择,因为我有很多对 Windows API 和 MFC 的调用。

4

2 回答 2

1

编译器没有可靠的方法来确定所有未初始化变量的情况。Valgrind(和其他类似的工具)不是编译器,而是动态分析工具,就像上面用户gx所说的那样。还有一些静态分析工具可以检测许多使用单元化变量的情况。但通常编译器与那些专用工具不匹配。

于 2013-08-31T00:00:55.097 回答
1

关于静态分析部分:从 VS2013 开始,如果您可以访问另一个静态分析工具,我不会依赖默认分析器来捕获太多(尽管使用 VS 来捕获其他人可能错过的东西很好)。尽管这里可能不是这种情况,但请注意,静态分析器可能会忽略他们在许多地方看到的模式或已被其他开发人员覆盖的模式作为可接受的规范。不过,如果 Coverity 没有报告这种情况,我会感到惊讶(抱歉,没有安装 ATM 进行测试)。如果它确实忽略了它,一个解释可能是它被认为是一个可能的共享内存地址。

于 2014-12-20T15:00:24.700 回答