2015-06-03 62 views
0

不幸的是,我现在没有使用开放代码,所以请考虑这是一个纯理论性质的问题。 我正在使用的C++项目似乎受到以下选项的影响,至少GCC 4.3-4.8导致了相同的问题,没有注意到3.x系列的任何问题(这些选项可能还没有存在或者在那里工作不同),受影响的是Linux x86和Linux ARM平台。选项本身会自动与O1或O2级别设置,所以我必须找到了第一个什么选项,使其:gcc编译器优化受影响的代码

树支配,选择采用

树DSE

树FRE

树前

GCSE

CSE跟随跳动

它不是我自己的代码,但我必须维护它,所以我怎么可能找到这些选项所产生的麻烦来源。一旦我使用“-fno”禁用上述优化,代码就可以工作。 另一方面,该项目在Visual Studio 2008,2010和2013中完美地工作,没有任何明显的问题或特定的编译器选项。诚然,代码不是100%的跨平台,所以有些部分是Windows/Linux特定的,但即使如此,我想知道这里发生了什么。 这不是重要的问题,因为我可以使代码完美无瑕地运行,但我仍然对如何查找这些问题感兴趣。

因此,要简短:如何识别和查找受影响的代码?

我怀疑这是一个巨大的海湾合作委员会的错误,也许甚至没有真正解决我正在使用的代码,但它对我来说真的很感兴趣。 我认为这些选项中的大多数都是某种形式的消除,我也阅读了这些解释,但我不知道如何从这里开始。

+2

您可以隔离出现问题的特定代码位置,例如启用优化时返回意外值的特定函数吗?然后,您可以比较两种情况下生成的汇编代码(使用'gcc -S')来查看编译器生成的不同指令。无论如何,如果您可以创建一个能够再现问题的[SSCCE](http://sscce.org),以便我们验证它(即使您的代码已关闭,您可以将其缩小到一个功能,显示问题) –

+3

* *你的代码如何工作?它会开始崩溃吗?它表现糟糕吗?它会产生意外的结果吗?你*做*建立了许多警告启用,并已妥善解决所有警告(不只是抛弃一些东西)?你确定你的代码中没有错误或未定义的行为?你是否检查过生成的程序集并将其与未经优化生成的程序集进行比较?也许这不是特别的这些优化,而是与导致问题的其他优化相结合? –

+2

医生,医生,当我把自己打在头上的时候会很痛......所以,停止使用优化代码的方法。在你确定了错误并将其报告给GCC维护人员并且他们已经修复之前,请不要使用那些不起作用的东西。但我认为约阿希姆有一个重要的观点 - 你确定代码是干净的,没有任何未定义的行为吗? –

回答

2

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

如果它没有帮助,并且项目很小,您可以尝试使用“-fno”选项编译项目子集,以防止程序被误操作。你可以蛮力的方式来找到错误的.c​​pp文件的最小子集,并从那里开始工作。注意:找到一个复杂度很高的搜索算法可以为您节省很多时间。

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

+0

二进制搜索FTW! –

+0

它不会崩溃,“只有”行为不端,所以我没有任何具体的使用调试器,这是一个非常大的项目,所以我需要一个地方先开始。 – Gnampf

+0

开始的好地方是你首先注意到不当行为的地方。看看它出现在哪个函数中,检查它的参数是否正确,如果是这种情况 - 函数本身是错误的。如果参数不正确,请找到调用它的函数。冲洗并重复。假设你没有太多的全球状态,在这种情况下 - 很糟糕! – tsuki