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; 在
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
SA0078:缺少 CASE 分支 检测到 CASE 没有的陈述 CASE 分支,只有一个 ELSE 陈述 理由:A CASE 没有 case 的语句会浪费执行时间并且难以阅读。 重要性:中等 例 84 . 例子 PROGRAM PLC_PRG VAR iVar : INT; xTemp : BOOL; END_VAR iVar := iVar + INT#1; //in the followin
SA0081:上边界不是常数 检测到 FOR 未使用常量值定义上限的语句 理由:如果循环的上限是一个变量值,那么就不再可能看到循环执行的频率。这可能会导致运行时出现严重问题。最坏的情况是无限循环。 重要性:高 例 85 . 例子 PROGRAM PLC_PRG VAR i:INT; iBorder1: INT := 10; iBorder2: INT := 10; iCounter: INT; E