AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AV verursacht durch Code Optimierung

Ein Thema von Boombuler · begonnen am 9. Dez 2008 · letzter Beitrag vom 11. Dez 2008
Antwort Antwort
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, 12: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
Alt 9. Dez 2008, 12:46     Erstellt von SubData
Dieser Beitrag wurde von Phoenix gelöscht. - Grund: Das hat hier nichts verloren.
Benutzerbild von Boombuler
Boombuler

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

Re: AV verursacht durch Code Optimierung

  Alt 9. Dez 2008, 12:51
Nep wie ich mittlerweile rausgefunden habe ein bekanntes Problem:
http://qc.codegear.com/wc/qcmain.aspx?d=54331

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
Alt 9. Dez 2008, 12:53     Erstellt von SubData
Dieser Beitrag wurde von Phoenix gelöscht. - Grund: Das hier auch nicht.
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#3

Re: AV verursacht durch Code Optimierung

  Alt 9. Dez 2008, 13:30
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;
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

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

Re: AV verursacht durch Code Optimierung

  Alt 9. Dez 2008, 13:43
Thx, scheint zu funktionierenn


Zitat von SubData:
Geh wieder spielen
Jap mach ich jetzt auch!
"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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: AV verursacht durch Code Optimierung

  Alt 9. Dez 2008, 18:30
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:
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+}
die Optimierung muß doch in der aufrufenden Funktion/Prozedur deaktiviert werden, oder doch in der aufgerufenen (also Abort)
$2B or not $2B
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#6

Re: AV verursacht durch Code Optimierung

  Alt 11. Dez 2008, 08:32
Zitat von himitsu:
die Optimierung muß doch in der aufrufenden Funktion/Prozedur deaktiviert werden, oder doch in der aufgerufenen (also Abort)
Weder noch. Das Problem ist mit großer Sicherheit ein Bug in Abort; den Zusammenhang mit der Optimierung erachte ich als eher zufällig. Ich halte es nicht für ausgeschlossen, daß man den Compiler auch mit deaktivierter Optimierung dazu bringen kann, das EBP-Register zu recyclen.
Moritz
"Hey, it compiles! Ship it!"
C++Builder Pages
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 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