SA0103: Accesso simultaneo a dati non atomici
Determina se le variabili non atomiche (ad es. con tipo di dati STRING
, WSTRING
, ARRAY
, STRUCT
, istanze FB, tipi di dati a 64 bit) possono essere utilizzati in più task.
Motivo: se non c'è sincronizzazione durante l'accesso, la lettura in un'attività e la scrittura in un'altra attività possono comportare la lettura di valori incoerenti.
Importanza: Media
Suggerimento
Per alcuni tipi di dati, in particolare interi a 64 bit, il fatto che l'accesso sia atomico o meno dipende dalla piattaforma. L'analisi del codice statico segnala un problema solo se il controller 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 dispone di una FPU (Floating Point Unit), l'accesso a più attività è limitato
LREAL
-Variabili non determinateSe il sistema di destinazione è un processore a 64 bit o è impostata l'impostazione di destinazione appropriata per il dispositivo di destinazione, la regola non si applica ai tipi di dati a 64 bit
Il progetto contiene i due programmi PRG1
e PRG2
.
Il programma PRG1
viene chiamato dal compito MainTask_1
. Il programma PRG2
viene chiamato dal compito 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;
Uscita in Messaggi vista:
SA0103: Accesso simultaneo su dati non atomici 'sTest'
SA0103: Accesso simultaneo su dati non atomici 'wsTest'