SA0103: Concurrent access on not atomic data
Detects whether or not non-atomic variables (for example, with data type STRING, WSTRING, ARRAY, STRUCT, FB instances, 64-bit data types) are used in more than one task
Justification: When there is no synchronization during access, inconsistent values can be read when reading in one task and writing in another task at the same time.
Importance: Medium
Tip
For some data types, especially 64-bit integers, it depends on the platform whether or not access is atomic. Static analysis reports a problem only when the controller does not support atomic access to 64-bit integer data types.
This rule does not apply in the following cases:
If the target system has a floating point unit (FPU), then access of multiple tasks to
LREALvariables is not detectedIf the target system is a 64-bit processor or the corresponding target setting is set for the target device, then the rule does not apply to 64-bit data types
The project contains both programs, PRG1 and PRG2.
The program PRG1 is called by the task MainTask_1. The program PRG2 is called by the 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_VARPROGRAM 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;
Output in the Messages view:
SA0103: Concurrent access on not atomic data 'sTest'
SA0103: Concurrent access on not atomic data 'wsTest'