C++ 对类中未初始化的变量启用警告

Posted

技术标签:

【中文标题】C++ 对类中未初始化的变量启用警告【英文标题】:C++ enable warning for uninitialized variables in classes 【发布时间】:2019-06-05 08:13:46 【问题描述】:

让我们有这个代码:

#include <iostream>
#include <simd/simd.h>
class X 
public:
    X(int a) : xa  // <-- only x is initialized, y is not

    int x;
    int y;
    simd_double3 d;
;

int main(int argc, const char * argv[]) 
    X x(1);
    X* xx = new X(2);
    std::cout<<x.x<<" "<<x.y<<" "<<x.d.x; // <-- y and x.d are used, but not initialized
    std::cout<<xx->x<<" "<<xx->y<<"END\n";
    return 0;

我想发出警告,指出 X 中的 y 未初始化。 -Wall, -Wmissing-field-initializers 似乎什么都不做。它编译时没有警告。 此示例代码产生以下输出: 1 0 6.95323e-310 所以即使 y 被初始化为 0(不是,因为 clang 分析将其标记为未初始化),显然 simd_double3 没有初始化为 0。

还有 clang 分析将 x.y 标记为未初始化。 (第一个函数调用参数是一个未初始化的值

另外,在释放模式下在堆上创建 X 时,x.y 的内容是垃圾。第二行打印:2 -1094795586,y 显然没有初始化。

【问题讨论】:

gcc 发出警告:Demo. GCC 在禁用优化时不显示警告:wandbox.org/permlink/M8uPXGSiflYSCC7J. 添加优化 O1 比测试 O3 ..没有任何帮助。叮当没事。 静态分析发现了它,但我希望在正常编译过程中得到简单的警告。 @Galik 已经讨论过了,例如:GCC - no warning about an uninitialized array with -O0。 【参考方案1】:

我使用 clang 8(最新版本)命令行检查所有警告:clang -O2 -Wall -Wextra -Weverything 检查:https://godbolt.org/z/kKp-N5 Clang 对类和结构中的未初始化变量没有任何警告。但是使用 clang-tidy 和 check cppcoreguidelines-pro-type-member-init 可能对你有帮助。https://releases.llvm.org/8.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.html

【讨论】:

我猜你是对的:正确答案是:clang 没有未初始化变量的警告。这太糟糕了,我被这样多次烧伤,我相信我并不孤单.. clang-tidy 是一种很容易被愚弄并且经常报告误报的检查。 更清楚的是,对于类和结构中的未初始化变量没有警告。它确实会警告您使用本地未初始化的变量。

以上是关于C++ 对类中未初始化的变量启用警告的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化对类内变量的静态引用,以便在嵌套类中使用

如何抑制有关 C++ 中未使用变量的警告?

C++ 类中的两个不同变量初始化。有啥不同?

C:警告:“withdrawal_amt”可能在此函数中未初始化使用

C++中关于类对象的初始化问题

C++ - 在派生类中静态初始化基类受保护的成员变量