Skip to main content

SA0066 : Utilisations des résultats temporaires

Détecte l'utilisation de résultats temporaires dans des instructions avec un type de données inférieur à la taille du registre. Dans ce cas, la conversion implicite peut conduire à des résultats indésirables.

Justification : Pour des raisons de performances, CODESYS Static Analysis effectue des opérations sur la largeur de registre du processeur. Les résultats intermédiaires ne sont pas tronqués. Cela peut conduire à des interprétations erronées, comme dans le cas suivant :

Exemple 78. Exemple
usintTest := 0; xError := usintTest - 1 <> 255;

Dans CODESYS, xError est TRUE dans ce cas parce que l'opération usintTest - 1 est généralement exécuté comme une opération 32 bits et le résultat n'est pas converti en taille d'octet. Alors la valeur 16#ffffffff (différent de 255) se trouve dans le registre.

Pour éviter cela, vous devez convertir explicitement le résultat intermédiaire :

xError := TO_USINT(usintTest - 1) <> 255;


Important

Si ce message est activé, de nombreux emplacements moins problématiques dans le code seront signalés. Bien qu'un problème ne puisse se produire que lorsque l'opération produit un débordement ou un débordement insuffisant dans le type de données, l'analyse statique ne peut pas différencier les emplacements individuels.

Si vous incluez un transtypage explicite dans tous les emplacements signalés, le code sera beaucoup plus lent et moins lisible.

Importance : Faible

Exemple 79. Exemple
PROGRAM PLC_PRG
VAR
    byTest:BYTE;
    liTest:LINT;
    xError:BOOL;
END_VAR
//type size smaller than register size;
byTest := 0;
IF (byTest - 1) <> 255 THEN //use of temporary result + implicit casting ->  SA0066
    xError := TRUE;
ELSE
    xError := FALSE;
END_IF

//type size equal to or bigger than register size;
liTest := 0;
IF (liTest - 1)  <> -1 THEN // use of temporary result and no implicit casting -> OK
    xError := TRUE;
ELSE
    xError := FALSE;
END_IF

Sortie dans le messages voir:

  • sa_icon_message.png SA0066 : Utilisations de résultats temporaires (byTest - USINT #1)