Skip to main content

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 LREAL variables is not detected

  • If 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

Example 92. Example

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_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;

Output in the Messages view:

  • sa_icon_message.png SA0103: Concurrent access on not atomic data 'sTest'

  • sa_icon_message.png SA0103: Concurrent access on not atomic data 'wsTest'