SA0039: Mögliche Null-Pointer-Dereferenzierung
Funktion | Ermittelt Codestellen, an denen möglicherweise ein Null-Pointer dereferenziert wird. |
Begründung | Ein Pointer sollte vor jeder Dereferenzierung daraufhin geprüft werden, ob er ungleich 0 ist. Ansonsten kann es zu Zugriffsverletzungen (“Access Violation”) zur Laufzeit kommen. |
Wichtigkeit | Hoch |
Beispiel 1:
PROGRAM MAIN
VAR
pInt1 : POINTER TO INT;
pInt2 : POINTER TO INT;
pInt3 : POINTER TO INT;
nVar1 : INT;
nCounter : INT;
END_VARnCounter := nCounter + INT#1;
pInt1 := ADR(nVar1);
pInt1^ := nCounter; // no error
pInt2^ := nCounter; // => SA0039
nVar1 := pInt3^; // => SA0039Beispiel 2:
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 |