gpt4 book ai didi

Delphi 2006优化bug

转载 作者:行者123 更新时间:2023-12-03 14:34:05 29 4
gpt4 key购买 nike

如果同时激活溢出检查和优化,Delphi 2006 中会出现错误。该错误似乎仅在特定情况下出现,其中将 32 位整数添加到自身,然后按特定顺序将一个字节添加到先前的总和,如下面的程序所示。

program OptimizationBug;
{$OPTIMIZATION ON}
{$APPTYPE CONSOLE}

{$OVERFLOWCHECKS ON}
function f: integer;
var i: integer;
b: byte;
begin
i:=0;
b:=1;
Result:=i+i+b;
end;

{$OVERFLOWCHECKS OFF}
function g: integer;
var i: integer;
b: byte;
begin
i:=0;
b:=1;
Result:=i+i+b;
end;

begin
writeLn(f); //wrong, prints "2" in D2006
writeLn(g); //good, prints "1"
readLn;
end.

注意:溢出检查必须在源文件中编码,而不是通过项目选项。这导致我们遇到另一个错误:通过项目选项进行溢出检测无效。

如 CPU 窗口所示,优化器因带有零扩展 movzx 的移动(将 8 位值扩展为 32 位值)和溢出检查而分心,忘记加载字节b 在一个单独的寄存器上,覆盖以前的内容,最终效果是将 b 添加到其自身,而不是添加到 2i。下面的汇编代码的上半部分属于有缺陷的函数,而下半部分属于正常的构造。

OptimizationBug.dpr.20: i:=0;
00403EAC 33C0 xor eax,eax
OptimizationBug.dpr.21: b:=1;
00403EAE B201 mov dl,$01
OptimizationBug.dpr.22: Result:=i+i+b;
00403EB0 03C0 add eax,eax
00403EB2 7105 jno $00403eb9
00403EB4 E82BF5FFFF call @IntOver
00403EB9 0FB6C2 movzx eax,dl //BUG: should have x-moved DL to EDX register!
00403EBC 03C0 add eax,eax // (and added EDX to EAX)
00403EBE 7105 jno $00403ec5
00403EC0 E81FF5FFFF call @IntOver
OptimizationBug.dpr.23: end;
00403EC5 C3 ret
00403EC6 8BC0 mov eax,eax
OptimizationBug.dpr.30: i:=0;
00403EC8 33C0 xor eax,eax
OptimizationBug.dpr.31: b:=1;
00403ECA B201 mov dl,$01
OptimizationBug.dpr.32: Result:=i+i+b;
00403ECC 03C0 add eax,eax
00403ECE 0FB6D2 movzx edx,dl //OK!
00403ED1 03C2 add eax,edx //ok
OptimizationBug.dpr.33: end;
00403ED3 C3 ret

顺便说一句,这段代码并不是一个病态的例子,我在将 D.Knuth 宏伟的 TeX 程序改编成现代 Pascal 时发现了它。在检查启用优化和关闭对最终 *.exe 大小的所有编译器检查的效果时,它无法正确解释磁盘保存的哈希表(这些哈希表是在关闭优化的情况下生成的),我追溯到上面的错误,这是生成表格的部分。

问题很简单,有人可以在较新版本的Delphi上检查该程序吗?

最佳答案

即使在最新版本的Delphi XE6中,该错误也没有得到修复。该错误不会影响 64 位 Windows 编译器。该错误早在 Delphi 6 就存在,这是我可以运行的最旧版本。

我强烈建议您提交一份质量控制报告。

关于Delphi 2006优化bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640715/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com