SA0023:复杂的返回值 确定无法使用处理器的简单注册表副本返回的复杂返回值。这包括结构、数组和类型的返回值 STRING (不管已用内存的大小)。 理由:这是一个性能警告。如果函数、方法或属性的结果返回较大的值,则处理器在执行代码时会多次复制它们。这可能会导致运行时问题,应尽可能避免。可以通过传递结构化值来提高性能 VAR_IN_OUT 到一个函数或方法并将其填充到该函数或方法中。 重要性:中
SA0024:无类型文字/常量 标识属于操作一部分的无类型文字 理由:无类型文字会根据其用法自动类型化。在某些情况下,例如 dw := ROL(DWORD#1, i); ,这可能会导致意外的情况,最好使用类型化文字来提供独特的说明。 重要性:低 例 35 . 例子 PROGRAM PLC_PRG VAR iTemp1 : INT := 10; //no part of operation diTe
SA0025:不合格的枚举常量 检测限定名称未在枚举前面添加的枚举常量 理由:合格的访问使代码更具可读性且更易于维护。如果不强制使用限定变量名,则可以在扩展程序时插入附加枚举。该枚举包含一个与现有枚举同名的常量(参见下面的示例:“red”)。这将导致对这段代码的访问不明确。 在每种情况下,我们建议仅使用带有编译指示的枚举 {attribute 'qualified-only'} 。 重要性:中等
SA0026: 可能的截断字符串 检测未使用足够字符串长度的字符串分配和字符串初始化 理由:当分配不同长度的字符串时,字符串可能会被截断。这可能会产生意想不到的结果。 重要性:中等 例 37 . 例子 PROGRAM PLC_PRG VAR strVar1 : STRING[10]; strVar2 : STRING[6]; strVar3 : STRING[6] := 'abcdefghi';
SA0027:标识符的多种用途 检测项目范围内变量或对象 (POU) 的名称/标识符的多次使用。 对于枚举,将考虑限定名称。 理由:阅读代码时,相同的名称可能会造成混淆。如果意外访问了错误的对象,它们可能会导致错误。定义并遵循命名约定以避免出现此类情况。 检测到以下情况: 枚举的名称与应用程序或集成库中的另一个枚举的名称相同。 变量的名称与应用程序或集成库中的另一个对象的名称相同。 变量的名称与应
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 :