Einzelnen Beitrag anzeigen

Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#1

AV verursacht durch Code Optimierung

  Alt 9. Dez 2008, 11:07
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
"Look at you, Hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?"
SwapIt Highscore:
  Mit Zitat antworten Zitat