Skip to main content

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

Tipp

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 92. 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.

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;

Ausgabe unter Ansicht Meldungen:

  • sa_icon_message.png SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten 'sTest'

  • sa_icon_message.png SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten 'wsTest'