为啥 cppcheck 工具找不到未初始化的变量?
Posted
技术标签:
【中文标题】为啥 cppcheck 工具找不到未初始化的变量?【英文标题】:Why cppcheck tool does not find uninitialized variable?为什么 cppcheck 工具找不到未初始化的变量? 【发布时间】:2015-05-02 19:52:34 【问题描述】:我运行 commad (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
//...
【问题讨论】:
m_nValue
实际上是根据当前标准默认初始化。相关:***.com/questions/9299101/…
使用clang --analyze
会得到更好的结果。
@πάνταῥεῖ:默认初始化对int
s 有什么作用?没错……没什么。
【参考方案1】:
有关信息.. 如果您使用 --enable=warning,cppcheck 会写出这样的消息:
[test.cpp:13]:(警告)成员变量 'Foo::m_nValue' 未在构造函数中初始化。
【讨论】:
【参考方案2】:因为这玩意儿很难,而cppcheck又不是全能神创造宇宙万物的主宰?
有些问题在一般情况下实际上是无法检测到的;我不确定这是否是其中之一。但是如果 cppcheck 一次只检查一个翻译单元,那么,如果Foo::Foo
是在其他翻译单元中定义的呢?
【讨论】:
【参考方案3】:静态分析(这是 cppcheck 所做的)不是一门精确的科学,也不可能是。赖斯定理指出:“程序行为的任何重要属性都是不可判定的”(参见 Tom Stuart 的“理解计算:从简单机器到不可能的程序”)。
另外,请查看 Matt Might 的 What is static analysis。在这两种情况下,您都应该明白,静态分析不仅很难而且无法确定。
因此,ccpcheck 未能报告未初始化变量的潜在用途的原因有很多。
在这种情况下,您可能会得到更好的结果,在这种情况下,将 valgrind 与 memcheck 工具一起使用,该工具将报告潜在未初始化变量的使用情况,但作为一个动态工具(相对于静态工具),它可能提供更好的结果(或至少不同的)结果。
希望对您有所帮助, T.
【讨论】:
不要认为赖斯定理在这里适用。该程序甚至没有输入! Rice 定理讨论了程序的非平凡语义属性(参见en.wikipedia.org/wiki/Rice%27s_theorem),而讨论中以暂停所有输入为例,语义属性不限于输入。以上是关于为啥 cppcheck 工具找不到未初始化的变量?的主要内容,如果未能解决你的问题,请参考以下文章