Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Compiler warnt nicht vor nicht initialisierter Variable (https://www.delphipraxis.net/185290-compiler-warnt-nicht-vor-nicht-initialisierter-variable.html)

Der schöne Günther 28. Mai 2015 12:33

Compiler warnt nicht vor nicht initialisierter Variable
 
XE7. Windows, 32 und 64 Bit, Debug und Release.

Folgendes Beispiel:
Delphi-Quellcode:
program Project27;

{$APPTYPE CONSOLE}

{$R *.res}

procedure forProc();
var
   myArray:   TArray<Single>;
   arrayIndex:   Integer;
begin
   for arrayIndex := Low(myArray) to High(myArray) do
      if (arrayIndex = 42) then Break;

   WriteLn(arrayIndex);
   readln;
end;

begin
   forProc();
end.
Die Variable
Delphi-Quellcode:
arrayIndex
kann klar undefiniert sein. Zur Laufzeit ist sie es tatsächlich auch, denn das Array ist leer. In der Konsole steht dann z.B.
Delphi-Quellcode:
435345345
.

Warum warnt der Compiler davor nicht? Kommentiert man das
Delphi-Quellcode:
if (arrayIndex = 42) then Break;
aus, dann gibt es vernünftigerweise einen
Code:
[dcc32 Warnung] Project27.dpr(12): W1037 FOR-Schleifenvariable 'arrayIndex' kann nach Durchlauf undefiniert sein

himitsu 28. Mai 2015 12:50

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Delphi-Quellcode:
for arrayIndex := Low(myArray) to High(myArray) do
begin
  if (arrayIndex = 42) then
    Break;
end;
WriteLn(arrayIndex); // Die Variable ist außerhalb natürlich undefiniert, da Schleifenvariablen nach der Schleife keinen definierten Zustand besitzen. :roll:
"kann nach Durchlauf undefiniert sein" und "Variable nicht initialisiert" ist ja im Grunde das Selbe Gleiche.

Aber man weiß ja, daß der Compiler manchmal nicht ganz weiß was er macht und dann die falsche Fehlermeldung bringt, wobei sie hier natürlich richtig ist, auch wenn es jeweils ein bissl anders klingt.

Der schöne Günther 28. Mai 2015 13:01

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Ich verstehe nicht- Bekommst du eine Warnung? Ich nicht.

himitsu 28. Mai 2015 13:11

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Hab's nicht getestet (hier im XE oder 7), aber es ist/wäre vollkommen korrekt, wenn bei
Delphi-Quellcode:
WriteLn(arrayIndex);
eine Warnung kommt, daß die Variable dort nicht (mehr) initialisiert ist, denn das ist sie auch nicht.

Hab das "nicht" nicht gelesen.
Hmmm, entweder ein Bug ... kann daheim dann nochmal nachsehn, aber mir ist so, als wenn da immer gewarnt wurde (wobei ich sowas selten mach)

nuclearping 28. Mai 2015 15:49

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Habs mal mit XE2 und XE7 getestet. Gleiches Ergebnis wie Günther schon sagte. Ich erhalte keine Warnung und
Delphi-Quellcode:
WriteLn(arrayIndex)
gibt Müll aus. Wenn ich die
Delphi-Quellcode:
if (arrayIndex ...)
-Prüfung auskommentiere, erhalte ich auch eine W1037-Warnung.

Union 28. Mai 2015 16:30

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Der Compiler kann zur Compilezeit ja nicht wissen dass High(myArray) = -1 ist. Er sieht nur das for-Konstrukt in dem ja theoretisch eine Zuweisung erfolgt.

Sailor 28. Mai 2015 17:36

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Das liegt an der Break-Anweisung. Der Compiler stellt nach dem Break den aktuellen Schleifenindex zur Verfügung. Kommentiere nur das Break aus, dann dürfte eine Warnung kommen.

Der schöne Günther 28. Mai 2015 17:43

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Aber wir wären uns alle einig dass wir Embarcaderos "Reported Bugs" wieder um eins größer machen sollten, oder?

himitsu 28. Mai 2015 18:19

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Jupp, so schnell wie möglich melden.
Jede Stunde früher scheint 'nen Monat eher bereinigt zu sein.

Man könnte noch schauen, was die verschiedenen Compiler dazu sagen (Win64, iOS32, iOS64, OSX, Linux, ...)
und mit oder ohne Generics.

Der schöne Günther 28. Mai 2015 18:31

AW: Compiler warnt nicht vor nicht initialisierter Variable
 
Höre ich da Sarkasmus?

Win64 hatte ich eingangs auch geprüft, die anderen Plattformen kann ich nicht. Wäre mal interessant. Wäre jemand so freundlich? :angel2:

Übrigens: Die
Delphi-Quellcode:
for..in
-Schleife ist nicht betroffen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr.
Seite 1 von 2  1 2      

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