SA0029:代码中的符号与声明不同 检测标识符的符号与其声明中的符号不同的代码位置 理由:IEC 61131-3 标准将标识符定义为不区分大小写。这意味着变量声明为“ varx “也可以用作” VaRx ” 在代码中。但是,这是令人困惑和误导的,应该避免。 重要性:中等 例 40 . 例子 一个 PLC_PRG POU 和一个 fnc (函数) POU 存在于设备树中。 PROGRAM PLC_
SA0031:未使用的签名 检测编译程序代码中未调用的程序、功能块、函数、数据类型、接口、方法、属性和动作 理由:未使用的对象不必要地增加了项目的大小,并且在阅读代码时可能会造成混淆。 重要性:低 PLCopen 规则:CP2 提示 如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下方的对象。如果只有一个应用程序,那么 POU 池中的对象也会受到影响。 也可以看看 配置和运行静态分析 本节
SA0032:未使用的枚举常量 检测编译程序代码中未使用的枚举常量 理由:未使用的枚举常量不必要地增加了枚举定义的大小,并且在阅读程序时可能会造成混淆。 PLCopen规则:CP24 重要性:低 提示 如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下方的对象。如果只有一个应用程序,那么公共 POU 池中的对象也会受到影响。 例 41 . 例子 TYPE My_Enum : ( one :
SA0033:未使用的变量 检测已声明但未在已编译程序代码中使用的变量 理由:未使用的变量使程序的可读性和可维护性降低。未使用的变量不必要地填充内存并在初始化期间不必要地浪费运行时间。 重要性:中等 PLCopen规则:CP22/CP24 提示 对于 GVL 变量:如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下方的对象。如果只有一个应用程序,那么公共 POU 池中的对象也会受到影响。
SA0175:对字符串的可疑操作 注意 不要总是启用此规则。仅在必要时启用该规则,以查找转换为 UTF-8 编码时应检查的代码中的位置。 检查项目选项是否 字符串的 UTF-8 编码 可以启用。当没有找到具有可疑操作的代码位置时就是这种情况。 切换到 UTF-8 编码时,前 127 个字符对应 ASCII 编码。但是,所有其他字符都使用多于一个字节进行编码。这可能会导致处理字符串时的行为发生变化。
SA0180:索引范围未覆盖整个数组 检测索引范围不完全覆盖的数组 数组通常在循环中处理,其中循环索引对数组进行索引,以便数组的所有组件都可以无间隙地跳转到。如果循环索引和数组索引在所有维度上都相同,则给出此值。如果索引范围没有完全覆盖数组,则表明数组中存在未处理的组件。 重要性:中 例 130 . 例子 {attribute 'do-analysis'} PROGRAM PLC_PRG VAR
SA0064:添加指针 检测指针的添加 理由:在 CODESYS ,指针运算一般是允许的,也可以适当使用。然而,它也代表了错误的来源。因此,存在通常禁止指针运算的编程规则。这个测试可以检查这样的需求。 重要性:中等 例 74 . 例子 PROGRAM PLC_PRG VAR iTest : INT; ariTest : ARRAY[0..10] OF INT; {attribute 'analys
SA0065:添加到基本大小的指针不正确 检测要添加的值与指针的基本大小不匹配的指针添加。只能添加基本数据大小及其倍数的文字而不会出现错误。 理由:在 CODESYS (与 C 和 C++ 相反),当添加具有整数值的指针时,仅将该整数值添加为字节数,而不是整数值乘以基本大小。 例 75 . ST 中的示例 pINT := ADR(array_of_int[0]); pINT := pINT + 2
SA0066:临时结果的使用 检测数据类型小于寄存器大小的语句中临时结果的使用。在这种情况下,隐式强制转换可能会导致不良结果。 理由:出于性能原因, CODESYS Static Analysis 对处理器的寄存器宽度执行操作。中间结果不会被截断。这可能会导致误解,如下例所示: 例 77 . 例子 usintTest := 0; xError := usintTest - 1 <> 255; 在
SA0072:计数器变量的无效使用 检测计数器变量的使用 FOR 环形 理由:在 a 中操作计数器变量 FOR 循环很容易导致无限循环。要防止针对计数器变量的特定值执行循环,请使用 CONTINUE 或者只是一个 IF 。 重要性:高 PLCopen 规则:L12 例 79 . 例子 PROGRAM PLC_PRG VAR_TEMP iIndex : INT; END_VAR FOR iIndex