SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten

Ermittelt, ob nicht-atomare Variablen (zum Beispiel mit Datentyp STRING, WSTRING, ARRAY, STRUCT, FB-Instanzen, 64-Bit-Datentypen) in mehr als einer Task verwendet werden.

Begründung: Wenn keine Synchronisation beim Zugriff erfolgt, dann kann es bei gleichzeitigem Lesen in einer Task und Schreiben in einer anderen Task dazu kommen, dass inkonsistente Werte gelesen werden.

Wichtigkeit: Mittel

VORSCHLAG:

Für manche Datentypen, insbesondere 64-Bit-Integer, ist es von der Plattform abhängig, ob der Zugriff atomar erfolgt oder nicht. Die statische Codeanalyse meldet ein Problem nur, wenn die Steuerung den atomaren Zugriff auf 64-Bit-Integer-Datentypen nicht unterstützt.

In folgenden Fällen greift diese Regel nicht:

Beispiel

Das Projekt enthält die beiden Programme PRG1 und PRG2.

Das Programm PRG1 wird von der Task MainTask_1 aufgerufen, das Programm PRG2 von der Task MainTask_2.

GVL
VAR_GLOBAL
        lrTest : LREAL;   // Since the target system has an FPU, SA0103 does apply.
        lint1 : LINT;
        sTest : STRING;   // SA0103
        wsTest : WSTRING; // SA0103
END_VAR

PROGRAM PRG1
GVL.lrTest := 5.0;
GVL.sTest := 'welt';
GVL.wsTest := "welt";
GVL.lint1 := 99;

PROGRAM PRG2
GVL.lrTest := 5.0;
GVL.sTest := 'hallo';
GVL.wsTest := "hallo";
GVL.lint1 := 88;

--> SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten 'sTest'
--> SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten 'wsTest'