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

6

我们有如下代码:

#include <iostream>
#include <simd/simd.h>
class X {
public:
    X(int a) : x{a} {} // <-- 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没有被初始化。

3
GCC发出警告:演示链接 - Jarod42
3
当禁用优化时,GCC不会显示警告:https://wandbox.org/permlink/M8uPXGSiflYSCC7J。 - Daniel Langr
添加了优化O1,比测试过的O3效果都要差...没有任何帮助。clang认为这是可以的。 - Juraj Antas
2
@Galik 这个问题已经在这里讨论过了,例如:GCC - no warning about an uninitialized array with -O0 - Daniel Langr
建议的答案似乎对simd类型无效,而且clang分析正确地将x.y标记为未初始化。 - Juraj Antas
显示剩余2条评论
1个回答

5

我想你是对的:正确答案是:clang没有未初始化变量的警告。这很糟糕,我因此受过很多伤害,我相信我不是唯一一个.. clang-tidy是一个容易被愚弄并经常报告错误的检查工具。 - Juraj Antas
为了更清晰,类和结构体内的未初始化变量不会产生警告。但是它会警告您使用本地未初始化变量。 - Juraj Antas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接