c++ - 什么是 gcc Wmaybe-未初始化警告

标签 c++ gcc gcc-warning

我知道 gcc 中有一个未初始化的警告,可以告诉您变量是否未初始化。这对我来说很清楚。但我想知道什么是“Maybe-Initialized”警告?

gcc 不确定这是否已初始化。或者考虑一下,代码正确初始化并且 gcc 认为“可能”它没有初始化。如果编译器不确定为什么我应该有这个警告?

现在我可以使用 -Wno-maybe-uninitialized 禁用警告或在代码中进行修复。

但我的问题是这意味着什么?为什么 gcc 认为它可能未初始化。 gcc 确定变量已初始化,因为我没有得到 -Wuninitialized

我使用的是 GCC 4.8 Fedora 21 x86_64。

另外,如果有人可以展示如何触发此警告,我将不胜感激。

最佳答案

有些情况下编译器可以清楚地检测到某些东西没有被初始化:

void func1(int x);  

void func()
{
    int x;
    func1(x);   // x is definitely not initialized when calling func1;
}

但在某些情况下,变量CAN已经被初始化:

void func(int y)
{
   int x;
   if (y == 1)
       x = 7;
   else if (y == 2)
       x = 14;
   // If we get here, is x initialized or not?
   func1(x);
}

现在,如果你我都确定 yALWAYS onw 或 two,那么上面的代码就没有问题。但是,如果我们用y作为三个来调用它,x还没有初始化,func1将对一个未指定的值进行操作。如果启用 -Wmaybe-uninitialized,编译器将针对这种情况发出警告。

解决方法是告诉编译器不要期望任何其他值,例如使用 assert:

void func(int y)
{
   int x;
   assert( y == 1 || y == 2 && "Can't deal with y not in { 1, 2 } ");
   if (y == 1)
       x = 7;
   else if (y == 2)
       x = 14;
   // If we get here, is x initialized or not?
   func1(x);
}

现在,编译器将知道 assert 的结果不允许 y 为 1 或 2 以外的任何值,因此所有有效值都被覆盖.不返回的 assert 会捕获无效值。

[当然,标准中并没有说明assert有这个作用。这是调用流分析结合数据流分析和理解 assert 的作用的结果——我知道 gcc 和 clang 都理解这种结构,并且会很乐意在没有警告的情况下接受上面的代码]

关于c++ - 什么是 gcc Wmaybe-未初始化警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982195/

相关文章:

c - 如何最好地修复这两个警告(旧式 c 函数声明不是原型(prototype))

c++ - 为什么我不能在 C++ 的全局范围内单独声明和定义变量

c++ - 抽象基类定义

c - C 内存泄漏的现实危险?

c - 如何修复由 -Wconversion 引起的错误?

C 迭代到一个非常大的数字 - 关于 unsigned int 的编译器警告

c++ - GCC 编译错误 : declaration of ‘strlen’ must be available

c++ - 如何在没有外部库的情况下在 C++(11) 中创建强类型定义?

c++ - CMake add_compile_options 在适当的时候会影响链接器选项吗?

c - 错误 : format'%s' expects argument of type 'char *' , 但参数 2 的类型为 'int' [-Wformat=]