【问题标题】:Code can stop working with compiler optimization [closed]代码可以停止使用编译器优化[关闭]
【发布时间】:2012-07-11 22:54:08
【问题描述】:

我正在使用 PellesC C 编译器。有时我的代码会随机停止工作。一个特定的语句可以触发它。例如,我将一个变量乘以 sin(c)(c 是一个双精度数),我的代码似乎刚刚完成执行而没有结果。有时它会冻结,有时它似乎只是返回,但我总是可以通过删除有问题的语句或禁用编译器优化来修复它,特别是“最大化速度”或“最大化速度更多”。如果我在崩溃点附近的某处添加 printf 语句,冻结也将在几乎 100% 的时间内消失。我从来没有发现任何表明我不正确地访问内存的东西,我很确定这是一个编译器问题。我想知道是否有人可以对此有所了解。事实上,我是否有可能做错了什么?或者这是 Pelles C 编译器的一个已知问题?

编辑:

变化

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+sin(c)));

到(最后一行末尾的差异)

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+1));

让它工作。

【问题讨论】:

  • 你有要展示的测试用例吗?
  • 是的,您可能做错了什么,例如依赖导致未定义行为的构造。这就是没有SSCCE 可以说的所有内容。
  • 你在处理 SIGFPE 吗?
  • 不幸的是,我现在正在处理的程序大约有 750 行代码,向您展示一小段代码可能会解决该错误,因此无法进行 SSCCE,部分原因是我我很难理解这些故障。我 100% 肯定算术不是问题,这个问题是由过去没有任何此类操作的代码行引起的。
  • @BigEndian:SSCCE 可能的,你只需要努力。我敢打赌,你不需要全部 750 行代码就能重现问题。

标签: c compiler-construction compiler-optimization pelles-c


【解决方案1】:

它可能是,但一个很好的选择是它是你 :) 未显式初始化的变量通常会在优化和未优化的构建中获得不同的值,因为堆栈布局可能会根据编译器的积极程度而发生微妙的变化除去临时因素以及其他因素。

【讨论】:

  • 我会检查我的所有变量。我尽量对此非常小心。
  • 我会这么说,我只是注意到我遇到的每个项目都涉及到 3D 图形。我写了一个大约 400 行的标题,用于处理向量和矩阵。所以我使用了很多 3 或 16 双精度数组。但是,我非常小心地将它们初始化为数组或指针,然后分配我需要的内存。在给定一个我可以看到的值之前,没有使用任何矩阵或向量。
【解决方案2】:

您可能不小心在某处使用了未定义的行为,并且更改程序中的随机指令会破坏堆栈上代码的非常脆弱的对齐方式,而堆栈中恰好使程序运行。

【讨论】:

  • 等待等待...堆栈上的代码?我认为 C 仅使用堆栈来存储变量、传递参数、返回值等。为了进一步澄清,您是说我的程序意外更改了用于可执行代码的内存中的字节吗?为堆栈分配的内存在物理上是否足够接近可执行代码,以便在任何合理的现实场景中发生这种情况?
  • 抱歉,我说的很不准确。它可能改变了堆栈上事物的内存值,因此引用这些内存值的程序指令(IE,对堆栈指针和东西的相对引用)可能被改变了。您是正确的,实际代码没有存储在堆栈中,数据本身也没有改变 - 而是使用 UB 对程序进行微小更改可以突然让编译器能够做完全不同的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2017-05-08
  • 2012-12-29
  • 2011-04-30
相关资源
最近更新 更多