gcc 编译器忽略调试构建的未初始化变量警告

ras*_*hok 1 c gcc gcc-warning

gcc编译器忽略uninitialized variable warning调试构建。这对我来说看起来很奇怪,有人可以帮助我理解这一点吗?

\n\n
## Program  \n#include <stdio.h>\n#include <stdarg.h>\n#include <stdlib.h>\n\nint main(int argc, char *argv[])\n{\n    int i, max;\n    int count;\n    if (argc < 2) {\n        return -1;\n    }\n    max = atoi(argv[1]);\n    for (i = 0; i < max; i++) {\n        count++;\n    }\n    printf("count is %d\\n", count);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

gcc ac -g -Wall -Werror

\n\n

无警告

\n\n

gcc ac -O3 -Wall -Werror

\n\n
a.c: In function \xe2\x80\x98main\xe2\x80\x99:\na.c:8:9: error: \xe2\x80\x98count\xe2\x80\x99 may be used uninitialized in this function [-Werror=maybe-uninitialized]\n     int count;\n         ^~~~~\ncc1: all warnings being treated as errors\n
Run Code Online (Sandbox Code Playgroud)\n\n

gcc版本:7.4.0

\n

ks1*_*322 5

虽然看起来可能很奇怪,但gcc 选项记录了这种行为:-Wmaybe-uninitialized

-Wmaybe-uninitialized

对于自动(即局部)变量,如果存在从函数入口到使用已初始化变量的路径,但存在其他一些未初始化该变量的路径,则编译器会发出警告,如果不能证明未初始化的路径在运行时不被执行。

这些警告只有在优化编译时才可能出现,否则 GCC 不会跟踪变量的状态。

我猜原因是分析未初始化变量的成本对于不优化编译来说太大了。这就是为什么这样做只是为了优化一个。