gcc编译器优化会影响代码

时间:2015-06-03 06:38:37

标签: c++ gcc

不幸的是,我现在不使用开放代码,所以请将此视为纯理论性质的问题。 我正在使用的C ++项目似乎肯定被以下选项削弱了,至少GCC 4.3 - 4.8导致了同样的问题,没有注意到3.x系列的任何问题(这些选项可能还没有存在)或者以不同的方式工作),受影响的是Linux x86和Linux ARM平台。选项本身会自动设置为O1或O2级别,因此我必须首先找出导致它的选项:

树支配-OPTS

树DSE

树FRE

树预

GCSE

CSE-跟踪跳跃

它不是我自己的代码,但我必须维护它,所以我怎么能找到这些选项所带来的麻烦的来源。一旦我使用" -fno"禁用了上面的优化。代码有效。 另外,该项目与Visual Studio 2008,2010和2013完美配合,没有任何明显的问题或特定的编译器选项。当然,代码不是100%跨平台的,所以有些部分是Windows / Linux特定的,但即使这样,我也想知道这里发生了什么。 这不是一个至关重要的问题,因为我可以使代码运行完美,但我仍然对如何追踪这些问题感兴趣。

所以简而言之:如何识别和查找受影响的代码?

我怀疑它是一个巨大的GCC错误,也许甚至没有真正修复我正在使用的代码,但它对我来说真正感兴趣。 我认为大多数这些选项都是某种类型的消除,我也阅读了这些的解释,但我仍然不知道如何从这里开始。

1 个答案:

答案 0 :(得分:2)

首先:尝试使用调试器。如果程序崩溃,请检查回溯位置以查找故障功能。如果程序行为不当(输出错误),您应该能够通过小心地放置断点来判断它出现在哪里。

如果它没有帮助且项目很小,你可以尝试使用" -fno"来编译项目的子集。阻止您的程序行为不端的选项。您可以通过强制方式找到故障.cpp文件的最小子集并从那里开始工作。注意:找到具有良好复杂性的搜索算法可以为您节省大量时间。

如果有任何错误的.c​​pp文件,那么您可以进一步将其内容分解为几个.cpp文件,以查看哪些函数是错误行为的原因。