0

Post-Answer-Acceptance 摘要:问题在于使用了指向超出范围的堆栈变量的指针。它与优化无关。可惜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则段错误会返回。

编辑:如果我添加-fstack-protector-all到构建标志(O1或者O2 -fno-strict-aliasing),段错误就会消失。

因此,这似乎是由 O1 中默认发生的优化引起的,该优化被严格混叠禁用。

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

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

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

4

1 回答 1

1

通常,编译器优化会暴露源代码中的无效或未定义行为,否则您很幸运能够开始工作。我会尝试几件事:

  1. 编译-Wall -Wextra
  2. 运行valgrind看看你是否能得到更多关于错误在哪里的提示
  3. 找到最小的测试用例!
于 2011-11-02T05:10:52.227 回答