SA0077: Unstimmigkeit des Enumerationstyps mit CASE-Ausdruck

Funktion

Erkennt Codepositionen, an denen eine CASE-Anweisung Enumerationswerte mit Nicht-Enumerationstypen vermischt.

Begründung

Die Vermischung von Enumerationswerten und Integer-Werten in CASE-Konstrukten verletzt die Datentypsicherheit, verringert die Lesbarkeit des Codes und beeinträchtigt die Wartbarkeit. Enumerationswerte sorgen für semantische Klarheit. Die Verwendung von rohen Integer-Werten bergen das Risiko subtiler Fehler und machen den Code schwerer verständlich. Datentypänderungen an Enumerationen können außerdem Integer-basierte Verzweigungen unbemerkt zerstören.

Wichtigkeit

Niedrig

Beispiel:

Enumeration E_Sample:

TYPE E_Sample :
(
    eNull,
    eOne,
    eTwo
) DWORD;
END_TYPE

Programm MAIN:

PROGRAM MAIN
VAR
    nDINT   : DINT;
    eSample : E_Sample;
    bVar    : BOOL;
END_VAR
nDINT := nDINT + DINT#1;
 
CASE nDINT OF
    DINT#1:
         bVar := FALSE;
 
    E_Sample.eTwo:               // => SA0077
         bVar := TRUE;
 
ELSE
    bVar := NOT bVar;
END_CASE
 
CASE eSample OF
    DINT#1:                      // => SA0077
         bVar := FALSE;
 
    E_Sample.eTwo:
         bVar := TRUE;
 
ELSE
    bVar := NOT bVar;
END_CASE