AV verursacht durch Code Optimierung
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:
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.
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; PS: GetTickCount und Handle wurden hier nur verwendet, damit Delphi einige stellen nicht komplett optimiert! MfG Boombuler |
Re: AV verursacht durch Code Optimierung
Nep wie ich mittlerweile rausgefunden habe ein bekanntes Problem:
http://qc.codegear.com/wc/qcmain.aspx?d=54331 MfG Boombuler |
Re: AV verursacht durch Code Optimierung
Das ist kein Codegenerierungsfehler, sondern ReturnAddr verläßt sich darauf, daß Abort einen Stackframe generiert, was in optimiertem Code nicht der Fall ist.
Die beste Alternative wäre vermutlich, wenn ReturnAddr anstelle von EBP auf ESP zugriffe:
Delphi-Quellcode:
procedure Abort;
function ReturnAddr: Pointer; asm MOV EAX,[ESP + 4] end; begin raise EAbort.CreateRes(@SOperationAborted) at ReturnAddr; end; |
Re: AV verursacht durch Code Optimierung
Thx, scheint zu funktionierenn ;)
Zitat:
|
Re: AV verursacht durch Code Optimierung
Im Notfall kann man die CodeOptimierung auch teilweise abschalten (allerdings nicht für einzelne Codezeilen, sondern nur für ganze Funktionen, Prozeduren oder für ganze Units bzw. Programme)
Delphi-Quellcode:
die Optimierung muß doch in der aufrufenden Funktion/Prozedur deaktiviert werden, oder doch in der aufgerufenen (also Abort) :gruebel:
procedure ShowSum(a,b,c,d,e,g,f: Integer);
var sum: Integer; begin sum := a+b+c+d+e+f+g; end; {$O-} procedure TForm1.Button1Click(Sender: TObject); var x: Integer; a, b,c: Integer; begin ... end; {$O+} |
Re: AV verursacht durch Code Optimierung
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz