SA0022:(可能)未分配的返回值 检测所有包含执行线程但未分配返回值的函数和方法 理由:函数或方法中未分配的返回值表示缺少代码。即使返回值总是有一个默认值,再次显式分配它以避免混淆总是有用的。 重要性:中等 例 33 . 例子 FUNCTION FUN : DINT VAR_INPUT bTest : BOOL; END_VAR IF bTest THEN RETURN; END_IF FUN
SA0004:输出上的多写访问 检测写入多个位置的输出。 理由:当输出写入代码的不同位置时,可维护性会降低。然后不确定哪个写访问是在该过程中实际产生影响的访问。好的做法是计算辅助变量中的输出变量,并在循环结束时将计算值分配到一个位置。 重要性:高 PLCopen规则:CP12 提示 当输出变量 ( VAR_IN_OUT ) 被写入不同的分支 IF 和 CASE 陈述。 杂注不能禁用此规则。 例 1
SA0007:常量上的地址运算符 检测操作员所在的代码行 ADR 应用于一个常数 理由:使用指向常量变量的指针会覆盖 CONSTANT 变量的属性。可以通过指针更改变量,而无需编译器发出任何通知。 例外:在极少数情况下,将指向常量的指针传递给函数可能很有用。但是,您必须确保此函数不会更改传输的值。尽可能使用 VAR_IN_OUT CONSTANT . 重要性:高 提示 当。。。的时候 替换常量 选
SA0008:检查子范围类型 检测超出范围的子范围类型违规。编译器已经检查了分配的文字。分配常量时,值必须在定义的范围内。分配变量时,数据类型必须相同。 说明:如果使用子范围类型,则确保不退出此子范围。编译器仅针对常量分配检查这些类型的子范围违规。 重要性:低 提示 不对 CFC 对象执行检查,因为代码结构不允许这样做。 例 19 . 例子 VAR_GLOBAL iVarGlob:INT; END
SA0009:未使用的返回值 检测未使用返回值的函数、方法和属性调用 理由:当函数或方法返回返回值时,您也应该对其进行评估。返回值通常表明函数是否执行成功。如果没有评估,那么您稍后将无法识别返回值是否被遗忘或者是否实际上不需要。 例外:如果返回值与调用无关,那么您应该对此进行记录并省略赋值。错误返回永远不应该被忽略。 重要性:中等 PLCopen规则:CP7/CP17 例 20 . 例子 FUNC
SA0025:不合格的枚举常量 检测限定名称未在枚举前面添加的枚举常量 理由:合格的访问使代码更具可读性且更易于维护。如果不强制使用限定变量名,则可以在扩展程序时插入附加枚举。该枚举包含一个与现有枚举同名的常量(参见下面的示例:“red”)。这将导致对这段代码的访问不明确。 在每种情况下,我们建议仅使用带有编译指示的枚举 {attribute 'qualified-only'} 。 重要性:中等
SA0027:标识符的多种用途 检测项目范围内变量或对象 (POU) 的名称/标识符的多次使用。 对于枚举,将考虑限定名称。 理由:阅读代码时,相同的名称可能会造成混淆。如果意外访问了错误的对象,它们可能会导致错误。定义并遵循命名约定以避免出现此类情况。 检测到以下情况: 枚举的名称与应用程序或集成库中的另一个枚举的名称相同。 变量的名称与应用程序或集成库中的另一个对象的名称相同。 变量的名称与应
SA0033:未使用的变量 检测已声明但未在已编译程序代码中使用的变量 理由:未使用的变量使程序的可读性和可维护性降低。未使用的变量不必要地填充内存并在初始化期间不必要地浪费运行时间。 重要性:中等 PLCopen规则:CP22/CP24 提示 对于 GVL 变量:如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下方的对象。如果只有一个应用程序,那么公共 POU 池中的对象也会受到影响。
SA0180:索引范围未覆盖整个数组 检测索引范围不完全覆盖的数组 数组通常在循环中处理,其中循环索引对数组进行索引,以便数组的所有组件都可以无间隙地跳转到。如果循环索引和数组索引在所有维度上都相同,则给出此值。如果索引范围没有完全覆盖数组,则表明数组中存在未处理的组件。 重要性:中 例 130 . 例子 {attribute 'do-analysis'} PROGRAM PLC_PRG VAR
SA0075:缺少 ELSE 检测到 CASE 没有的陈述 ELSE 分支 理由:防御性编程需要包含一个 ELSE 在每个分支 CASE 陈述。如果在里面无事可做 ELSE 分支,然后包含注释以表明这一点。代码的读者很清楚,这个案例并没有被简单地遗忘。 重要性:低 PLCopen 规则:L17 重要 For CASE 使用带有属性的枚举的语句 strict 并且所有枚举常量都用在 CASE 使用