# 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 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

Данная диагностика классифицируется как:

CWE-125 CWE-787

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3106.