SA0075:缺少 ELSE 检测到 CASE 没有的陈述 ELSE 分支 理由:防御性编程需要包含一个 ELSE 在每个分支 CASE 陈述。如果在里面无事可做 ELSE 分支,然后包含注释以表明这一点。代码的读者很清楚,这个案例并没有被简单地遗忘。 重要性:低 PLCopen 规则:L17 重要 For CASE 使用带有属性的枚举的语句 strict 并且所有枚举常量都用在 CASE 使用
SA0076: 缺少枚举常量 确定每个枚举常量是否用作条件 CASE 语句并在 a 中查询 CASE 分支。 理由:防御性编程需要处理枚举的所有可能值。如果特定枚举值不需要执行操作,则应添加注释以明确指出这一点。然后,代码的读者很清楚,该值并没有被简单地遗忘。 重要性:低 例 82 . 例子 TYPE My_Enum : ( red := 1, blue := 2, green := 3, bla
SA0077:类型与 CASE 表达式不匹配 检测条件数据类型与条件数据类型不匹配的代码位置 CASE 分支 理由:如果数据类型之间 CASE 变量和 CASE 本身不匹配,则这可能表示错误。 重要性:低 例 83 . 例子 TYPE My_Enum : ( eins := 1, zwei := 2, drei := 3, vier := 4 ); END_TYPE PROGRAM PLC_PRG
SA0078:缺少 CASE 分支 检测到 CASE 没有的陈述 CASE 分支,只有一个 ELSE 陈述 理由:A CASE 没有 case 的语句会浪费执行时间并且难以阅读。 重要性:中等 例 84 . 例子 PROGRAM PLC_PRG VAR iVar : INT; xTemp : BOOL; END_VAR iVar := iVar + INT#1; //in the followin
SA0081:上边界不是常数 检测到 FOR 未使用常量值定义上限的语句 理由:如果循环的上限是一个变量值,那么就不再可能看到循环执行的频率。这可能会导致运行时出现严重问题。最坏的情况是无限循环。 重要性:高 例 85 . 例子 PROGRAM PLC_PRG VAR i:INT; iBorder1: INT := 10; iBorder2: INT := 10; iCounter: INT; E
SA0090:函数结束前的 RETURN 语句 检测代码位置 RETURN 语句不是函数、方法、属性或程序中的最后一个语句。地点 RETURN 存在于一个 IF 还检测到分支。 理由:A RETURN 在代码中导致代码的可维护性、可测试性和可读性变差。一个 RETURN 在代码中很容易被忽略。每次之前 RETURN ,经常忘记插入退出函数时应始终执行的代码。 重要性:中等 PLCopen规则:CP
SA0053:按位移位太大 在操作数按位移位(bit shift)的情况下,检测是否超出了操作数的数据类型宽度 理由:如果移位操作超出数据类型宽度,则为常数 0 生成。 如果旋转移位超过数据类型宽度,则难以读取。因此,应缩短旋转值。 重要性:高 例 62 . 例子 PROGRAM PLC_PRG VAR byTemp1 : BYTE; wTemp2 : WORD; dwTemp3 : DWORD;
SA0054:REAL/LREAL 的相等/不等比较 检测比较运算符是否 = (平等)和 <> (不等式)比较类型的操作数 REAL 或者 LREAL . 理由: REAL / LREAL 根据 IEEE 754 标准,值被实现为浮点数。该标准意味着特定的、看似简单的十进制数无法精确表示。因此,可能会有不同的表示形式: LREAL 对于相同的十进制数。 考虑以下代码行: lr11 := 1.1;
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