SA0171:枚举应具有“strict”属性 检测未提供的枚举声明 {attribute 'strict'} 属性。 理由: {attribute 'strict'} 如果代码违反了严格的枚举编程规则,属性会导致编译器错误。默认情况下,创建新枚举时,声明会自动分配 'strict' 属性。 有关更多信息,请参阅: 数据类型:枚举 重要性:高 例 128 . 例子 TYPE COLOR : ( re
SA0172:可能尝试访问数组边界之外 检测对数组边界之外的数组索引的可能访问。 通常会超出数组索引的范围 FOR 循环,其中索引变量用于访问数组索引。 重要性:高 例 129 . 例子 PROGRAM Test VAR_TEMP iIndex: INT; arUSINT: Array[0..10] OF INT; END_VAR FOR iIndex := INT#0 TO INT#50 DO
SA0035:未使用的输入变量 检测未被任何功能块实例使用的输入变量 理由:未使用的变量使程序的可读性和可维护性降低。未使用的变量不必要地填充内存并在初始化期间不必要地浪费运行时间。 重要性:中等 PLCopen规则:CP24 例 43 . 例子 FUNCTION_BLOCK FB_Afb VAR_INPUT iIn1: INT; iIn2: INT; END_VAR VAR_OUTPUT iOu
SA0034:分配不正确的枚举 检测分配给枚举变量的值。仅允许分配枚举变量的已定义枚举常量。 理由:枚举类型的变量应该只具有预期的值,否则使用该变量的代码可能无法正常工作。我们建议始终将枚举与 pragma 一起使用 {attribute 'strict'} 。然后编译器已经检查了枚举组件的正确使用。 重要性:高 例 45 . 例子 TYPE COLOR : ( Red := 0, Green,
SA0042:使用不同的访问路径 检测同一变量的不同访问路径的使用情况 理由:对同一元素的不同访问会降低程序的可读性和可维护性。我们建议一致使用 {attribute 'qualified-only'} 用于库、全局变量列表和枚举。这会强制进行完全限定的访问。 重要性:低 例 50 . 例子 VAR_GLOBAL iTemp:INT; instPOU:POU; END_VAR FUNCTION_B
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;