【问题标题】:Optimizing compiler removes bug优化编译器消除错误
【发布时间】:2014-03-25 11:04:43
【问题描述】:

所以很多人都在堆栈溢出上发布了关于编译器优化如何将错误引入他们的程序的帖子。但是,我遇到了相反的问题。我正在编写一个 C++ 程序,并且我有一个看起来像是未定义行为的错误,只有当我将 XCode 的编译器设置为关闭 (None[-O0]) 时才会出现。如果我将其设置为“最快、积极的优化 [-Ofast]”,那么该错误就会消失。

所以我想知道是否有人有任何优化消除错误的经验(而不是更常见的优化引入错误的情况)。造成这种情况的一些常见原因是什么?我有点不知道该做什么或去哪里检查。

【问题讨论】:

  • 在极少数情况下,编译器会引入优化错误,大部分时间是由于不良的编程习惯造成的。您必须研究优化器会做什么,例如重新排序、代码消除、堆栈空间的重用、寄存器分配等。TL;DR:您需要检查编译后的输出以查看差异。
  • 我猜是内存问题,比如未初始化的变量/指针。作为开始,我会通过 valgrind 运行它以尝试摆脱任何简单的东西。
  • 优化级别不会引入移除错误,错误存在于程序中,它们可能只是变得明显或隐藏。您很幸运,因为您可以在调试版本中重现该错误,只需找到并修复它。

标签: c++ xcode debugging optimization compiler-construction


【解决方案1】:

优化可以改变表达式的求值顺序,所以如果你的错误是例如foo()bar()中指定求值顺序的结果:

 some_function(foo(), bar());

那么不同的优化设置会暴露该错误,而其他优化设置会隐藏它。

还有很多其他的可能性。

【讨论】:

    【解决方案2】:

    与调试版本相比,启用优化可能会导致释放的堆栈/堆内存包含有效数据的时间更长。一些编译器甚至在调试版本中清理释放的堆栈/堆内存,这意味着释放的数据立即无效。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2013-07-05
      • 2014-06-07
      • 2011-11-07
      • 1970-01-01
      相关资源
      最近更新 更多