首页 > 解决方案 > 未初始化的警告需要 -O2

问题描述

当我编译以下 C++ 程序时,我需要添加-O2标志以获取有关未初始化变量的警告。这是为什么?

unsigned long fac(unsigned long n)
{
  unsigned long product;

  while (n > 1)
  {
    product = product * n;
    n = n - 1;
  }

  return product;
}

➜  a g++ --version
g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)

编辑:为了澄清这个问题,我当然启用了警告。

标签: c++gccwarnings

解决方案


警告出现在 -O2(或任何其他优化)模式下,同时选项已-Wmaybe-uninitialized打开。该-Wmaybe-uninitialized选项也会在-Wall启用任何优化模式的情况下打开。

根据GCC 文档,这样做的原因是:

-Wmaybe-uninitialized

对于自动(即局部)变量,如果存在从函数入口到使用已初始化变量的路径,但存在一些其他未初始化变量的路径,则编译器如果无法初始化则发出警告证明未初始化的路径不会在运行时执行。 这些警告只能在优化编译时出现,否则 GCC 不会跟踪变量的状态。这些警告是可选的,因为尽管看起来有错误,但 GCC 可能无法确定代码何时正确。

然后是一个例子,说明上述场景是如何发生的。


推荐阅读