SA0059: 比较操作总是返回 TRUE 或 FALSE 检测与结果始终为的文字的比较 TRUE 或者 FALSE ,并且可以在编译期间进行处理。 理由:持续产生的操作 TRUE 或者 FALSE 是编程错误的指示。 重要性:高 例 69 . 例子 PROGRAM PLC_PRG VAR byTemp1 : BYTE; END_VAR WHILE byTemp1 <= 255 DO byTemp
SA0060:零用作无效操作数 检测操作数具有以下值的操作 0 导致无效或无意义的操作 理由:这种表达方式可能表明存在编程错误。在任何情况下,它都会不必要地浪费运行时间。 重要性:中等 例 70 . 例子 PROGRAM PLC_PRG VAR byTemp1 : BYTE; wTemp2 : WORD; dwTemp3 : DWORD; END_VAR byTemp1 := byTemp1 +
SA0062:在表达式中使用 TRUE 或 FALSE 检测文字的使用 TRUE 或者 FALSE 在表达式中 理由:布尔文字的运算 TRUE 或者 FALSE 应避免重复计算并每次返回相同的结果。这种表达是多余的,应该被替换。它的存在表明存在错误。无论如何,表达式都会不必要地增加程序运行时的负担。 重要性:中等 例 72 . 例子 PROGRAM PLC_PRG VAR xTemp1, xTem
SA0063:可能不是 16 位兼容的操作 检测具有临时结果的 16 位操作。背景:在 16 位系统上,可以截断 32 位临时结果。例子: (int+10) 可以超过 16 位。 理由:在极少数情况下,您必须编写应该在 16 位处理器和 32 位处理器上运行的代码,此消息应该有助于防止出现任何问题。 重要性:低 例 73 . 例子 PROGRAM PLC_PRG VAR iVar : INT; E
SA0019:隐式指针转换 检测隐式生成的指针转换 理由:在 CODESYS ,指针没有严格类型化,它们可以以任何方式相互赋值。这经常被使用,因此编译器不会报告。但是,它也可能意外地导致意外访问。如果您指定一个 POINTER TO BYTE 到一个 POINTER TO DWORD ,那么您可能会无意中使用后一个指针覆盖内存。因此,请务必检查此规则,并在您故意想要访问不同类型的值的情况下阻止该消
SA0130:隐式扩展转换 检测算术运算期间隐式执行从较小数据类型到较大数据类型的转换的代码位置 理由:当源类型的值范围完全包含在目标类型的值范围内时,编译器允许不同类型的任何赋值。但是,编译器将尽可能晚地构建对代码的转换。对于类型的赋值 lint := dint * dint ,编译器仅在乘法之后执行隐式转换: lint := TO_LINT(dint * dint); 因此溢出被截断。如果你想
SA0133:显式缩小转换 检测从较大数据类型到较小数据类型的显式转换 理由:大量类型转换可能表明您为变量选择了错误的数据类型。因此,有一些编程指南要求对数据类型转换提供明确的理由。 重要性:低 例 55 . 例子 PROGRAM SA0133 VAR siVar:SINT; diVar:DINT; liVar:LINT; byVar:BYTE; uiVar:UINT; dwVar:DWORD;
SA0134:显式有符号/无符号转换 检测从有符号数据类型到无符号数据类型的显式转换,反之亦然 理由:过度使用类型转换可能表明为变量选择了错误的数据类型。因此,有一些编程指南要求对数据类型转换提供明确的理由。 重要性:低 例 56 . 例子 PROGRAM PLC_PRG VAR byVar :BYTE; udiVar : UDINT; uliVar : ULINT; lwVar : LWORD;
SA0005:无效的地址和数据类型 检测无效地址和数据类型规范。地址中的有效大小前缀:X 表示 BOOL B 表示 1 字节数据类型,W 表示 2 字节数据类型,D 表示 4 字节数据类型。 理由:位于直接地址上的变量最好与与其数据类型宽度相对应的地址相关联。代码的读者可能会感到困惑,例如,如果 DWORD 分配给一个 BYTE 地址。 重要性:低 例 57 . 例子 PROGRAM Check_