AGB  ·  Datenschutz  ·  Impressum  







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

Warnung bei nicht initialisieren String-Result

Ein Thema von Ralle1 · begonnen am 20. Okt 2014 · letzter Beitrag vom 22. Okt 2014
Antwort Antwort
Ralle1

Registriert seit: 2. Nov 2011
49 Beiträge
 
Delphi XE3 Professional
 
#1

Warnung bei nicht initialisieren String-Result

  Alt 20. Okt 2014, 17:53
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:

procedure GetString(Value: boolean; var Result: string);

Daher würde ich gerne davor gewarnt werden, wenn ein Result String undefiniert sein könnte ?!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Warnung bei nicht initialisieren String-Result

  Alt 20. Okt 2014, 18:15
Was glaubst du, wovor ich gerne alles gewarnt werden würde. Aber im Delphi-Land lebt man anscheinend gerne gefährlich

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.

Geändert von Der schöne Günther (20. Okt 2014 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Warnung bei nicht initialisieren String-Result

  Alt 20. Okt 2014, 18:27
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Warnung bei nicht initialisieren String-Result

  Alt 20. Okt 2014, 18:36
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (20. Okt 2014 um 18:44 Uhr)
  Mit Zitat antworten Zitat
Ralle1

Registriert seit: 2. Nov 2011
49 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Warnung bei nicht initialisieren String-Result

  Alt 21. Okt 2014, 17:15
Danke für Eure Infos! Habe meine Votes abgegeben...
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Warnung bei nicht initialisieren String-Result

  Alt 21. Okt 2014, 17:29
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).
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Warnung bei nicht initialisieren String-Result

  Alt 21. Okt 2014, 19:44
Verstanden habe ich es nie.
Alles was eine Referenzzählung hat
Natürlich, darauf bin ich nicht gekommen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Warnung bei nicht initialisieren String-Result

  Alt 21. Okt 2014, 20:53
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.

Und wenn man schon dabei ist, dann bitte auch das Gleiche ebenfalls bei Schleifen-Variablen nach der For-Schleife.
$2B or not $2B
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Warnung bei nicht initialisieren String-Result

  Alt 22. Okt 2014, 03:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Warnung bei nicht initialisieren String-Result

  Alt 22. Okt 2014, 19:51
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 '' , nil oder Empty, so wie man es erwarten würde.
$2B or not $2B

Geändert von himitsu (22. Okt 2014 um 19:54 Uhr)
  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 23:21 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