AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

Ein Thema von Der schöne Günther · begonnen am 2. Dez 2021 · letzter Beitrag vom 21. Nov 2024
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

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

Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 2. Dez 2021, 21:05
Delphi-Version: 10 Seattle
Ich bekomme bei folgendem case -Statement eine Warnung, dass eine Variable "möglicherweise" nicht initialisiert sein könnte:
Delphi-Quellcode:
type
   TEnum = (a, b, c);
var
   myEnum: TEnum;
   value: Byte;
begin
   myEnum := TEnum.a;
   case myEnum of
      TEnum.a:   value := 10;
      TEnum.b:   value := 20;
      TEnum.c:   value := 30;
   end;
   WriteLn(value); // W1036"might not have been initialized"
   // altough the case statement is exhaustive
end.
Bei C++ ist der Compiler schlau genug:
Code:
enum Enum {a, b, c};

int main(int argc, char **argv) {
   Enum e = Enum::b;
   char c;
   switch (e)
   {
      case Enum::a:
         c = 1;
         break;
      case Enum::b:
         c = 2;
         break;
      case Enum::c:
         c = 3;
         break;
   }   

   std::cout << c;
   return NO_ERROR;
}
Bei Sprachen wie Swift oder Rust bricht der Compiler mit einem Fehler ab, wenn ein match-Statement nicht vollständig ist.

Delphi bekommt von all dem aber nichts mit, und redet sich damit raus, dass es "möglicherweise" undefiniert sein könnte.
Zumindest in 10.0 Seattle.

Ist das in einer aktuellen Delphi-Version immer noch so?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 2. Dez 2021, 21:09
Jupp, denn Delphi weiß, dass in deinem Enum noch 253 weitere Werte sein können.

z.B. myEnum := TEnum(123);


Sowas kannst du nur ausschließen, wenn bei Zuweisung an diese Variable der Wertebereich geprüft wird,
und wenn man sämtliche Fehler ausschließen kann, z.B. böse Casts, fehlgeleitete Pointer, Buffer-Overflow, Häcker/Würmer/Viren, usw.
$2B or not $2B

Geändert von himitsu ( 2. Dez 2021 um 21:12 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 2. Dez 2021, 21:14
Oder es heißt dass der Teil der die Fehlermeldungen generiert gar nichts mehr von Enums weiß, da er nur noch mit blanken Zahlentypen arbeitet.

Oh mann... 😕
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#4

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 2. Dez 2021, 21:32
Ich füge dem case oft noch ein else hinzu, wobei dann im Debug eine Exception ausgelöst wird und im Release passiert nichts.
Kommt später was zur Aufzählung hinzu, so erinnert mich die Exception dann, das noch was fehlt.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 3. Dez 2021, 00:32
Ich füge dem case oft noch ein else hinzu, wobei dann im Debug eine Exception ausgelöst wird und im Release passiert nichts.
Kommt später was zur Aufzählung hinzu, so erinnert mich die Exception dann, das noch was fehlt.
Bei mir auch. Genau so.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 3. Dez 2021, 00:47
Ich werfe die Exceptions immer, egal ob Debug oder Release.
Oder setze im Else die Variable auf NIL, was eh sein muß, weil ja sonst der Compiler von nicht-initialisierten Variablen schwafelt.

Abgesehn da, wo eh immer nur ein Teil behandelt wird.
$2B or not $2B
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#7

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 3. Dez 2021, 07:41
Ich setze IMMER ein "else", weil man ja schnell mal einen Typen ergänzt und dabei ein case statement vergisst.
Das macht es dann "sichtbarer", fehlertolerant und die Fehlersuche ist dann viel leichter als wenn man sich auf Compiler-Automatismen verlassen würde.
Deswegen finde ich das Warning auch gut und richtig.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 19. Nov 2024, 20:59
Bei Sprachen wie Swift oder Rust bricht der Compiler mit einem Fehler ab, wenn ein match-Statement nicht vollständig ist.
Oh wie gruselig ist das den?

Wieso soll ich den immer alles definieren? Vielleicht will ich mit der Case ja nur Teile prüfen...

Oder übersehen ich da etwas?

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 19. Nov 2024, 21:17
Wieso soll ich den immer alles definieren? Vielleicht will ich mit der Case ja nur Teile prüfen...

Oder übersehen ich da etwas?
Nein, da übersiehst du nichts. Aber das Problem ist dabei, dass solcher Code auch fehleranfällig ist. Denn du merkst ja gar nicht, wenn ein Enum erweitert wird und der Fall nicht behandelt wird. Wenn mehrere Entwickler an einem Projekt arbeiten, passiert so leicht ein Fehler.

Genau aus diesen Gründen wird das in Rust und anderen Sprachen geprüft und genau deshalb werden diese an sicherheitsrelevanten Stellen gerne eingesetzt.

Für den von dir beschriebenen Fall kann man z.B. mit if-Statements arbeiten.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
252 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Delphi merkt nicht wenn ein case-Statement vollständig ist, oder?

  Alt 20. Nov 2024, 07:17
Ich denke, ein 'Defaultwert' ist immer wichtig. Ob man den jetzt im else setzt oder (was ich inzwischen, auch weil ich beginne die Exit Anweisung einzusetzen, gerne mache) vor der Unterscheidung erstmal einen Wert zuzuweisen, ist in meinen Augen (fast) egal. Beim Else offenbart sich ein Fehler (d.h. eine 'unerwartete' Bedingung) eher, was in der Entwicklung wünschenswert, beim Kunden aber ggf. kontraproduktiv ist.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:47 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