为什么此代码会触发gcc的“可能未初始化”警告?

时间:2018-06-29 02:17:20

标签: c gcc gcc-warning

在许多其他情况下,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上编译

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

1 个答案:

答案 0 :(得分:2)

警告表示编译器无法证明变量始终在使用前进行了初始化。

当然,此警告不能完全准确,它会引起警告,如果不能确定,则会发出警告。使用此警告时,通常会遇到这种情况,您必须修改正确的代码才能消除该警告。

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