SA0020:可能将截断的值分配给 REAL 变量 检测对整数变量的操作,其截断值可以分配给 REAL 数据类型变量 理由:当整数计算的结果分配给一个 REAL 或者 LREAL 多变的。应该提醒程序员注意对这种赋值的可能错误解释: lrealvar := dintvar1 * dintvar2 . 因为取值范围 LREAL 大于 DINT ,可以假设计算的结果总是可以表示为 LREAL .但事实
SA0021:传输临时变量的地址 检测临时变量(在堆栈上)到非临时变量的地址分配 理由:函数或方法的局部变量是在堆栈上创建的,它们仅在处理函数或方法时才存在。如果一个指针在处理完方法或函数后指向这种变量,那么你可以使用这个指针访问未定义的内存,或者访问另一个函数中不正确的变量。应不惜一切代价避免这种情况。 重要性:高 例 32 . 例子 FUNCTION TempVarInFUNC : DWORD
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