gcc 编译器有时不给出 -Wuninitialized 警告

问题描述 投票:0回答:1

我正在运行下面的简单程序,其中我没有初始化变量 x2,然后尝试在 main() 函数中使用它。我期待编译器发出 Wuninitialized 警告,但没有得到它。

#include <iostream>

using namespace std;

struct Obj
{
    int x1;
    int x2;

    Obj() : x1(0) {}
};

int main()
{
    Obj obj;
    cout << obj.x1 << endl;
    cout << obj.x2 << endl;
    return 0;
}

编译正常,没有任何警告 - g++ --std=c++17 -Wall abc.cpp

如果我不初始化 x1 和 x2,我会收到预期的警告。

#include <iostream>

using namespace std;

struct Obj
{
    int x1;
    int x2;

//    Obj() : x1(0) {}
};

int main()
{
    Obj obj;
    cout << obj.x1 << endl;
    cout << obj.x2 << endl;
    return 0;
}

现在我确实收到警告了。

g++ --std=c++17 -Wall abc.cpp
abc.cpp: In function ‘int main()’:
abc.cpp:16:17: warning: ‘obj.Obj::x1’ is used uninitialized in this function [-Wuninitialized]
   16 |     cout << obj.x1 << endl;
      |                 ^~
abc.cpp:17:17: warning: ‘obj.Obj::x2’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   17 |     cout << obj.x2 << endl;
      |                 ^~

有人可以解释这种行为吗?

g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.

我期待在这两种情况下都会出现 Wuninitialized 警告。

c++ c++17 g++
1个回答
0
投票

看起来编译器无论如何都会在调试模式下将该字段初始化为零,这可能就是您没有收到任何警告的原因。您确实会收到

-O3
的警告:https://godbolt.org/z/P138oEEbE

© www.soinside.com 2019 - 2024. All rights reserved.