c - gcc 根据优化级别显示不同的警告

标签 c debugging gcc

我用 -O0 -Wall 编译了一个 C 程序然后 -O1 , -O2 , -O3并且我收到了不同的警告消息,其中一些实际上非常重要,以至于它们显示了实际的错误(例如,在 -O1 IIRC 中返回一个本地字符串而不是静态字符串的函数)。

这是为什么 ?我能得到更多警告吗?

最佳答案

gcc 的某些优化级别比其他优化级别更深入地分析代码,这也可能导致错误检测。一个例子是循环优化,从优化级别 2 开始执行。

考虑这个代码:

void func (void) {
    char buf[9];

    for (i = 0; i < 10; i++)
        buf[i] = i;
}

如果用 O0 或 O1 编译它,则不会执行循环优化。但是在级别 O2 及更高级别,编译器检测到最后一个循环迭代调用了未定义的行为:
main.c:5:10: warning: iteration 9 invokes undefined behavior [-Waggressive-loop-optimizations]
   buf[i] = i;
   ~~~~~~~^~~
main.c:4:2: note: within this loop
  for (int i = 0; i < 10; i++)
  ^~~

因此,是的,大量优化可以帮助检测错误,因为 gcc 会投入更多精力来分析代码以进行优化。

编辑:

对于这个特定的警告,实际上值范围传播优化 (-ftree-vrp) 负责。

从 gcc 文档:

This is similar to the constant propagation pass, but instead of values, ranges of values are propagated. This allows the optimizers to remove unnecessary range checks like array bound checks and null pointer checks. This is enabled by default at -O2 and higher. Null pointer check elimination is only done if -fdelete-null-pointer-checks is enabled.



编辑 2:

观察结果可能因 gcc 版本而异;在这种情况下,使用了 gcc 8.3.0 版。

关于c - gcc 根据优化级别显示不同的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388740/

相关文章:

c - 逐行读取文件并存储在C中

c++ - 如何枚举 POSIX/c c++ 目录中的所有文件?

debugging - Windows、Linux、OSX 上调试器的低级详细信息

python:无法解释的无限递归与__repr__

linux - 链接器在传递给它的目标文件上删除字符?

objective-c - 为什么只能在头文件中#define NSString 常量?

c - 为什么这个 C 函数什么都不做?

javascript - 有没有办法移动 Chrome 调试器中的程序计数器?

gcc - 创建一个无需 gnat-tools 即可链接的静态 Ada-Library

c - 给定堆栈和寄存器的状态,我们能否预测 printf 未定义行为的结果