【问题标题】:Why does this code trigger gcc's "maybe uninitialized" warning?为什么这段代码会触发 gcc 的“可能未初始化”警告?
【发布时间】:2018-06-29 02:17:19
【问题描述】:

在许多其他情况下,gcc 似乎能够检测到循环开始时的条件初始化变量。如果我放弃增量运算符,它甚至可以工作。如果没有 -02 标志,它也会消失。我已经学会相信编译器警告通常确实意味着有问题,所以我想知道我是否缺少某些东西,或者这只是一个奇怪的编译器怪癖。

void act(char **);

void test(int width, int height){
    char * rowA[width];
    char ** A;

    for (int i = 0; i < width * height; ++i){
        if (!(i % width)){
            if (i){
                act(rowA);
            }
            rowA[0] = 0;
            A = rowA;
        }
        *A++ = "hello";
    }
}

在gcc-6.3.0 和-Wall -Werror -02 上编译

编辑:为避免混淆,我已将代码更改为更接近实际用例。

【问题讨论】:

  • 您是否更改了 !(i % argc) 以触发此警告? (另外,你可以试试 gcc 8.1.1 吗?)
  • @Ry- 在我正在处理的实际代码中是i &lt; width * height 和i % width。找不到尝试8.1.1的好方法,但8.1.0仍然显示警告。

标签: c gcc gcc-warning


【解决方案1】:

警告意味着编译器无法证明变量在使用前总是被初始化。

当然,这个特定的警告不可能完全准确,而且如果不确定,它确实会发出警告。使用此警告时,通常会出现这种情况,您必须修改正确的代码才能使警告消失。

这也可能是优化器错误的证据;优化器应该意识到if(!(i % argc)) 可以优化为if (i == 0)。

【讨论】:

  • 在我正在处理的实际代码中是 i &lt; width * height 和 i % width,所以这不会是可优化的,但你说得对,我的简化应该是。
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多