为什么 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'未在构造函数中初始化。
我运行 命令 (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'未在构造函数中初始化。