Skip to main content

SA0066:临时结果的使用

检测数据类型小于寄存器大小的语句中临时结果的使用。在这种情况下,隐式强制转换可能会导致不良结果。

理由:出于性能原因, CODESYS Static Analysis 对处理器的寄存器宽度执行操作。中间结果不会被截断。这可能会导致误解,如下例所示:

78. 例子
usintTest := 0; xError := usintTest - 1 <> 255;

CODESYS, xErrorTRUE 在这种情况下,因为操作 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

输出在 留言 看法:

  • sa_icon_message.png SA0066:临时结果的使用(byTest - USINT #1)