SA0001:无法访问的代码 检测未执行的代码行,例如由于 RETURN 或者 CONTINUE 陈述 理由:应始终避免无法访问的代码。这 测试 通常表明测试代码仍然存在,应该删除。 重要性:高 PLCopen 规则:CP2 例 14 . 例子 PROGRAM PLC_PRG VAR xReturn_Before_End: BOOL; xContinue_In_Loop_FUN: BOOL; iC
SA0002:空对象 检测不包含任何代码的 POU、GVL、数据类型声明或接口 理由:应该避免空对象。它们通常表明对象尚未完全实现。例外:在某些情况下,当功能块只应由接口使用时,没有在功能块主体中指定代码。在其他情况下,创建一个方法只是因为接口需要该方法,而对该方法没有合理的实现。无论如何,这种情况都应该被评论。 重要性:中等 本节内容如下 :
SA0003:空语句 检测带有分号 ( ; ) 但不是声明 理由:空语句可能是缺少代码的标志。 注意:使用空语句有充分的理由。例如,在一个 CASE 声明明确地编程出所有情况是有意义的,即使是那些无事可做的情况。当这种空 CASE 语句包含注释,静态分析不会生成错误消息。 重要性:低 例 15 . 例子 CASE value OF 1: DoSomething(); 2: ; 3: DoSomet
SA0004:输出上的多写访问 检测写入多个位置的输出。 理由:当输出写入代码的不同位置时,可维护性会降低。然后不确定哪个写访问是在该过程中实际产生影响的访问。好的做法是计算辅助变量中的输出变量,并在循环结束时将计算值分配到一个位置。 重要性:高 PLCopen规则:CP12 提示 当输出变量 ( VAR_IN_OUT ) 被写入不同的分支 IF 和 CASE 陈述。 杂注不能禁用此规则。 例 1
SA0006:来自多个任务的写访问 检测由多个任务写入的变量。 理由:在多个任务中写入的变量可能会意外更改其值。这可能会导致混乱的情况。如果同时将变量写入两个任务,则字符串变量(在某些 32 位系统上还有 64 位整数变量)甚至会达到不一致的状态。 例外:在特定情况下,可能需要多个任务编写一个变量。例如,使用信号量来确保访问不会导致不一致的状态。 重要性:高 PLCopen规则:CP10 例 17
SA0007:常量上的地址运算符 检测操作员所在的代码行 ADR 应用于一个常数 理由:使用指向常量变量的指针会覆盖 CONSTANT 变量的属性。可以通过指针更改变量,而无需编译器发出任何通知。 例外:在极少数情况下,将指向常量的指针传递给函数可能很有用。但是,您必须确保此函数不会更改传输的值。尽可能使用 VAR_IN_OUT CONSTANT . 重要性:高 提示 当。。。的时候 替换常量 选
SA0008:检查子范围类型 检测超出范围的子范围类型违规。编译器已经检查了分配的文字。分配常量时,值必须在定义的范围内。分配变量时,数据类型必须相同。 说明:如果使用子范围类型,则确保不退出此子范围。编译器仅针对常量分配检查这些类型的子范围违规。 重要性:低 提示 不对 CFC 对象执行检查,因为代码结构不允许这样做。 例 19 . 例子 VAR_GLOBAL iVarGlob:INT; END
SA0009:未使用的返回值 检测未使用返回值的函数、方法和属性调用 理由:当函数或方法返回返回值时,您也应该对其进行评估。返回值通常表明函数是否执行成功。如果没有评估,那么您稍后将无法识别返回值是否被遗忘或者是否实际上不需要。 例外:如果返回值与调用无关,那么您应该对此进行记录并省略赋值。错误返回永远不应该被忽略。 重要性:中等 PLCopen规则:CP7/CP17 例 20 . 例子 FUNC
SA0010:只有一个组件的数组 检测只有一个元素的数组 理由:一个元素的数组可以被一个基本类型的变量替换。访问此变量比通过索引访问变量快得多。 例外:数组的长度通常由常量确定,并且是程序的参数。那么程序就可以处理不同长度的数组,并且如果长度仅为1则不必更改。这种情况应该相应地记录下来。 重要性:低 例 21 . 例子 PROGRAM PLC_PRG VAR aoiEmpty : ARRAY [2