SA0145: Mögliche Verwendung nicht initialisierter Referenzen

Funktion

Ermittelt alle verwendeten Referenzvariablen, die möglicherweise vor der Verwendung nicht initialisiert werden und nicht durch den Operator __ISVALIDREF überprüft wurden. Diese Regel wird im Implementierungsteil von POUs angewendet.

Begründung

Eine Referenz sollte vor dem Zugriff auf Gültigkeit geprüft werden, weil es sonst beim Zugriff zur Laufzeit zu einer Zugriffsverletzung ("Access Violation") kommen kann.

Wichtigkeit

Hoch

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