SA0080: Loop index variable for array index exeeds array rangePermalink

Detects the FOR statements where the index variable is used to access an array index and exceeds the range of the array index

Justification: Arrays are typically processed in ‎FOR‎ loops. The start and end value of the counter variable should typically match (or at least not exceed) the upper and lower bounds of the array. A typical cause of error is detected here when array bounds are changed and constants are not carefully used; or when a different value is used accidentally in the ‎FOR‎ loop than in the array declaration.

Importance: High

Example

PROGRAM PLC_PRG	
VAR
 iIndex1,iIndex2,iIndex3 : INT;
 arWord : ARRAY[1..100] OF WORD;
 arararINT : ARRAY[1..9,1..9,1..9] OF INT;
 arUSINT : ARRAY[0..99] OF USINT;
END_VAR

//1 violation of the rule(lower range is exeeded): SA0080
FOR iIndex1 := INT#0 TO INT#100 DO
	arWord[iIndex1] := INT_TO_WORD(iIndex1);
END_FOR

//6 violations (lower and upper range is exceeded for each array dimension): 3SA0080
FOR iIndex2 := INT#0 TO INT#10 DO
	arararINT[iIndex2, iIndex2, iIndex2] := iIndex2;
END_FOR

//1 violation (upper range is exceeded by the end result of the index), previous expressions on index are not evaluated -> OK
FOR iIndex3 := INT#0 TO INT#50 DO
	arUSINT[iIndex3 * INT#2] := INT_TO_USINT(iIndex3);
END_FOR

--> SA0080: Loop index range of 'Index1' exceeds array range
--> SA0080: Loop index range of 'Index2' exceeds array range