Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
-gcc检测未初始化变量的常量指针的W标志_C_Gcc Warning - Fatal编程技术网

-gcc检测未初始化变量的常量指针的W标志

-gcc检测未初始化变量的常量指针的W标志,c,gcc-warning,C,Gcc Warning,我有以下代码,保存在: 然而,我没有得到关于获取未初始化变量的常量指针的任何警告,我也没有 注意:将代码粘贴到中会得到预期的结果: 测试c 12警告603:符号“y”(第10行)未初始化 -乌尼初始化 在未首先初始化的情况下使用自动变量时发出警告 这些警告仅在优化编译时可能出现,因为它们需要仅在优化时计算的数据流信息。如果不指定“-O”,就不会得到这些警告 如果您尝试使用以下工具进行编译: gcc -std=c99 -Wall -Wextra -Wuninitialized -o main *.

我有以下代码,保存在:

然而,我没有得到关于获取未初始化变量的常量指针的任何警告,我也没有

注意:将代码粘贴到中会得到预期的结果:

测试c 12警告603:符号“y”(第10行)未初始化

-乌尼初始化 在未首先初始化的情况下使用自动变量时发出警告

这些警告仅在优化编译时可能出现,因为它们需要仅在优化时计算的数据流信息。如果不指定“-O”,就不会得到这些警告

如果您尝试使用以下工具进行编译:

gcc -std=c99 -Wall -Wextra -Wuninitialized -o main *.c
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;
         ^

为什么这里会出问题?您只是将该变量传递给以arg为指针的函数。您没有传递它的值,而是传递了它的地址&因此编译器不会认为这是错误的,即使您稍后尝试打印它的垃圾值。请记住,此时打印的是指针(*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;
}

你认为为什么会有这样的标志?您最好为此尝试使用静态分析工具或运行时分析器或清理器。gcc 5.1.1不会对此发出警告。哪个版本的gcc会产生此警告?@BlueMoon gcc(Debian 4.9.2-10)4.9.2Hmm..即使使用(Debian 4.9.2-10)4.9.2,我也无法生成此警告。你确定这个警告是为OP的代码生成的吗?@BlueMoon你可以找到一个很好的分析-Wuninitialized flagI添加了,它生成了如上所述的警告;这也使用了4.9.2。
#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