c++ - gcc 编译器优化影响代码

标签 c++ gcc

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

树支配者选择

树状结构

无树

树前

普通话

cse 跟随跳跃

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

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

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

最佳答案

首先:尝试使用调试器。如果程序崩溃,请检查回溯以查找错误函数的位置。如果程序出现异常(错误输出),您应该能够通过仔细放置断点来判断它发生的位置。

如果它没有帮助并且项目很小,您可以尝试使用“-fno”选项编译您的项目的一个子集,以阻止您的程序行为不端。您可以通过暴力破解找到错误 .cpp 文件的最小子集并从那里开始工作。注意:找到一个具有良好复杂度的搜索算法可以为您节省大量时间。

如果万一有一个错误的 .cpp 文件,那么您可以进一步将其内容分解为多个 .cpp 文件,以查看哪些函数是导致错误行为的原因。

关于c++ - gcc 编译器优化影响代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30612591/

相关文章:

c++ - OpenGL统一标准缓冲区对齐困惑

android - gcc disable -Wall 特定文件/文件夹的标志

c++ - 是否可以从 FSEvent id 获取文件名?

c++ - 为什么在c++中实现基于类的优先级队列时需要重载operator<?

c++ - 与静态库链接时,为什么要强制执行命令(例如source.cxx -lstatic)?

我可以将 GCC 作为守护进程运行(或将其用作库)吗?

c - C-使用GCC原子内置函数实现fetchAndSet-有更好的方法吗?

c++ - 在 VS 2012 中调试 STL

c++ - glibc 函数的 GCC、-flto、-fno-builtin 和自定义函数实现

debian - gets() 没有道歉