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 检查堆访问,这似乎是与堆栈相关的错误)。