c语言 - 为什么此代码会触发 gcc 的"maybe uninitialized"警告?



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

最新更新