为什么这段代码会触发gcc的“未初始化”警告?

在很多其他实例中,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";
    }
}

使用-Wall -Werror -02在gcc-6.3.0上进行编译

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

最佳答案
警告意味着编译器无法证明变量在使用前始终已初始化.

这个特别的警告当然不能完全准确,并且在谨慎方面也是错误的,因为如果不确定的话它会引发警告.使用此警告时,通常会遇到这种情况,您必须修改正确的代码才能使警告消失.

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

转载注明原文:为什么这段代码会触发gcc的“未初始化”警告? - 代码日志