Skip to main content

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ée

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

Exemple 92. Exemple

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:

  • sa_icon_message.png SA0103 : Accès simultané sur des données non atomiques 'sTest'

  • sa_icon_message.png SA0103 : Accès simultané aux données non atomiques 'wsTest'