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'