Hi,
heute ist uns hier was aufgefallen was die Delphi Code Optimierung verursacht. Durch fehlerhaftes Optimieren der lokalen Variablen wird eine Zugriffsverletzung verursacht. Ich habe den Original-Code mal auf ein sinnloses Beispiel übertragen. Vielleicht kann mir ja jemand von euch sagen wie ich das am besten umgehen kann. Da der Code der original Anwendung über 1,5 Mio. Zeilen Code hat würde ich die Code Optimierung gerne eingeschaltet lassen und auch nicht umbedingt alle Aborts suchen ob der Fehler dort auftreten kann.
Beispiel (getestet mit D2005 und D2009)
Delphi-Quellcode:
procedure ShowSum(a,b,c,d,e,g,f: Integer);
var sum: Integer;
begin
sum := a+b+c+d+e+f+g;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x: Integer;
a, b,c: Integer;
begin
b := 2;
if (GetTickCount
mod 2) = 0
then
begin
a := GetTickCount;
b := a
div 2;
x := 4915;
// Exception @ 1337
c :=
Handle;
end
else
begin
a :=
Handle;
b := a
div 2;
x := 53259;
// Exception @ D00F
c := GetTickCount;
end;
ShowSum(a,b,c,5,4,x,9);
Abort;
end;
Der Fehler wird dadurch ausgelöst, dass die Variable X per Optimierung auf EBP gelegt wird, welches von Abort zur Berechnung der Aufruf-Adresse verwendet wird.
PS: GetTickCount und
Handle wurden hier nur verwendet, damit Delphi einige stellen nicht komplett optimiert!
MfG
Boombuler