SA0003:空语句 检测带有分号 ( ; ) 但不是声明 理由:空语句可能是缺少代码的标志。 注意:使用空语句有充分的理由。例如,在一个 CASE 声明明确地编程出所有情况是有意义的,即使是那些无事可做的情况。当这种空 CASE 语句包含注释,静态分析不会生成错误消息。 重要性:低 例 15 . 例子 CASE value OF 1: DoSomething(); 2: ; 3: DoSomet
SA0006:来自多个任务的写访问 检测由多个任务写入的变量。 理由:在多个任务中写入的变量可能会意外更改其值。这可能会导致混乱的情况。如果同时将变量写入两个任务,则字符串变量(在某些 32 位系统上还有 64 位整数变量)甚至会达到不一致的状态。 例外:在特定情况下,可能需要多个任务编写一个变量。例如,使用信号量来确保访问不会导致不一致的状态。 重要性:高 PLCopen规则:CP10 例 17
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 池中的对象也会受到影响。 也可以看看 配置和运行静态分析 本节
SA0175:对字符串的可疑操作 注意 不要总是启用此规则。仅在必要时启用该规则,以查找转换为 UTF-8 编码时应检查的代码中的位置。 检查项目选项是否 字符串的 UTF-8 编码 可以启用。当没有找到具有可疑操作的代码位置时就是这种情况。 切换到 UTF-8 编码时,前 127 个字符对应 ASCII 编码。但是,所有其他字符都使用多于一个字节进行编码。这可能会导致处理字符串时的行为发生变化。
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; 在