﻿# V3106\. Possibly index is out of bound\.

При доступе по индексу к переменной типа массив, список или строка может возникнуть исключение IndexOutOfRangeException, если значение индекса оказывается за пределами допустимого диапазона\. Анализатор способен обнаружить некоторые ошибки такого рода\.

Например, это может произойти во время обхода массива в цикле:

```cpp
int[] buff = new int[25];
for (int i = 0; i <= 25; i++)
  buff[i] = 10;
```

Нужно помнить о том, что первый элемент массива имеет индекс `0`, а последний – на единицу меньше размера массива\. Корректный вариант:

```cpp
int[] buff = new int[25];
for (int i = 0; i < 25; i++)
  buff[i] = 10;
```



Похожую ошибку можно сделать не только в цикле, но и при неправильной проверке индекса в условии:

```cpp
void ProcessOperandTypes(ushort opCodeValue, byte operandType)
{
  var OneByteOperandTypes = new byte[0xff];
  if (opCodeValue < 0x100)
  {
    OneByteOperandTypes[opCodeValue] = operandType;
  }
  ...
}
```

Корректный вариант:

```cpp
void ProcessOperandTypes(ushort opCodeValue, byte operandType)
{
  var OneByteOperandTypes = new byte[0xff];
  if (opCodeValue < 0xff)
  {
    OneByteOperandTypes[opCodeValue] = operandType;
  }
  ...
}
```



Также можно допустить ошибку при доступе к конкретному элементу массива или списка\.

```cpp
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`\. Исправленный вариант выглядит следующим образом:

```cpp
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]);
  }
  ...
}
```

Обращение по индексу, полученному из внешнего источника, небезопасно:

```cpp
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`\.

Для исправления нужно проверить индекс перед обращением:

```cpp
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];
    ....
  }
}
```