检测数据类型小于注册表大小的语句中临时结果的使用。在这种情况下,隐式铸模可能会导致不必要的结果。
理由出于性能考虑,CODESYS 在处理器的寄存器宽度上执行操作。中间结果不会被截断。这可能会导致误解,如以下情况:usintTest := 0; xError := usintTest - 1 <> 255;
。在CODESYS 中,xError
,在这种情况下,TRUE
,因为操作usintTest - 1
通常是作为 32 位操作执行的,其结果不会投影到字节大小。然后在注册表中设置值16#ffffffff
(不等于 255)。为避免出现这种情况,必须对中间结果进行显式转换: xError := TO_USINT(usintTest - 1) <> 255;




注意

如果激活该信息,则会报告代码中许多问题较少的位置。虽然只有在操作导致数据类型溢出或下溢时才会出现问题,但静态分析无法区分各个位置。
如果在所有报告的位置都包含明确的类型转换,那么代码的运行速度会大大降低,可读性也会大大降低。
重要性:低
示例
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)