C 代码可以停止使用编译器优化

C 代码可以停止使用编译器优化,c,compiler-construction,compiler-optimization,pelles-c,C,Compiler Construction,Compiler Optimization,Pelles C,我正在使用PellesC编译器。有时我的代码会随机停止工作。一个特定的语句可以触发它。例如,我将一个变量乘以sin(c)(c是一个双精度数),我的代码似乎刚刚完成执行,没有结果。有时它会冻结,有时它看起来只是返回,但我总是可以通过删除有问题的语句或禁用编译器优化来修复它,特别是“最大化速度”或“最大化速度更多”。如果我在printf语句崩溃点附近添加printf语句,冻结也会消失几乎100%的时间。我从来没有发现任何迹象表明我访问内存不正确,我敢肯定这是编译器的问题。我想知道是否有人能解释这件事

我正在使用PellesC编译器。有时我的代码会随机停止工作。一个特定的语句可以触发它。例如,我将一个变量乘以sin(c)(c是一个双精度数),我的代码似乎刚刚完成执行,没有结果。有时它会冻结,有时它看起来只是返回,但我总是可以通过删除有问题的语句或禁用编译器优化来修复它,特别是“最大化速度”或“最大化速度更多”。如果我在printf语句崩溃点附近添加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)));
至(最后一行末尾的差值)



使其工作。

可能是,但很有可能是您:)未显式初始化的变量在优化和未优化的构建中通常会得到不同的值,因为堆栈布局可能会根据编译器删除临时变量的力度而发生微妙的变化,以及其他因素。

可能是,但很有可能是您:)未显式初始化的变量在优化和未优化的构建中通常会得到不同的值,因为堆栈布局可能会根据编译器删除临时变量的力度而发生微妙的变化,以及其他因素。

您可能无意中在某个地方使用了未定义的行为,而更改程序中的随机指令正在破坏堆栈上代码的脆弱对齐,而堆栈上的代码恰好使程序工作。

您可能无意中在某个地方使用了未定义的行为,更改程序中的随机指令会破坏堆栈上的代码非常脆弱的对齐,而堆栈上的代码恰好使程序工作。

您是否有测试用例要显示?是的,您可能做了一些错误的事情,例如依赖导致未定义行为的结构。这就是我所能说的。你在处理SIGFPE吗?不幸的是,我现在正在处理的程序大约有750行代码,向你展示一小段代码可能会克服错误,因此无法进行SSCCE,这也是我很难理解这些小故障的部分原因。我百分之百肯定算术不是问题所在,这个问题是由过去没有任何此类操作的代码行引起的。@BigEndian:SSCCE是可能的,您只需要努力就可以了。我敢打赌,你不需要所有750行来重现问题。你有测试用例要显示吗?是的,你可能做了错事,比如依赖导致未定义行为的构造。这就是我所能说的。你在处理SIGFPE吗?不幸的是,我现在正在处理的程序大约有750行代码,向你展示一小段代码可能会克服错误,因此无法进行SSCCE,这也是我很难理解这些小故障的部分原因。我百分之百肯定算术不是问题所在,这个问题是由过去没有任何此类操作的代码行引起的。@BigEndian:SSCCE是可能的,您只需要努力就可以了。我敢打赌,你不需要全部750行来重现这个问题。我会检查我所有的变量。我会说,我只是注意到我遇到的每一个项目都与3D图形有关。我写了一个400行的标题,处理向量和矩阵。所以我使用了很多3倍或16倍的数组。但是,我非常小心地将它们初始化为数组或指针,然后分配所需的内存。在得到一个我能看到的值之前,没有使用矩阵或向量。我将检查我所有的变量。我会说,我只是注意到我遇到的每一个项目都与3D图形有关。我写了一个400行的标题,处理向量和矩阵。所以我使用了很多3倍或16倍的数组。但是,我非常小心地将它们初始化为数组或指针,然后分配所需的内存。在得到一个我能看到的值之前,没有使用矩阵或向量。等等。。。堆栈上的代码?我认为C只使用堆栈来存储变量、传递参数、返回值等。为了进一步澄清,你是说我的程序无意中更改了用于可执行代码的内存中的字节吗?为堆栈分配的内存在物理上是否与可执行代码足够接近,以便在任何合理的现实场景中发生这种情况?对不起,我的解释太不精确了。它可能会改变堆栈上事物的内存值,因此引用这些内存值(即,对堆栈指针和内容的相对引用)的程序指令可能会改变。你是对的,实际的代码并没有存储在堆栈上,数据本身也没有改变——相反,对UB程序的小改动会突然赋予编译器做完全不同事情的能力。等等。。。堆栈上的代码?我认为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));