SA0103: Accesso concorrente a dati non atomiciPermalink

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 ‎LREAL‎ non 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'