SA0066: Utilizzo di risultati temporaneiPermalink

Rileva l'uso di risultati temporanei nelle istruzioni con un tipo di dati inferiore alla dimensione del registro. Il cast implicito in questo caso può portare a risultati indesiderati.

Giustificazione: Per motivi di prestazioni, CODESYS esegue le operazioni sulla larghezza del registro del processore. I risultati intermedi non vengono troncati. Questo 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 tipicamente eseguita come un'operazione a 32 bit e il risultato non viene convertito in byte. Quindi il valore ‎16#ffffffff‎ (non uguale a 255) si trova nel registro di sistema. Per evitarlo, è necessario eseguire il cast del risultato intermedio in modo esplicito: ‎xError := TO_USINT(usintTest - 1) <> 255; ‎

AVVISO

AVVISO
AVVISO
AVVISO

AVVISO

AVVISO

Se questo messaggio è attivato, verranno segnalati molti punti meno problematici del codice. Sebbene il problema si verifichi solo quando l'operazione produce un overflow o un underflow nel tipo di dati, l'analisi statica non può distinguere tra le singole posizioni.

Se si include un typecast esplicito in tutte le posizioni segnalate, il codice sarà molto più lento e meno leggibile.

Importanza: Basso

Esempio

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

--> SA0066: Use of temporary result: (byTest - USINT #1)