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)