不幸的是,我现在没有使用开放代码,所以请考虑这是一个纯理论性质的问题。 我正在使用的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特定的,但即使如此,我想知道这里发生了什么。 这不是重要的问题,因为我可以使代码完美无瑕地运行,但我仍然对如何查找这些问题感兴趣。
因此,要简短:如何识别和查找受影响的代码?
我怀疑这是一个巨大的海湾合作委员会的错误,也许甚至没有真正解决我正在使用的代码,但它对我来说真的很感兴趣。 我认为这些选项中的大多数都是某种形式的消除,我也阅读了这些解释,但我不知道如何从这里开始。
您可以隔离出现问题的特定代码位置,例如启用优化时返回意外值的特定函数吗?然后,您可以比较两种情况下生成的汇编代码(使用'gcc -S')来查看编译器生成的不同指令。无论如何,如果您可以创建一个能够再现问题的[SSCCE](http://sscce.org),以便我们验证它(即使您的代码已关闭,您可以将其缩小到一个功能,显示问题) –
* *你的代码如何工作?它会开始崩溃吗?它表现糟糕吗?它会产生意外的结果吗?你*做*建立了许多警告启用,并已妥善解决所有警告(不只是抛弃一些东西)?你确定你的代码中没有错误或未定义的行为?你是否检查过生成的程序集并将其与未经优化生成的程序集进行比较?也许这不是特别的这些优化,而是与导致问题的其他优化相结合? –
医生,医生,当我把自己打在头上的时候会很痛......所以,停止使用优化代码的方法。在你确定了错误并将其报告给GCC维护人员并且他们已经修复之前,请不要使用那些不起作用的东西。但我认为约阿希姆有一个重要的观点 - 你确定代码是干净的,没有任何未定义的行为吗? –