首页 > 解决方案 > 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

标签: cgccgcc-warning

解决方案


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

-Wmaybe-uninitialized

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

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

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


推荐阅读