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

时间:2019-12-18 09:13:54

标签: c debugging gcc

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

那是为什么?我可以收到更多警告吗?

1 个答案:

答案 0 :(得分:9)

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

考虑以下代码:

site-packages

如果使用O0或O1进行编译,则不会执行循环优化。但是在O2或更高级别上,编译器检测到最后一次循环迭代调用了未定义的行为:

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

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

因此,是的,繁重的优化可以帮助检测错误,因为gcc会投入更多精力来分析代码以达到优化目的。

编辑:

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

从gcc文档中:

  

这类似于恒定传播遍历,但是代替值,而是传播值的范围。这使优化器可以删除不必要的范围检查,例如数组绑定检查和空指针检查。默认情况下,此选项在-O2及更高版本中启用。仅在启用-fdelete-null-pointer-checks的情况下,才执行空指针检查消除。

编辑2:

观察结果可能与gcc版本不同;在这种情况下,使用的是gcc版本 8.3.0