Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Warnung bei nicht initialisieren String-Result (https://www.delphipraxis.net/182381-warnung-bei-nicht-initialisieren-string-result.html)

Ralle1 20. Okt 2014 16:53

Warnung bei nicht initialisieren String-Result
 
Hallo zusammen!

Die folgende function erzeugt erwartungsgemäß eine Warnung:

Delphi-Quellcode:
function GetInteger(Value: boolean): integer;
begin
  if Value then
    Result := 1;
end;
W1035 Rückgabewert der Funktion 'GetInteger' könnte undefiniert sein

Mache ich das gleiche mit einem String als Result, wird keine Warnung generiert:

Delphi-Quellcode:
function GetString(Value: boolean): string;
begin
  if Value then
    Result := 'Value';
end;
Kann man es irgendwie konfigurieren so dass diese Warnung ausgelöst werden kann??

Man könnte nun argumentieren, dass ein String im Gegensatz zum Integer immer vorinitialisiert wird und die Warnung daher nicht nötig ist. Aber da Delphi intern scheinbar mit var-Parametern statt Result-Werten arbeitet, kann dies zu unerwartetem Verhalten führen, wenn man der Funktion eine Variable zuweist. Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Test : string;
begin
  Memo1.Lines.Clear;

  Test := GetString(true);
  Memo1.Lines.Add(Test);

  Test := GetString(false);
  Memo1.Lines.Add(Test);
end;
Das Memo enthält nach dieser Funktion tatsächlich 2 Zeilen „Value“ da die Funktion die Variable Test
als Var-Parameter nutzt, also etwa als wenn man es so schreiben würde:

Delphi-Quellcode:
procedure GetString(Value: boolean; var Result: string);


Daher würde ich gerne davor gewarnt werden, wenn ein Result String undefiniert sein könnte ?!

Der schöne Günther 20. Okt 2014 17:15

AW: Warnung bei nicht initialisieren String-Result
 
Was glaubst du, wovor ich gerne alles gewarnt werden würde. Aber im Delphi-Land lebt man anscheinend gerne gefährlich 8-)

Du hast mit der Beobachtung vollkommen Recht, siehe Doku:
http://docwiki.embarcadero.com/RADSt...nction_Results

Zitat:

For a string, dynamic array, method pointer, or variant result, the effects are the same as if the function result were declared as an additional var parameter following the declared parameters. In other words, the caller passes an additional 32-bit pointer that points to a variable in which to return the function result.

Die Doku ist natürlich auch nicht vollständig, bei IInterface ist das auch so. Bei TObject anscheinend aber nicht. Verstanden habe ich es nie.

Sir Rufo 20. Okt 2014 17:27

AW: Warnung bei nicht initialisieren String-Result
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1276732)
Die Doku ist natürlich auch nicht vollständig, bei IInterface ist das auch so. Bei TObject anscheinend aber nicht. Verstanden habe ich es nie.

Alles was eine Referenzzählung hat wird hier automatisch initialisiert.

Dazu gehören nun mal Strings und Interfaces :)

Stevie 20. Okt 2014 17:36

AW: Warnung bei nicht initialisieren String-Result
 
Jojo, der fängt bald an zu schimmeln, so alt ist der Wunsch schon:
http://qc.embarcadero.com/wc/qcmain.aspx?d=32556

Ich hab ihn mal bei Marco in Erinnerung gerufen - ein paar +10 Votes für den Eintrag würden übrigens nicht schaden :)

P.S. Der QC Windows Client bockt übrigens aktuell wegen des enorm lahmen Logins, aber über die Weboberfläche kommt man drauf.

Ralle1 21. Okt 2014 16:15

AW: Warnung bei nicht initialisieren String-Result
 
Danke für Eure Infos! Habe meine Votes abgegeben...

jbg 21. Okt 2014 16:29

AW: Warnung bei nicht initialisieren String-Result
 
Zitat:

Zitat von Stevie (Beitrag 1276738)
Ich hab ihn mal bei Marco in Erinnerung gerufen

Da bin ich ja mal gespannt. Denn (ich glaube Danny Thorpe hat das mal irgendwann erwähnt) die Warnungen werden vom Code-Generator ausgegeben und da ist im AST schon die Information drinnen, dass "Result" als var-Parameter übergeben wird (=>keine Warnung wegen nicht Initialisierung) und auch "LStrClr" und der Gleichen aufgerufen wird (=>kein Hinweis wegen ungenutzter Variable bei lokalen Variablen).

Der schöne Günther 21. Okt 2014 18:44

AW: Warnung bei nicht initialisieren String-Result
 
Zitat:

Zitat von Sir Rufo (Beitrag 1276735)
Zitat:

Zitat von Der schöne Günther (Beitrag 1276732)
Verstanden habe ich es nie.

Alles was eine Referenzzählung hat

Natürlich, darauf bin ich nicht gekommen. :balloon:

himitsu 21. Okt 2014 19:53

AW: Warnung bei nicht initialisieren String-Result
 
Im Grunde müsste doch "nur" etwas da rein, was kurz nach dem Beginn einer Funktion das Result als "nicht initialisiert" setzt, bzw. diesen Result-Var-Parameter nicht automatisch auf "initialisiert", womit dann all diese Warnungen wieder möglich werden würden. :gruebel:

Und wenn man schon dabei ist, dann bitte auch das Gleiche ebenfalls bei Schleifen-Variablen nach der For-Schleife.

Dejan Vu 22. Okt 2014 02:53

AW: Warnung bei nicht initialisieren String-Result
 
Es ist ja kein Mangel, sondern vom Compilerbauer mit Absicht so eingebaut. Das 'Feature' einfach wieder ausbauen.

Wenn das dann gleich ein Sprachfehler wird (also keine Warnung, sondern ein Compilererror), kann man sich diese dämliche Compilermagic auch sparen. Dann muss der Programmierer eben immer explizit initialisieren, was imho sowieso besser ist.

himitsu 22. Okt 2014 18:51

AW: Warnung bei nicht initialisieren String-Result
 
Warum?

Das Result und die Forschleifenvariable sind danach nunmal in einem Zustand, wo sie keinen definierten Wert besitzen.

Ja, das Result ist initialisiert, aber eben nicht mit einem
Delphi-Quellcode:
''
, nil oder Empty, so wie man es erwarten würde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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