-w标志为gcc检测取未初始化变量的const指针

时间:2015-08-28 06:16:52

标签: c gcc-warning

我有以下代码,保存在Coding Ground here

#include <stdio.h>

void foo(int const *x)
{
    printf("Hello, %d!\n", *x);
}

int main()
{
    int y;

    foo(&y);
    y = 3;
    printf("Hello, World %d!\n", y);
    return 0;
}

我编译:

gcc -std=c99 -Wall -Wextra -Wuninitialized -o main *.c

但是,我没有得到关于获取未初始化变量的常量指针的警告,我cannot find a suitable flag

注意:将代码粘贴到Gimpel's Online Lint可以得到预期的结果:

  

test.c 12警告603:符号'y'(第10行)未初始化

2 个答案:

答案 0 :(得分:3)

  

-Wuninitialized   在没有首先初始化的情况下使用自动变量时发出警告。

     

这些警告仅在优化编译时才有可能,因为它们需要仅在优化时计算的数据流信息。如果你没有指定`-O&#39;,你根本就不会得到这些警告。

如果您尝试编译:

gcc -std=c99 -Wall -Wextra -Wuninitialized -O2 -o main *.c

警告将是:

pippo.c: In function ‘main’:
pippo.c:56:5: warning: ‘y’ is used uninitialized in this function [-Wuninitialized]
     printf("Hello, %d!\n", *x);
     ^
pippo.c:61:9: note: ‘y’ was declared here
     int y;
         ^

答案 1 :(得分:0)

这里为什么会出错?你刚刚通过该函数传递了该变量,该函数将arg作为指针。你没有通过它的价值,你用&amp;传递了它的地址。因此,即使您稍后尝试打印其垃圾值,编译器也不会将此视为错误。请记住,此时打印指针(* x)的值而不是变量本身。 如果你不自己做,那么变量是不是用垃圾值初始化的?

但是如果你不使用指针:

#include <stdio.h>

void foo(int const x)
{
    printf("Hello, %d!\n", x);
}

int main(void){
    int y;

    foo(y);
    y = 3;
    printf("Hello, World %d!\n", y);
    return 0;
}

现在情况有所不同,编译器知道这一点:

 program.c:12:5: error: ‘y’ is used uninitialized in this function [-Werror=uninitialized]
     foo(y);
     ^
cc1: all warnings being treated as errors