gcc 4.4.4优化错误仅适用于O1或O2 +无严格别名

时间:2011-11-02 04:48:05

标签: gcc compiler-optimization strict-aliasing

答案后接受摘要:问题是使用指向超出范围的堆栈变量的指针。它与优化无关。很遗憾valgrind找不到堆栈错误......


我有一个段错误,只有在gcc 4.4.4(CentOS 5.5)中启用-O1级别优化时才会出现。所有其他优化级别(0,2,3,s)都可以。我还没有设法为它创建一个简化的测试用例,但它似乎与数组偏移计算有关,导致堆栈被覆盖。

如果我启用-O1并禁用所有具有标志(http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)的优化,则仍会发生错误。

如果我使用-O2(或任何其他级别),则没有问题。如果我使用O2并使用-fno-strict-aliasing禁用严格别名,则segfault返回。

修改:如果我将-fstack-protector-all添加到构建标记(O1O2 -fno-strict-aliasing),则段错误将消失。

所以它似乎是由默认情况下在O1中通过严格别名禁用的优化引起的。

我怀疑这是一个编译器错误(但没有减少的测试用例,我无法证明它)。这是一个需要快速转向的生产服务器。正常的优化级别是O1,我不愿意将其更改为O2,因为修复可能比原始问题更危险。

我真的很感激一些建议。目前我正在考虑尝试编译gcc 4.4.6并查看是否可以修复它。然而,不确定导致问题的原因有点令人担忧。

编辑:服务器使用-Wall -Werror(以及其他一些人)进行编译。它在valgrind中运行时没有错误(valgrind检查堆访问,这似乎是与堆栈相关的错误)。

1 个答案:

答案 0 :(得分:1)

通常,编译器优化可以在源代码中暴露无效或未定义的行为,否则您很幸运。我会尝试一些事情:

  1. 使用-Wall -Wextra
  2. 进行编译
  3. valgrind下运行,看看您是否能更多地了解错误的位置
  4. 找到最小的测试用例!