AGB  ·  Datenschutz  ·  Impressum  







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

[FM] Free auf nil wird zu self.free

Ein Thema von Darlo · begonnen am 1. Mär 2012 · letzter Beitrag vom 2. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

[FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:43
Hallo zusammen,

mir ist gerade etwas merkwürdiges unter FM aufgefallen.

Folgender Beispielcode
Code:
procedure TForm1.btnTestClick(Sender: TObject);
var
  sl: TStringList;
begin
  sl.Free;
end;
Führt unter Firemonkey dazu, dass der Button freigegeben wird, unter VCL kommt es
wie zu erwarten zu einer Exception.

Kann mir jemand das Verhalten unter FM erklären, oder ist es ein Bug?

Gruß
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:48
Führt unter Firemonkey dazu, dass der Button freigegeben wird, unter VCL kommt es
wie zu erwarten zu einer Exception.

Kann mir jemand das Verhalten unter FM erklären, oder ist es ein Bug?

Gruß
Du kannst eigentlich nur erwarten das *irgendwas* passiert. Je nachdem auf was sl zeigt. Wenn es zufälligerweise die Button-Instanz ist wird diese Freigegeben. Wenn du glück hast bekommst du eine sinnvoller Exception-Meldung
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:48
Das wird Zufall sein.

Lokale Variablen werden nicht automatisch initialisiert.
Es steht dort also ein "Zufallswert" drin.

Und bei VM wird in der Speicheradresse, welche DU hast vergessen zu initialisieren, vielleicht "zufällig" die Button-Komponente drinstehn.

Fazit: DU bist Schuld.


[edit]
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 14:49
Eine nicht initialisierte Stackvariable freizugeben ist der Bug.
Ob FM hier nur zufällig den Button abgelegt hat, oder ob es da ein System gibt kann ich nicht beurteilen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 15:01
Dass der Code fehlerhaft ist, ist mir durchaus klar. Sollte ja
auch nur ein vereinfachtes Beispiel dazu sein...

Mir scheint es, dass nicht initialisierte lokale Variablen unter FM
stets auf den Sender der Procedure zeigen, da
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  button1.OnClick(sender);
end;
button2 verschwinden läßt.

Danke soweit für eure Antworten, ich dachte dass nicht initialisierte Variablen
nirgendwo hinzeigen.

Gruß
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 15:06
Mir scheint es, dass nicht initialisierte lokale Variablen unter FM
stets auf den Sender der Procedure zeigen,
Der Compiler der die Anwendung erzeugt ist der gleiche. Was sollte da anders sein?

..., ich dachte dass nicht initialisierte Variablen nirgendwo hinzeigen.
Hätte Delphi eine Managed Framework/Garbage Collector dann wäre das so. Aber wenn man die Compilerwarnungen die bei sowas auftauchen auch nicht ignoriert dann behebt man die Programmierfehler auch.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#7

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 15:11
Der Compiler der die Anwendung erzeugt ist der gleiche. Was sollte da anders sein?
Unter VCL kommt eine Exception

Nur um das zu betonen, ich wollte das Verhalten verstehen, dass hier ein Programmierfehler vorliegt ist klar.
Gruß
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 15:32
Der Compiler der die Anwendung erzeugt ist der gleiche. Was sollte da anders sein?
Unter VCL kommt eine Exception
Das was anders kommst hast du ja geschrieben. Aber bei VCL und FM wird ja der gleiche Compiler genommen. Und auf dieser unteren ebene weiß der Compiler ja nichts mehr davon jetzt VCL oder FM vor sich zu haben. Also kann es eigentlich nur zufall sein was passiert.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 16:44
Ein Pointer ist auch nichts anderes als ein 4 oder 8 Byte großer Speicherbereich, dessen Inhalt als Speicheradresse (in diesem Fall einer TStringList-Instanz) interpretiert wird. Da bis zum Aufruf von sl.Free noch kein korrekter Inhalt in diesen Speicherbereich verbracht wurde (z.B. durch ein sl := TStringList.Create ), befinden sich darin eben noch die Bits, die irgendwie vorher von einem anderen Prozeduraufruf drin gestanden haben (z.B. dein Geburtsdatum oder die Größe deiner Festplatte oder die Speicheradresse von Button2).

Wenn man jetzt diesen zufälligen Speicherinhalt als Speicheradresse einer TStringList interpretiert, dann liegt diese Adresse mit hoher Wahrscheinlichkeit nicht im erlaubten Adressraum des aktuellen Prozesses und führt zu einer Schutzverletzung.

Wenn es sich aber zufällig um die Adresse von Button2 handelt, dann ist das sehr wohl eine gültige Adresse. Da Free für alle Objekt-Instanzen das selbe tut, führt der Aufruf von sl.Free in diesem Fall eben zur Freigabe von Button2.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#10

AW: [FM] Free auf nil wird zu self.free

  Alt 1. Mär 2012, 17:04
Mir scheint es, dass nicht initialisierte lokale Variablen unter FM
stets auf den Sender der Procedure zeigen, da... button2 verschwinden läßt.
Das ist wirklich merkwürdig, denn die lokale Variable liegt auf dem Stack ÜBER dem Wert von 'Sender'. Bin mir nicht sicher, aber da ist glaub ich auch noch eine Rücksprungadresse dazwischen.

'sl' zeigt also wirklich auf das, was vorher einmal auf dem Stack stand. vielleicht ist das ja der Button, nur liegt das dann nicht am Sender, sondern vermutlich an der Click-Verarbeitung der Button-Komponente.

Wenn sich hier nun die VCL und FM unterscheiden (wovon auszugehen ist), wäre das eine Erklärung
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:33 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