为啥 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会得到更好的结果。 @πάνταῥεῖ:默认初始化对ints 有什么作用?没错……没什么。 【参考方案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 工具找不到未初始化的变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 cppcheck 忽略某些错误?

cppcheck 看不到一些有错误的子文件夹:找不到或打开任何给定的路径

如何在 gcc 编译器中构建 cppcheck 工具?

CppCheck:变量“bla”未赋值

cppcheck 错误与我看到的不符

为啥致命错误:未捕获的错误:找不到类“Illuminate\Foundation\Application”