SA0066:临时结果的使用
检测数据类型小于寄存器大小的语句中临时结果的使用。在这种情况下,隐式强制转换可能会导致不良结果。
理由:出于性能原因, CODESYS Static Analysis 对处理器的寄存器宽度执行操作。中间结果不会被截断。这可能会导致误解,如下例所示:
例 78. 例子
usintTest := 0; xError := usintTest - 1 <> 255;
在 CODESYS, xError
是 TRUE
在这种情况下,因为操作 usintTest - 1
通常作为 32 位操作执行,并且结果不会转换为字节大小。然后是值 16#ffffffff
(不等于255)位于寄存器中。
为了避免这种情况,您需要显式转换中间结果:
xError := TO_USINT(usintTest - 1) <> 255;
重要
如果激活此消息,则将报告代码中许多问题较少的位置。尽管只有当操作在数据类型中产生上溢或下溢时才会出现问题,但静态分析无法区分各个位置。
如果您在所有报告的位置中包含显式类型转换,那么代码将慢得多且可读性差。
重要性:低
例 79. 例子
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:临时结果的使用(byTest - USINT #1)