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_VAR
nCounter := nCounter + INT#1;
 
pInt1    := ADR(nVar1);
pInt1^   := nCounter;            // no error
 
pInt2^   := nCounter;            // => SA0039
nVar1    := pInt3^;              // => SA0039

Beispiel 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_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