V3106. Possibly index is out of bound.
При доступе по индексу к переменной типа массив, список или строка может возникнуть исключение 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. |