SA0022:(可能)未分配的返回值 检测所有包含执行线程但未分配返回值的函数和方法 理由:函数或方法中未分配的返回值表示缺少代码。即使返回值总是有一个默认值,再次显式分配它以避免混淆总是有用的。 重要性:中等 例 33 . 例子 FUNCTION FUN : DINT VAR_INPUT bTest : BOOL; END_VAR IF bTest THEN RETURN; END_IF FUN
属性:nameprefix 该属性为结构化数据类型的变量定义前缀。前缀必须添加到此类型声明的变量的标识符之前。这 静态分析 检查此命名约定。 插入位置 :在声明结构化数据类型之前的行中 句法 : {attribute 'nameprefix' := '<prefix>'} 例子 在以下示例中,Static Analysis 为 pB 发出一条消息,因为变量名称不以“point”开头。 {attri
属性:analysis:report-multiple-instance-calls 该属性标记了用于检查规则的功能块 规则 105 :仅检查具有该属性的功能块是否多次调用功能块实例。当规则 105 在 项目设置 ,该属性没有任何作用。 插入位置 : 功能块声明部分的顶行。 句法 : {attribute 'analysis:report-multiple-instance-calls'} 例子
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 . 重要性:高 提示 当。。。的时候 替换常量 选