Rileva se le variabili non atomiche (ad esempio, con il tipo di dati STRING, WSTRING, ARRAY, STRUCT, istanze di FB, tipi di dati a 64 bit) sono utilizzate in più di un task.
Giustificazione: Se non c'è sincronizzazione durante l'accesso, è possibile leggere valori incoerenti quando si legge in un task e si scrive contemporaneamente in un altro task.
Importanza: Medio
Per alcuni tipi di dati, in particolare gli interi a 64 bit, dipende dalla piattaforma se l'accesso è atomico o meno. L'analisi statica segnala un problema solo quando il controllore non supporta l'accesso atomico ai tipi di dati interi a 64 bit.
Questa regola non si applica nei seguenti casi:
-
Se il sistema di destinazione ha un'unità in virgola mobile (FPU), l'accesso di più task alle variabili di
LREALnon viene rilevato. -
Se il sistema di destinazione è un processore a 64 bit o l'impostazione di destinazione corrispondente è impostata per il dispositivo di destinazione, la regola non si applica ai tipi di dati a 64 bit.
Esempio
Il progetto contiene entrambi i programmi, PRG1 e PRG2: Il programma PRG1 è chiamato dal task MainTask_1. Il programma PRG2 è chiamato dal 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: Concurrent access on not atomic data 'sTest' --> SA0103: Concurrent access on not atomic data 'wsTest'