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_VARbPointer := 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 | |
Mögliche Null-Pointer-Dereferenzierung im Implementierungsteil | |
Referenzen | |
|---|---|
Verwendung von Referenzen im Deklarationsteil | |
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 |