gcc
编译器忽略uninitialized variable warning
用于调试构建。这对我来说看起来很奇怪,有人可以帮助我理解这一点吗?
## Program
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, max;
int count;
if (argc < 2) {
return -1;
}
max = atoi(argv[1]);
for (i = 0; i < max; i++) {
count++;
}
printf("count is %d\n", count);
return 0;
}
gcc a.c -g -Wall -Werror
无警告
gcc a.c -O3 -Wall -Werror
a.c: In function ‘main’:
a.c:8:9: error: ‘count’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
int count;
^~~~~
cc1: all warnings being treated as errors
gcc
版本:7.4.0
虽然看起来很奇怪,但这种行为是记录在案 https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html for -Wmaybe-uninitialized
海湾合作委员会选项:
-Wmaybe-uninitialized
对于自动(即局部)变量,如果存在从函数入口到使用已初始化变量的路径,但存在其他一些未初始化该变量的路径,则编译器会发出警告(如果不能)证明未初始化的路径在运行时不被执行。
这些警告只有在优化编译时才可能出现,否则 GCC 不会跟踪变量的状态。
我猜原因是分析未初始化变量的成本对于不优化编译来说太大了。这就是为什么这样做只是为了优化一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)