我有以下代码,保存在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行)未初始化
答案 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