SA0038: 对输出变量的读访问 检测输出变量( VAR_OUTPUT ) 可以通过 POU 内的读取权限进行访问 理由:根据 IEC 61131-3 标准,禁止读取 POU 内的输出。这表明输出不仅用作输出,而且还用作中间结果的临时变量。应该避免这种双重用途。 重要性:低 例 47 . 例子 VAR_GLOBAL g_xGlob AT %QX0.0 : BOOL ; g_iGlob AT %Q
SA0118:不使用常量的初始化 检测未分配常量的初始化 理由:如果可能,初始化应该是常量,并且不应该引用其他变量。特别是,您应该避免在初始化期间调用函数,因为这可能允许访问未初始化的数据。 重要性:中等 例 109 . 例子 PROGRAM PLC_PRG VAR dwTemp : DWORD := 22; dwTest : DWORD := dwTemp; // SA0118 dwVar :
SA0160:递归调用 检测功能块的动作、方法和属性中的递归调用。还检测来自虚拟函数调用和接口调用的可能递归。 理由:递归会导致不确定的行为,因此是错误的来源。 重要性:中等 PLCopen规则:CP13 例 117 . 例子 下面的方法 Call 分配给功能块 FB_Test : FUNCTION_BLOCK FB_Test VAR bParameter: BOOL; END_VAR METHO
SA0115:数据类型为 UNION 的变量 检测 a 的声明 UNION 数据类型和变量声明 UNION 类型 理由:IEC 61131-3 标准不包括工会。该代码在没有联合的情况下更容易移植。 重要性:低 例 99 . 例子 TYPE A_UNION: UNION lrTemp : LREAL; liTemp : LINT; END_UNION END_TYPE PROGRAM PLC_PRG
语用:analysis 此 pragma 用于停用 POU 的各个代码行的代码规则,以便将它们排除在 静态分析 .您可以通过指定带有前置减号 ("-") 的规则编号来停用代码规则。前置加号 ("+") 激活规则。您可以在 pragma 中指定任意数量的规则。 插入位置 :停用:在实现部分,用 {analysis - ...} 在停用代码分析的第一个代码行之前。激活:有 {analysis + ..
命令:反转 IF 语句 功能 :该命令反转 IF 声明不改变语义 IF 陈述。条件被否定。中的陈述 THEN 和 ELSE 分支被交换。所有评论均被保留。 称呼 :上下文菜单下 重构 命令 要求:光标位于任意位置 之内 一个 IF 陈述。 表 2 . 否定规则 表达 否定表达 描述 < >= “小于”的比较变为“大于”,反之亦然。 <= > “小于或等于”的比较变为“大于”,反之亦然。 = <>
SA0012:可以声明为常量的变量 检测未使用写权限访问的变量,因此可以声明为常量 理由:如果变量仅在声明点写入并且仅用于读取,则静态分析假定该变量也不应该被更改。首先,声明为常量会导致检查程序更改时变量是否未更改。其次,声明为常量可能会导致代码更快。 重要 如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下的对象。如果只有一个应用程序,那么公共 POU 池中的对象也会受到影响。 重要性:
SA0014:实例分配 检测功能块实例的分配。在具有指针或引用变量的实例的情况下,这些赋值具有潜在的风险。 理由:这是一个性能警告。当一个实例分配给另一个实例时,所有元素和子元素都从一个实例复制到另一个实例。指向数据的指针也会被复制,但不会复制它们引用的数据,因此目标实例和源实例在赋值后包含相同的数据。根据实例的大小,这种分配可能会持续很长时间。例如,如果应该将一个实例传递给一个函数进行处理,那么
SA0017:对指针变量的异常赋值 检测对既不是地址的指针的分配( ADR 运算符、指针变量)或常量 0 理由:如果为指针分配的值不是有效地址,则指针的取消引用会导致“访问冲突异常”。 重要性:高 例 29 . 例子 PROGRAM PLC_PRG VAR pInt : POINTER TO INT; dwAddress : DWORD; END_VAR dwAddress := dwAddres
SA0020:可能将截断的值分配给 REAL 变量 检测对整数变量的操作,其截断值可以分配给 REAL 数据类型变量 理由:当整数计算的结果分配给一个 REAL 或者 LREAL 多变的。应该提醒程序员注意对这种赋值的可能错误解释: lrealvar := dintvar1 * dintvar2 . 因为取值范围 LREAL 大于 DINT ,可以假设计算的结果总是可以表示为 LREAL .但事实