c - gcc 编译器忽略调试构建的未初始化变量警告
问题描述
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 ac -g -Wall -Werror
没有警告
gcc ac -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
解决方案
虽然看起来很奇怪,但gcc 选项记录了这种行为:-Wmaybe-uninitialized
-Wmaybe-uninitialized
对于自动(即局部)变量,如果存在从函数入口到使用已初始化变量的路径,但存在一些其他未初始化变量的路径,则编译器如果无法初始化则发出警告证明未初始化的路径不会在运行时执行。
这些警告只有在优化编译时才有可能,否则 GCC 不会跟踪变量的状态。
我猜原因是分析未初始化变量的成本对于不优化编译来说太大了。这就是为什么它只用于优化一个。
推荐阅读
- macos - macOS v10.15 (Catalina) / x64 上的自修改代码
- reactjs - 如果字段为空,则禁用提交按钮
- sql - Jooq 文本数组生成为对象数组
- javascript - 在 React JS 中过滤嵌套数组
- javascript - 如何拆分 javascript 数组并替换其中的元素?
- json - 如何使用 Bash 在 json 文件中查找内容
- python-3.x - 具有用户输入的笛卡尔积
- ios - 如何将 Int 类型的值转换为预期的参数类型 Bool
- keras - keras InceptionV3 的灰度输入
- c# - .NET Core 3.1 文件结果很慢