SA0040:可能被零除 检测可能被零除的代码位置 理由:除以 0 导致错误。应始终首先检查要除法的变量是否为 0。 重要性:高 例 48 . 例子 VAR_GLOBAL g_iVar AT %QW1 : INT; END_VAR PROGRAM PLC_PRG VAR iCounter : INT; iSumme:INT; iMid:INT; iVal1:INT := INT#2; iVal2:
SA0041:检测可能的循环不变代码 检测循环中为每个循环周期计算相同值的分配。这些代码行可以插入到循环之外。 理由:这是一个性能警告。在循环中执行但在每个循环中执行相同操作的代码可以在循环外执行。 重要性:中等 例 49 . 例子 PROGRAM PLC_PRG VAR iCounter, iVar1, iVar2 : INT; END_VAR FOR iCounter := 0 TO 10 D
SA0042:使用不同的访问路径 检测同一变量的不同访问路径的使用情况 理由:对同一元素的不同访问会降低程序的可读性和可维护性。我们建议一致使用 {attribute 'qualified-only'} 用于库、全局变量列表和枚举。这会强制进行完全限定的访问。 重要性:低 例 50 . 例子 VAR_GLOBAL iTemp:INT; instPOU:POU; END_VAR FUNCTION_B
SA0043:仅在一个 POU 中使用全局变量 仅在单个 POU 中检测全局变量的使用 理由:仅在一个位置使用的全局变量也只能在该位置声明。 重要性:中等 PLCopen规则:CP26 例 51 . 例子 VAR_GLOBAL g_xVar AT %QX0.0 : BOOL ; g_iTest AT %QW1 : INT ; g_wTest AT %QW2 : WORD; END_VAR PROG
SA0044:关于接口的声明 检测声明 REFERENCE TO 接口和声明 VAR_IN_OUT 带接口的变量(通过 REFERENCE TO ) 理由:接口类型总是隐含地引用实现该接口的功能块实例。因此,对接口的引用就是对引用的引用,并且可能导致不需要的行为。 重要性:高 例 52 . 例子 ITF 是在项目中定义的接口。 FUNCTION_BLOCK POU VAR_INPUT inst_i
SA0118:不使用常量的初始化 检测未分配常量的初始化 理由:如果可能,初始化应该是常量,并且不应该引用其他变量。特别是,您应该避免在初始化期间调用函数,因为这可能允许访问未初始化的数据。 重要性:中等 例 109 . 例子 PROGRAM PLC_PRG VAR dwTemp : DWORD := 22; dwTest : DWORD := dwTemp; // SA0118 dwVar :
SA0124:声明中的指针取消引用 检测用于声明部分初始化的指针取消引用 理由:指针和引用不应该用于初始化,因为如果指针尚未初始化,这可能会导致访问冲突。 重要性:中等 例 110 . 例子 TYPE TESTSTRUCT : STRUCT xA : BOOL; xB : BOOL; END_STRUCT END_TYPE FUNCTION_BLOCK FB_Test VAR_INPUT pTes
SA0125:初始化中的引用 检测声明部分中用于初始化的引用变量 理由:指针和引用不应该用于初始化,因为如果指针尚未初始化,这可能会导致访问冲突。 重要性:中等 例 111 . 例子 TYPE TESTSTRUCT : STRUCT xA : BOOL; xB : BOOL; END_STRUCT END_TYPE FUNCTION_BLOCK FB_Test VAR_INPUT refTests
SA0140:注释掉的语句 检测注释掉的语句 理由:出于调试目的,代码经常被注释掉。当这种注释发布时,以后并不总是清楚代码是否应该被删除,或者它是否出于调试目的而被注释掉并且无意中没有被注释掉。 重要性:高 PLCopen 规则:C4 例 112 . 例子 PROGRAM PLC_PRG VAR iValue1: INT; iValue2: INT; END_VAR iValue1 := 100;