为什么 cppcheck 工具找不到未初始化的变量?

Why cppcheck tool does not find uninitialized variable?

我运行 命令 (Ubuntu 12.04)

cppcheck test.cpp

我期待来自 cppcheck 工具的未初始化变量警告。 为什么cppcheck工具不在命令行打印出来?

示例 cpp 代码:

#include <iostream>

class Foo
{
private:
    int m_nValue;

public:
    Foo();
    int GetValue() { return m_nValue; }
};

Foo::Foo()
{
    // Oops, we forget to initialize m_nValue
}

int main()
{
    Foo cFoo;
    if (cFoo.GetValue() > 0)
    {//...
    }
    else
    {//...
    }
}

因为这东西很难,而且cppcheck不是全能的造物主,全知全能的神吗?

有些问题在一般情况下实际上是无法检测的;我不确定这是否是其中之一。但是,如果 cppcheck 一次只检查一个翻译单元,那么,如果 Foo::Foo 是在其他翻译单元中定义的呢?

静态分析(cppcheck 就是这样做的)不是一门精确的科学,也不可能是。 Rice 的定理指出:"any nontrivial property of program behavior is undecidable"(参见 Tom Stuart 的 "Understanding Computation:From Simple Machines to Impossible Programs")。

此外,请查看 Matt Might 的 What is static analysis。在这两种情况下,您应该明白,静态分析不仅困难而且不可判定。

因此,ccpcheck 无法报告未初始化变量的潜在使用的原因有很多。

您可能会得到更好的结果,在这种情况下,将 valgrind 与工具 memcheck 结合使用,该工具将报告潜在未初始化变量的使用情况,但作为动态工具(相对于静态工具)它 可能 给出更好(或至少不同)的结果。

希望这对您有所帮助, T.

有关信息.. 如果您使用 --enable=warning,cppcheck 会写入这样的消息:

[test.cpp:13]:(警告)成员变量'Foo::m_nValue'未在构造函数中初始化。