SA0124: Dereferenzierungszugriff in Initialisierungen

Funktion

Ermittelt alle Codestellen, an denen dereferenzierte Pointer im Deklarationsteil von POUs verwendet werden.

Begründung

Pointer und Referenzen sollten nicht für Initialisierungen verwendet werden, weil es dadurch zur Laufzeit zu Zugriffsverletzungen ("Access Violations") kommen kann, wenn der Pointer nicht initialisiert worden ist.

Wichtigkeit

Mittel

Beispiele:

FUNCTION_BLOCK FB_Test
VAR_INPUT
    pStruct    : POINTER TO ST_Test;
    refStruct  : REFERENCE TO ST_Test;
END_VAR
VAR
    bPointer   : BOOL := pStruct^.bTest;  // => SA0124: Dereference access in initialization
    bRef       : BOOL := refStruct.bTest; // => SA0125: Reference used in initialization
END_VAR
bPointer := pStruct^.bTest;               // => SA0039: Possible null pointer dereference 'pStruct^'
bRef     := refStruct.bTest;              // => SA0145: Possible use of not initialized reference 'refStruct'
 
IF pStruct <> 0 THEN
    bPointer := pStruct^.bTest;           // no error SA0039 as the pointer is checked for unequal 0
END_IF

IF __ISVALIDREF(refStruct) THEN
    bRef     := refStruct.bTest;          // no error SA0145 as the reference is checked via __ISVALIDREF
END_IF

Überblick über die Regeln zum Thema „Dereferenzierung“

Pointer

Dereferenzierung von Pointern im Deklarationsteil

SA0124: Dereferenzierungszugriff in Initialisierungen

Mögliche Null-Pointer-Dereferenzierung im Implementierungsteil

SA0039: Mögliche Null-Pointer-Dereferenzierung

Referenzen

Verwendung von Referenzen im Deklarationsteil

SA0125: Referenzen in Initialisierungen

Mögliche Verwendung nicht initialisierter Referenzen im Implementierungsteil

SA0145: Mögliche Verwendung nicht initialisierter Referenzen

Schnittstellen

Mögliche Verwendung nicht initialisierter Schnittstellen im Implementierungsteil

SA0046: Mögliche Verwendung nicht initialisierter Schnittstellen