reynosa - Error de optimización Delphi 2006
delphi technologies mexico (1)
El error no se ha corregido ni siquiera en la última versión de Delphi, XE6. El error no afecta al compilador de Windows de 64 bits. El error está presente desde Delphi 6, la versión más antigua que puedo ejecutar.
Recomiendo encarecidamente que envíe un informe de control de calidad.
Existe un error en Delphi 2006 si se activa tanto la verificación de desbordamiento como la optimización. El error parece aparecer solo en la situación particular donde se agrega un entero de 32 bits a sí mismo, y luego se agrega un byte a esta suma anterior, en este orden particular, como se ve en el programa a continuación.
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.
Nota: La verificación de desbordamiento debe estar codificada en el archivo fuente, no a través de las opciones del proyecto. Esto nos lleva a otro error: la detección de desbordamiento a través de las opciones del proyecto no tiene ningún efecto.
Como se ve en la ventana de la CPU, el optimizador se distrae con un movimiento con la extensión movzx cero (extendiendo un valor de 8 bits a un valor de 32 bits) y mediante la verificación de desbordamiento, olvidando cargar el byte b en un registro separado, sobrescribiendo los contenidos anteriores , con el efecto neto de agregar b a sí mismo en lugar de 2i . La mitad superior del código de ensamblaje inferior pertenece a la función con errores, mientras que la mitad inferior a la construcción sana.
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
Por cierto, este código no es un ejemplo patológico, lo encontré al adaptar el magnífico programa TeX de D.Knuth al moderno Pascal. Al comprobar el efecto de habilitar la optimización y desactivar todas las comprobaciones del compilador en el tamaño * .exe final, no fue posible interpretar correctamente las tablas hash guardadas en disco (que se generaron con la optimización desactivada), que tracé de vuelta a error anterior, que es la parte que genera las tablas.
La pregunta es simple: ¿alguien puede verificar el programa en una versión más nueva de Delphi?