SA0028:重叠的内存区域 检测两个或多个变量保留相同内存的代码行。 理由:当两个变量保留相同的内存时,代码可能会出现意外的结果。应不惜一切代价避免这种情况。如果您无法避免在不同的解释中使用某个值(例如,一次作为 DINT 还有一次作为 REAL ),那么你应该定义一个 UNION 。您还可以使用指针访问不同类型的值,而无需转换该值。 重要性:高 例 39 . 例子 PROGRAM PLC_PR
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
指标 提供的指标的详细描述 CODESYS Static Analysis 提示 这 代码大小 , 尺寸可变 , 堆栈大小 , 和 通话次数 仅报告项目中集成的库中的 POU 的指标。 指标:代码大小(字节数) 类别: 信息丰富、效率 功能块为应用程序代码贡献的字节数 该数量还取决于代码生成器。例如,ARM 处理器的代码生成器通常比 x86 处理器的代码生成器生成更多字节。 指标:可变大小(字节数
SA0064:添加指针 检测指针的添加 理由:在 CODESYS ,指针运算一般是允许的,也可以适当使用。然而,它也代表了错误的来源。因此,存在通常禁止指针运算的编程规则。这个测试可以检查这样的需求。 重要性:中等 例 74 . 例子 PROGRAM PLC_PRG VAR iTest : INT; ariTest : ARRAY[0..10] OF INT; {attribute 'analys