nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,
warum erzeugt der Code im Screenshot mit den entsprechenden Einstellungen keine Warnung/Hinweis, dass SL nicht initialisiert ist? |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Liste der Anhänge anzeigen (Anzahl: 1)
Geht auf jeden Fall noch für Delphi Tokyo:
|
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Also ich gehe davon aus, das er es hier als Intitialisierung auch im Try-Block ansieht.
Wenn du SL.Text jedoch "anwenden" würdest (z.B. ABC.Text := SL.Text; ohne vorher SL.Text := ''; ), denke ich das du die Fehlermeldung erhalten müsstest. Das du die Stringlist gar nicht created hast scheint, ihn nicht zu interessieren. |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Das sind die Stellen wo ich echt jegliche Hoffnung verliere. Kleinstes nachzustellendes Beispiel:
Delphi-Quellcode:
wirft in 10 Seattle auch keine Warnung.
procedure TForm2.FormCreate(Sender: TObject);
var sl: TStringList; begin sl.Text := ''; FreeAndNil(SL); end; Wahrscheinlich irgendein Zusammenhang mit untypisierten Parametern:
Delphi-Quellcode:
Das ist dem Compiler auch keine Warnung wert.
procedure acceptUntyped(const obj);
begin // do nothing end; procedure TForm2.FormCreate(Sender: TObject); var obj: TObject; begin obj.ClassName(); // << no warning acceptUntyped(obj); end; |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Delphi-Quellcode:
Das wirft eine Warnung. Ich schätze der Compiler denkt, dass sl ggf. in FreeAndNil initialisiert wird (wegen dem var Parameter).
procedure TForm2.FormCreate(Sender: TObject);
var sl: TStringList; begin sl.Text := ''; sl.Free; end; Ist natürlich trotzdem falsch (in dem Fall) weil ja schon vor der potenziellen Initialisierung in FreeAndNil auf sl zugegriffen wird. |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
TObject.ClassName ist eine class function ... da macht es ja sogar noch Sinn,
dass er nicht extra meckert, wenn darauf ohne Objekt zugegriffen wird, da bei einer class function ja eh nicht auf das Objekt zugegriffen werden kann. Warum das andere keine Warnung wirft, erschließt sich mir auch gerade nicht. MfG Incocnito |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
ClassName ist aber kein Makro, sondern schon eine richtige Funktion die zur Laufzeit nachschlagen muss welche Klasse das Objekt denn ist. Es ist also nicht ok, keine Warnung zu generieren.
Delphi-Quellcode:
procedure p();
var x, y, z: TObject; begin x := TObject.Create(); y := TInterfacedObject.Create(); z := nil; WriteLn( x.ClassName() ); WriteLn( y.ClassName() ); WriteLn( z.ClassName() ); end; Es gibt echt noch tausend andere Fälle dass der Compiler vor offensichtlichen Fehlern nicht warnt. Embarcadero stolpert ja selbst darüber, TJson.Format(..) beispielsweise hat bis vor ein, zwei Versionen ungültiges Json ausgespuckt weil der Rückgabewert nicht richtig initialisiert wurde und der Compiler davor nicht warnt. |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Delphi-Quellcode:
Hast offensichtlich recht! ... Das wiederspricht gerade meiner
class function TObject.ClassName: string;
begin Result := UTF8ToString(_PShortStr(PPointer(PByte(Self) + vmtClassName)^)^); end; Auffassung davon, wie class function gedacht sind ... Ich hätte behauptet, sowas müsse als "normale" Funktion deklariert werden! Also wieder zurück in den Grundkurs "wozu class function?"! :oops: Edit: Gerade herausgefunden: "Self" ist bei einer class function die Klasse und nicht die Instanz. ... Weltordnung größtenteils wieder hergestellt! MfG Incocnito |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Wenn es unter Tokyo noch ging, schließe ich darauf, dass es ein Fehlverhalten in 10.3 ist oder?
Würde ein QC daraus machen oder hat noch jemand eine Idee? |
AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
Zitat:
Du nutzt FreeAndNil, was bei einer lokalen Variablen völlig überflüssig ist. Probiere einfach mal SL.Free und schaue, ob die richtige Warnung kommt. Wenn nein: Dann ist es eine Regression. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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