При доступе по индексу к переменной типа массив, список или строка может возникнуть исключение IndexOutOfRangeException
, если значение индекса оказывается за пределами допустимого диапазона. Анализатор способен обнаружить некоторые ошибки такого рода.
Например, это может произойти во время обхода массива в цикле:
int[] buff = new int[25]; for (int i = 0; i <= 25; i++) buff[i] = 10;
Нужно помнить о том, что первый элемент массива имеет индекс 0
, а последний – на единицу меньше размера массива. Корректный вариант:
int[] buff = new int[25]; for (int i = 0; i < 25; i++) buff[i] = 10;
Похожую ошибку можно сделать не только в цикле, но и при неправильной проверке индекса в условии:
void ProcessOperandTypes(ushort opCodeValue, byte operandType) { var OneByteOperandTypes = new byte[0xff]; if (opCodeValue < 0x100) { OneByteOperandTypes[opCodeValue] = operandType; } ... }
Корректный вариант:
void ProcessOperandTypes(ushort opCodeValue, byte operandType) { var OneByteOperandTypes = new byte[0xff]; if (opCodeValue < 0xff) { OneByteOperandTypes[opCodeValue] = operandType; } ... }
Также можно допустить ошибку при доступе к конкретному элементу массива или списка.
void Initialize(List<string> config) { ... if (config.Count == 16) { var result = new Dictionary<string, string>(); result.Add("Base State", config[0]); ... result.Add("Sorted Descending Header Style", config[16]); } ... }
В этом примере допущена ошибка в количестве записей в списке config
. Исправленный вариант выглядит следующим образом:
void Initialize(List<string> config) { ... if (config.Count == 17) { var result = new Dictionary<string, string>(); result.Add("Base State", config[0]); ... result.Add("Sorted Descending Header Style", config[16]); } ... }
Обращение по индексу, полученному из внешнего источника, небезопасно:
void ProcessBuff() { int[] buff = new int[64]; .... var indexStr = Request.QueryString["index"]; if (Int32.TryParse(indexStr, out int index)) { int indexValue = buff[index]; .... } }
Значение для indexStr
, полученное из внешнего источника, конвертируется в переменную index
типа int
. Далее с помощью index
производится обращение к элементу массива buff
. Это может привести к выходу за границу массива, если значение index
будет меньше 0
или больше 63
.
Для исправления нужно проверить индекс перед обращением:
void ProcessBuff() { int[] buff = new int[64]; .... var indexStr = Request.QueryString["index"]; if ( Int32.TryParse(indexStr, out int index) && index >= 0 && index < buff.Length) // <= { int indexValue = buff[index]; .... } }
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти). |
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3106. |