SA0103 : Accès simultané sur des données non atomiques
Détecte si oui ou non les variables non atomiques (par exemple, avec le type de données STRING
, WSTRING
, ARRAY
, STRUCT
, instances FB, types de données 64 bits) sont utilisés dans plusieurs tâches
Justification : Lorsqu'il n'y a pas de synchronisation lors de l'accès, des valeurs incohérentes peuvent être lues lors de la lecture dans une tâche et de l'écriture dans une autre tâche en même temps.
Importance : Moyenne
Astuce
Pour certains types de données, en particulier les entiers 64 bits, cela dépend de la plate-forme si l'accès est atomique ou non. L'analyse statique signale un problème uniquement lorsque le contrôleur ne prend pas en charge l'accès atomique aux types de données entiers 64 bits.
Cette règle ne s'applique pas dans les cas suivants :
Si le système cible dispose d'une unité à virgule flottante (FPU), l'accès à plusieurs tâches pour
LREAL
la variable n'est pas détectéeSi le système cible est un processeur 64 bits ou si le paramètre cible correspondant est défini pour le périphérique cible, la règle ne s'applique pas aux types de données 64 bits
Le projet contient les deux programmes, PRG1
et PRG2
.
Le programme PRG1
est utilisé par la tâche MainTask_1
appelé le programme PRG2
de la tâche 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;
Sortie dans le messages voir:
SA0103 : Accès simultané sur des données non atomiques 'sTest'
SA0103 : Accès simultané aux données non atomiques 'wsTest'