GCC未初始化变量检查不与`while`一起使用?

时间:2015-10-10 00:05:01

标签: c gcc undefined-behavior gcc-warning

我最近在C上answered a question,其中我建议打开所有编译器警告。

我认为我会复制粘贴我确信gcc在编写OP代码时会给出的实际警告。

除了之外。我将其归结为此测试用例,但也无效

int main() {
        int a; /* not initialised */

        while (a) { /* warn me! */
            a++;
        }

        return 0;
}

我会在gcc上写下我的最后一分钱:

test.c: In function ‘main’:
test.c:4:6: warning: ‘a’ is used uninitialized in this function   [-Wuninitialized]

 while (a) {
        ^

... 我会丢失。我没有得到任何警告!然而,如果我使用if代替while,为什么是,然后我得到的确是警告。但是while?纳瑞低声说道。

我检查了一些似乎有密切关系的reports,并得出结论,虽然它们不适用,但gcc可能会发生某事,这使警告变得多余只是这一个案例。我想知道是什么。

是因为a被初始化为0吗?不,因为

int main() {
    int a;

    if (a == 0) { printf("a is zero\n"); }

    while (a == 0) { a = printf("a is zero\n"); }

    return 0;
}

在if()上给出了错误,但如果我对if()out进行注释,则不会给出错误。如果gcc知道a将会是0,那么第一个if也应该没有引起错误。

那么这里发生了什么?

1 个答案:

答案 0 :(得分:3)

这不是错误。这是一个实施质量问题。如果我们查看manual,则说明:

  

请注意,可能没有关于仅使用的变量的警告   计算一个从未使用过的值,因为这样   在警告之前,可以通过数据流分析删除计算   印刷。

确实如下:

int b = a++;

会引发警告。

main.cpp:6:16: warning: variable 'a' is uninitialized when used here [-Wuninitialized]
        while (a) { /* warn me! */
               ^

main.cpp:4:14: note: initialize the variable 'a' to silence this warning
        int a; /* not initialised */
             ^
              = 0

原始示例有printf,但这令人困惑,因为它暗示了与“as-if”规则的关系。

真的,你能做的最好的事情是: