SA0055:无符号操作数的不必要比较 检测与无符号操作数的不必要比较。无符号数据类型永远不会小于零。这可以用作符号检查。 理由:使用此检查检测到的比较会产生恒定的结果,并且表明代码中存在错误。 重要性:高 例 64 . 例子 PROGRAM PLC_PRG VAR byTest: BYTE; END_VAR // SA0055 WHILE byTest >= 0 DO byTest := byT
SA0056:常数超出有效范围 检测运算符有效范围之外的文字(常量) 说明:在将某个值与超出该值范围的常数进行比较时发出该消息。然后比较不断返回 TRUE 或者 FALSE .这是编程错误的指示。 重要性:高 例 65 . 例子 PROGRAM PLC_PRG VAR byTestVar: BYTE; END_VAR WHILE byTestVar >= 260 DO byTestVar := b
SA0057:可能丢失小数位 检测可能丢失小数位的语句 理由:以下类型的一段代码( diTemp2 := 1 rTemp1 := TO_REAL(diTemp2 / DINT#2) ) 可能会导致误解。这行代码的作者或读者可以假设除法将作为 REAL 操作,在这种情况下,结果将是 REAL#0.5 .然而,事实并非如此。它是一个整数运算。结果被转换为 REAL 和 rTemp1 获取值 REAL#
SA0058:对枚举变量的操作 检测对枚举数据类型的变量的操作 允许赋值。 理由:枚举不应用作普通整数值。或者,可以定义别名数据类型或者可以使用子范围类型。 重要性:中等 例外:如果枚举用 pragma 标记 {attribute 'strict'} ,那么编译器已经报告了这种操作。 如果枚举被 pragma 声明为标志 {attribute 'flags'} ,则不会发出错误 AND , OR
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 +
SA0061:指针上的异常操作 检测操作一种类型的变量 POINTER TO 哪些不是 = (平等), <> (不等式), + (加法),或 ADR . 在 CODESYS , 指针算术一般是允许的,也可以适当使用。因此,将指针与整数值相加被认为是对指针的常见操作。这使得可以使用指针来处理可变长度的数组。使用 SA0061 报告所有其他(不寻常的)指针操作。 重要性:高 PLCopen 规则:E2
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 ,那么您可能会无意中使用后一个指针覆盖内存。因此,请务必检查此规则,并在您故意想要访问不同类型的值的情况下阻止该消