SA0066: Usos de resultados temporales
Detecta el uso de resultados temporales en declaraciones con un tipo de datos menor que el tamaño del registro. En este caso, la conversión implícita puede conducir a resultados no deseados.
Justificación: Por motivos de rendimiento, CODESYS Static Analysis realiza operaciones en el ancho de registro del procesador. Los resultados intermedios no se truncan. Esto puede dar lugar a malas interpretaciones, como en el siguiente caso:
usintTest := 0; xError := usintTest - 1 <> 255;
En CODESYS, xError
es TRUE
en este caso porque la operación usintTest - 1
normalmente se ejecuta como una operación de 32 bits y el resultado no se convierte al tamaño de bytes. Entonces el valor 16#ffffffff
(no igual a 255) se encuentra en el registro.
Para evitar esto, necesitas convertir el resultado intermedio explícitamente:
xError := TO_USINT(usintTest - 1) <> 255;
Importante
Si este mensaje está activado, se informarán muchas ubicaciones menos problemáticas en el código. Aunque un problema solo puede ocurrir cuando la operación produce un desbordamiento o subdesbordamiento en el tipo de datos, el análisis estático no puede diferenciar entre las ubicaciones individuales.
Si incluye un encasillado explícito en todas las ubicaciones informadas, el código será mucho más lento y menos legible.
Importancia: Baja
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
Salida en el Mensajes vista:
SA0066: Usos de resultados temporales (byTest - USINT #1)