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
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; 在