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;
SA0039:可能的空指针引用 检测可能取消引用空指针的代码位置 理由:在每次取消引用之前应检查指针以确保它不等于零。否则,运行时可能会发生访问冲突。 重要性:高 例 113 . 例子 PROGRAM PLC_PRG VAR ptiVar1:POINTER TO INT; ptiVar2:POINTER TO INT; ptiVar3:POINTER TO INT; iVar:INT; iCoun