Skip to main content

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 determinate

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

Esempio 92. Esempio

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:

  • sa_icon_message.png SA0103: Accesso simultaneo su dati non atomici 'sTest'

  • sa_icon_message.png SA0103: Accesso simultaneo su dati non atomici 'wsTest'