【问题标题】:gcc compiler ignores uninitialized variable warning for debug buildgcc 编译器忽略调试构建的未初始化变量警告
【发布时间】:2020-01-10 19:06:06
【问题描述】:

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

【问题讨论】:

  • 在优化过程中会进行一些静态代码分析。因此,某些警告只有在设置了某个优化级别时才可用。这是其中一种情况。
  • 为什么不使用gcc a.c -O3 -g -Wall -Werror(并在你使用它时输入-Wextra,也许还有其他一些警告标志)。这让你两全其美——调试信息和优化。我大部分时间都使用这种组合。这确实意味着,如果您必须运行调试器,当优化器移动或删除代码时,您可能会遇到一些奇怪的行为。但它在大多数情况下确实有效。如果您要进行认真的调试会话,请删除 -O3 — 否则,请同时使用。

标签: c gcc gcc-warning


【解决方案1】:

虽然看起来很奇怪,但这种行为是documented for -Wmaybe-uninitialized gcc 选项:

-Wmaybe-uninitialized

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多