Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

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

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung

  Alt 19. Sep 2014, 12:16
Wieso nicht? C# kann das doch auch. Eine Variable ist genau dann nicht initialisiert, wenn -grob gesehen- das erste Anfassen der Variablen keine Zuweisung an diese Variable ist, also
Delphi-Quellcode:
if (variable) then...
CallMethod(variable); // Parameter ist kein var/out
someOtherVariable := variable;
variable := variable + 1;
Was vergessen? Bestimmt. Aber das Prinzip ist klar.
Nja, bestimmte Typen im Delphi werden automatisch verwaltet und da scheitert dann diese Prüfung, weil sie ja "im Prinzip" initialisiert sind.
Mit einem kleinen Problem, welcher aber erst auffällt, wenn man die Interna kennt. (drum wird auch bei einem Integer gewarnt, aber nicht bei einem String)
Delphi-Quellcode:
function Test1: Integer;
var
  i: Integer;
begin
  if i = 0 then ;
end;

function Test2: string;
var
  S: string;
begin
  if S = 'then ;
end;
[DCC Warnung] ...: W1036 Variable 'i' ist möglicherweise nicht initialisiert worden
[DCC Warnung] ...: W1035 Rückgabewert der Funktion 'Test1' könnte undefiniert sein
Aber bei den beiden Strings gibt es keine Warnung.

Wie gesagt, Strings (mit Ausnahme des ShortString) und andere Typen werden automatisch initialisiert, da sonst die automatische Speicherverwaltung nicht funktionieren würde.

function Test(i: Integer): string; wird vom Compiler intern als procedure Test(i: Integer; var Result: string); umgesetzt.
Hier übernimmt der Aufrufer die Initialisierung, was oftmals nicht auffällt, aber ruf mal diese Funktion in einer Schleife auf.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat