Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi nicht initialisierte Variable erzeugt keine Warnung/Hinweis (https://www.delphipraxis.net/202521-nicht-initialisierte-variable-erzeugt-keine-warnung-hinweis.html)

AJ_Oldendorf 13. Nov 2019 10:21

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?

TiGü 13. Nov 2019 10:33

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Liste der Anhänge anzeigen (Anzahl: 1)
Geht auf jeden Fall noch für Delphi Tokyo:

Moombas 13. Nov 2019 10:46

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.

Der schöne Günther 13. Nov 2019 10:47

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Das sind die Stellen wo ich echt jegliche Hoffnung verliere. Kleinstes nachzustellendes Beispiel:

Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var
   sl: TStringList;
begin
   sl.Text := '';
   FreeAndNil(SL);
end;
wirft in 10 Seattle auch keine Warnung.

Wahrscheinlich irgendein Zusammenhang mit untypisierten Parametern:

Delphi-Quellcode:
procedure acceptUntyped(const obj);
begin
   // do nothing
end;

procedure TForm2.FormCreate(Sender: TObject);
var
   obj: TObject;
begin
   obj.ClassName(); // << no warning
   acceptUntyped(obj);
end;
Das ist dem Compiler auch keine Warnung wert.

Neutral General 13. Nov 2019 10:55

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var
   sl: TStringList;
begin
   sl.Text := '';
   sl.Free;
end;
Das wirft eine Warnung. Ich schätze der Compiler denkt, dass sl ggf. in FreeAndNil initialisiert wird (wegen dem var Parameter).
Ist natürlich trotzdem falsch (in dem Fall) weil ja schon vor der potenziellen Initialisierung in FreeAndNil auf sl zugegriffen wird.

Incocnito 13. Nov 2019 11:31

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

Der schöne Günther 13. Nov 2019 11:37

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.

Incocnito 13. Nov 2019 11:50

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Delphi-Quellcode:
class function TObject.ClassName: string;
begin
  Result := UTF8ToString(_PShortStr(PPointer(PByte(Self) + vmtClassName)^)^);
end;
Hast offensichtlich recht! ... Das wiederspricht gerade meiner
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

AJ_Oldendorf 13. Nov 2019 11:50

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?

TiGü 13. Nov 2019 12:41

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1451269)
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?

Vergleiche nochmal dein und meinen Screenshot!
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.

Incocnito 13. Nov 2019 15:25

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Das FreeAndNil sehe ich gar nicht mal als Problem.
Ich könnte ja auch Funktionen nutzen um Variablen zu initialisieren:
Delphi-Quellcode:
Procedure Testa(var test : TStringList);
Begin
  test := TStringList.Create();
  test.Add('Testzeile');
End;

Procedure Testb();
var
  slTemp : TStringList;
Begin
  Testa(slTemp); // alles wunderbar
  ShowMessage(slTemp.Text);
  slTemp.Free();
End;
Das Problem ist eher, dass er bei "sl.Text = '';" direkt in der ersten Zeile,
nicht meckert, obwohl "sl" definitiv nicht initialisiert ist.
Wird das wohl durch "try-except" wegoptimiert?

Und lokale Variablen muss man trotzdem freigeben.
Arrays braucht man nicht mit "SetLength(x, 0);" freigeben,
aber sonst muss alles, was erzeugt wird auch freigegeben werden.
Ahja: Interfaces haben einen Referenzzähler, so dass das noch
wieder anders läuft.
Auch zur Laufzeit erstellte Komponenten muss man nicht unbedingt freigeben,
weil sie ja einem Parent zugeordnet werden und freigegeben werden, wenn
das Parent freigegeben wird.
Mehr Außnahmen fallen mir gerade nicht ein, ansonsten empfehle ich MadExcept
zum Testen auf Speicherlecks.

MfG Incocnito

jaenicke 14. Nov 2019 04:42

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Es wird immer Konstellationen geben, in denen der Compiler nicht warnt oder nicht warnen kann. Von daher finde ich es gut, dass in vielen Fällen gewarnt wird, verlasse mich aber nicht darauf.

Es gibt auch diverse Tools, die zusätzliche Analysen machen:
TMS FixInsight, Pascal Analyzer, CodeHealer, ...

Zitat:

Zitat von Incocnito (Beitrag 1451281)
Auch zur Laufzeit erstellte Komponenten muss man nicht unbedingt freigeben,
weil sie ja einem Parent zugeordnet werden und freigegeben werden, wenn
das Parent freigegeben wird.

Owner <> Parent!
Der Owner kümmert sich um die Freigabe, das Setzen des Parents bestimmt wo die Komponente angezeigt wird.

DeddyH 14. Nov 2019 06:53

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Auch der Parent geht im Destruktor sein Controls-Array durch und gibt die darin enthaltenen Elemente frei.

Incocnito 14. Nov 2019 07:17

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1451284)
Hier wir das Objekt slTemp in der Funktion Testa() initilialisiert, und diese wird in Testb() aufgerufen. Wo ist das Problem?

Exakt darauf wollte ich hinaus! ;)

Zitat:

Zitat von DeddyH (Beitrag 1451300)
Auch der Parent geht im Destruktor sein Controls-Array durch und gibt die darin enthaltenen Elemente frei.

Exakt daran dachte ich auch ... das "Parent <> Owner" gibt mir gerade zu denken.

Abgesehen davon gehe ich bei selbst erstellten Komponenten immer hin und gebe die auch von Hand frei,
ich weiß halt nur, dass es wohl scheinbar auch ohne diesen Aufwand ohne Speicherlecks gehen soll.

MfG Incocnito

Stevie 14. Nov 2019 10:36

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
https://quality.embarcadero.com/browse/RSP-19835

jaenicke 14. Nov 2019 11:10

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Zitat:

Zitat von Incocnito (Beitrag 1451304)
Zitat:

Zitat von DeddyH (Beitrag 1451300)
Auch der Parent geht im Destruktor sein Controls-Array durch und gibt die darin enthaltenen Elemente frei.

Exakt daran dachte ich auch ... das "Parent <> Owner" gibt mir gerade zu denken.

Dann habe ich mich da geirrt.

AJ_Oldendorf 10. Jun 2020 08:35

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Fehler existiert in D10.4 immernoch.
Neuen Bug-Report aufgemacht. Bitte voten...

https://quality.embarcadero.com/browse/RSP-29516

Der schöne Günther 10. Jun 2020 08:53

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Ist natürlich ärgerlich, aber weshalb war es nötig dafür noch ein Ticket aufzumachen?

AJ_Oldendorf 10. Jun 2020 09:54

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Ich dachte mir, wenn der andere Report nicht bearbeitet wird, wird er vielleicht bearbeitet wenn er unter dem neusten Delphi steht. Da gucken die Entwickler vielleicht eher drauf und reagieren, weil dazu noch einige Updates kommen werden.

AJ_Oldendorf 10. Jun 2020 12:16

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Mein Report wurde gerade geschlossen mit Verweis auf den Report von Bernhard Geyer
Leider existiert dieser ja schon seit einigen Versionen.
@Bernhard Geyer: Kannst du dein Report mal aktualisieren, dass dieser Fehler auch noch in 10.4 enthalten ist? Es steht ja nur dabei, dass dieser in 10.2 vorhanden ist. Vielleicht wird er dann eher bearbeitet weil gevotet wurde ja schon dafür

TurboMagic 10. Jun 2020 20:18

AW: nicht initialisierte Variable erzeugt keine Warnung/Hinweis
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1466944)
Mein Report wurde gerade geschlossen mit Verweis auf den Report von Bernhard Geyer
Leider existiert dieser ja schon seit einigen Versionen.
@Bernhard Geyer: Kannst du dein Report mal aktualisieren, dass dieser Fehler auch noch in 10.4 enthalten ist? Es steht ja nur dabei, dass dieser in 10.2 vorhanden ist. Vielleicht wird er dann eher bearbeitet weil gevotet wurde ja schon dafür

Der wird dann aiuch nicht wirklich eher bearbeitet.
Es wäre zwar schön, wenn der Compiler da warnen würde, da das aber kein kriegsentscheidender Bug ist hat er halt nicht die höchste Priorität.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf