C++优化级别揭示了潜在的错误

Glo*_*ior 0 c c++ optimization

我有一个场景,我必须更新我的服务器操作系统版本和g ++版本,我发现工作正常的代码开始在新版本上给出错误(实际上是分段错误).然后通过代码调试,我意识到有这样的事情:

#include<stdio.h>
int main()
{
        char s[8]={'\0'};
        sprintf(s,"overflow");
        return 1;
}
Run Code Online (Sandbox Code Playgroud)

汇编是g ++ file.cc -O2

因此,当我们分配整个字符串s时,优化会导致错误,并且没有NULL终止.我只是想问一下使用优化标志ON的好习惯,特别是在移动不同版本的g ++时,因为上面的错误可能因为早期的错误编程实践而落实到位?

CB *_*ley 6

错误在代码中; 没有优化标志的事实你无法看到错误只是运气不好.

当然优化器可能有bug,但是当前的gcc -O2只会极少发生错误的代码.通常没有理由避免常见的优化标志.

此示例更多的原因是您应该更喜欢使用各种选项进行编译,最好使用一些内存检查选项和分析器,而不是避免优化的原因.