SA0066: Utilizzo di risultati intermedi
Rileva l'uso di risultati temporanei nelle istruzioni con un tipo di dati inferiore alla dimensione del registro. In questo caso, il cast implicito può portare a risultati indesiderati.
Motivazione: Per ragioni di prestazione, CODESYS Static Analysis esegue operazioni sulla larghezza di registro del processore. I risultati intermedi non vengono troncati. Ciò può portare a interpretazioni errate, come nel caso seguente:
usintTest := 0; xError := usintTest - 1 <> 255;
In CODESYS, xError
È TRUE
in questo caso perché l'operazione usintTest - 1
viene in genere eseguito come un'operazione a 32 bit e il risultato non viene convertito nella dimensione in byte. Poi il valore 16#ffffffff
(diverso da 255) si trova nel registro.
Per evitare ciò, è necessario eseguire esplicitamente il cast del risultato intermedio:
xError := TO_USINT(usintTest - 1) <> 255;
Importante
Se questa notifica viene attivata, verrà segnalato un numero elevato di posti nel codice piuttosto non problematici. Un problema può sorgere solo se l'operazione produce un overflow o un underflow nel tipo di dati, ma l'analisi statica non è in grado di distinguere tra le singole posizioni.
Se installi un typecast esplicito in tutte le posizioni segnalate, il codice sarà notevolmente più lento e meno leggibile!
Importanza: Bassa
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
Uscita in Messaggi vista:
SA0066: Utilizzo di risultati temporanei (byTest - USINT #1)