Skip to main content

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:

Esempio 78. Esempio
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

Esempio 79. 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

Uscita in Messaggi vista:

  • sa_icon_message.png SA0066: Utilizzo di risultati temporanei (byTest - USINT #1)