SA0006:来自多个任务的写访问 检测由多个任务写入的变量。 理由:在多个任务中写入的变量可能会意外更改其值。这可能会导致混乱的情况。如果同时将变量写入两个任务,则字符串变量(在某些 32 位系统上还有 64 位整数变量)甚至会达到不一致的状态。 例外:在特定情况下,可能需要多个任务编写一个变量。例如,使用信号量来确保访问不会导致不一致的状态。 重要性:高 PLCopen规则:CP10 例 17
SA0007:常量上的地址运算符 检测操作员所在的代码行 ADR 应用于一个常数 理由:使用指向常量变量的指针会覆盖 CONSTANT 变量的属性。可以通过指针更改变量,而无需编译器发出任何通知。 例外:在极少数情况下,将指向常量的指针传递给函数可能很有用。但是,您必须确保此函数不会更改传输的值。尽可能使用 VAR_IN_OUT CONSTANT . 重要性:高 提示 当。。。的时候 替换常量 选
SA0008:检查子范围类型 检测超出范围的子范围类型违规。编译器已经检查了分配的文字。分配常量时,值必须在定义的范围内。分配变量时,数据类型必须相同。 说明:如果使用子范围类型,则确保不退出此子范围。编译器仅针对常量分配检查这些类型的子范围违规。 重要性:低 提示 不对 CFC 对象执行检查,因为代码结构不允许这样做。 例 19 . 例子 VAR_GLOBAL iVarGlob:INT; END
SA0009:未使用的返回值 检测未使用返回值的函数、方法和属性调用 理由:当函数或方法返回返回值时,您也应该对其进行评估。返回值通常表明函数是否执行成功。如果没有评估,那么您稍后将无法识别返回值是否被遗忘或者是否实际上不需要。 例外:如果返回值与调用无关,那么您应该对此进行记录并省略赋值。错误返回永远不应该被忽略。 重要性:中等 PLCopen规则:CP7/CP17 例 20 . 例子 FUNC
SA0010:只有一个组件的数组 检测只有一个元素的数组 理由:一个元素的数组可以被一个基本类型的变量替换。访问此变量比通过索引访问变量快得多。 例外:数组的长度通常由常量确定,并且是程序的参数。那么程序就可以处理不同长度的数组,并且如果长度仅为1则不必更改。这种情况应该相应地记录下来。 重要性:低 例 21 . 例子 PROGRAM PLC_PRG VAR aoiEmpty : ARRAY [2
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) 的名称/标识符的多次使用。 对于枚举,将考虑限定名称。 理由:阅读代码时,相同的名称可能会造成混淆。如果意外访问了错误的对象,它们可能会导致错误。定义并遵循命名约定以避免出现此类情况。 检测到以下情况: 枚举的名称与应用程序或集成库中的另一个枚举的名称相同。 变量的名称与应用程序或集成库中的另一个对象的名称相同。 变量的名称与应