小编Mar*_*ler的帖子

Delphi 2006优化bug

如果激活溢出检查和优化,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.
Run Code Online (Sandbox Code Playgroud)

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

如在CPU窗口中所见,优化器通过零扩展移动movzx(将8位值扩展为32位值)分散注意力,并通过溢出检查,忘记在单独的寄存器上加载字节b,覆盖先前的内容,具有将b添加到自身而不是2i的净效果.下面的汇编代码的上半部分属于bugged函数,而下半部分属于sane构造.

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 …
Run Code Online (Sandbox Code Playgroud)

delphi

24
推荐指数
1
解决办法
349
查看次数

EOLN中的Delphi 2006错误

我认为D2006(WIN 32)中的EOLN功能存在一个错误,当应用于具有Unix类型换行符(LF)的文本文件时,此LF是输入缓冲区中的第一个字符.错误的来源是线

        TEST    [EDX].TTextRec.Mode,tfCRLF
Run Code Online (Sandbox Code Playgroud)

哪个应该正确阅读

        TEST    [EDX].TTextRec.Flags,tfCRLF
Run Code Online (Sandbox Code Playgroud)

这是标志字段,其存储的线制动器样式,而不是模式字段,其存储的输入/输出模式.

以上行是Sytem单元下面的片段的一部分,当需要重新填充缓冲区时调用该片段.该错误未被注意,因为Mode字段是输入文件的奇数(这是EOLN通常使用的模式)

fmInput  = $D7B1;
Run Code Online (Sandbox Code Playgroud)

匹配tfCRLF(= 1)中为Windows生成的文本文件设置的唯一位.较新版本的Delphi是否仍然具有相同的EOLN编码?

function _Eoln(var t: TTextRec): Boolean;
asm
.
.
.
@@readChar:
        PUSH    EAX
        CALL    _ReadChar
        POP     EDX
        CMP     AH,cEOF
        JE      @@eof
        DEC     [EDX].TTextRec.BufPos
        XOR     ECX,ECX
        XCHG    ECX,EAX
        TEST    [EDX].TTextRec.Mode,tfCRLF
        JE      @@testLF
        CMP     CL,cCR
        JE      @@eol
        JMP     @@exit

@@eol:
@@eof:
        MOV     AL,1
@@exit:
end;
Run Code Online (Sandbox Code Playgroud)

另一个好奇心:这个EOLN功能,当应用于Windows(CRLF …

unix windows delphi

7
推荐指数
1
解决办法
158
查看次数

标签 统计

delphi ×2

unix ×1

windows ×1