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 :
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
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:
SA0066 : Utilisations de résultats temporaires (byTest - USINT #1)