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
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:
Wenn das Zielsystem eine FPU (Floating Point Unit) besitzt, wird der Zugriff mehrerer Tasks auf LREAL
-Variablen nicht ermittelt
Wenn das Zielsystem ein 64-Bit-Prozessor ist oder das entsprechende Target Setting für das Zielgerät gesetzt ist, greift die Regel nicht für 64-Bit-Datentypen
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'