【问题标题】:what is gcc's Wmaybe-unitialized warning什么是 gcc Wmaybe 未初始化警告
【发布时间】:2016-03-03 02:53:22
【问题描述】:

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

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

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

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

我使用的是 GCC 4.8 Fedora 21 x86_64。

如果有人能说明如何触发此警告,我将不胜感激。

【问题讨论】:

  • 要修复警告,您可以将变量初始化为某个默认值,例如 0。意外使用错误值 0 可能比导致未定义行为的未初始化值更好。两害相权取其轻。
  • 同意。但这不应该是 Wunitialized 警告?。
  • 如答案中所述,gcc无法确定是否发生未初始化的使用。
  • 因此变量可能已正确初始化,但 gcc 会引发警告。
  • 是的。它可能未初始化,但也可能没有。

标签: c++ gcc gcc-warning


【解决方案1】:

在某些情况下,编译器可以清楚地检测到某些内容未初始化:

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 一两个,那么上面的代码没有问题。但是,如果我们以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 都理解这种结构,并且很乐意接受上述代码而不会发出警告]

【讨论】:

    【解决方案2】:

    在提出此类问题之前,您应该认真阅读 GCC 手册。

    对于自动变量,如果存在来自函数的路径 使用已初始化但存在的变量的入口 变量未初始化的其他一些路径, 如果无法证明未初始化的路径,编译器会发出警告 不在运行时执行。这些警告是可选的,因为 GCC 不够聪明,无法看到代码可能出现的所有原因 正确,尽管看起来有错误。

    当 GCC 不确定变量是否已初始化时,不会生成此警告。它在变量未始终初始化时发出。

    以下是手册中稍作修改的示例:

    void foo(int y)
    {
        int x;
        switch (y)
        {
            case 1: x = 1;
            break;
            case 2: x = 4;
            break;
            case 3: x = 5;
        }
        bar(x);
    }
    

    【讨论】:

    • 这是未初始化的警告。我的问题是关于可能未初始化的
    • @rashad Meh。我不明白你在说什么。我引用了 -Wmaybe-uninitialized (gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) 的 GCC 手册,而你说的是 this is uninitialized warning. my question is about maybe-uninitialized
    • @rashad 我从 GCC 手册中复制了它。来自maybe-uninitialized 的描述。我只做了一些小的修改。
    • 但是当我尝试编译时。我收到 gcc -O2 的未初始化警告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2021-03-10
    相关资源
    最近更新 更多