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
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
SA0073:使用不充分的计数器变量 检测非临时变量的使用 FOR 循环。 理由:这是一个性能警告。每次调用 POU 时都会初始化一个计数器变量。您可以将此变量创建为临时变量 ( VAR_TEMP )。访问它可能会更快,并且该变量不会占用任何永久内存。 重要性:中等 PLCopen规则:CP21/L13 例 80 . 例子 PROGRAM PLC_PRG VAR nIndex : INT; iVa
SA0075:缺少 ELSE 检测到 CASE 没有的陈述 ELSE 分支 理由:防御性编程需要包含一个 ELSE 在每个分支 CASE 陈述。如果在里面无事可做 ELSE 分支,然后包含注释以表明这一点。代码的读者很清楚,这个案例并没有被简单地遗忘。 重要性:低 PLCopen 规则:L17 重要 For CASE 使用带有属性的枚举的语句 strict 并且所有枚举常量都用在 CASE 使用
SA0076: 缺少枚举常量 确定每个枚举常量是否用作条件 CASE 语句并在 a 中查询 CASE 分支。 理由:防御性编程需要处理枚举的所有可能值。如果特定枚举值不需要执行操作,则应添加注释以明确指出这一点。然后,代码的读者很清楚,该值并没有被简单地遗忘。 重要性:低 例 82 . 例子 TYPE My_Enum : ( red := 1, blue := 2, green := 3, bla
SA0077:类型与 CASE 表达式不匹配 检测条件数据类型与条件数据类型不匹配的代码位置 CASE 分支 理由:如果数据类型之间 CASE 变量和 CASE 本身不匹配,则这可能表示错误。 重要性:低 例 83 . 例子 TYPE My_Enum : ( eins := 1, zwei := 2, drei := 3, vier := 4 ); END_TYPE PROGRAM PLC_PRG