# V3184. The argument's value is greater than the size of the collection. Passing the value into the 'Foo' method will result in an exception.

Анализатор обнаружил, что в метод передаётся индекс, который больше или равен количеству элементов коллекции. Это может привести к выбрасыванию исключения.

Чтобы лучше разобраться в проблеме, рассмотрим пример:

    public static void Foo()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      list.RemoveAt(list.Count);
    }

При попытке удалить элемент будет выброшено исключение. Метод 'RemoveAt' выбрасывает исключение, если первый аргумент больше или равен количеству элементов коллекции.

Исправленный вариант:

    public static void Foo()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      list.RemoveAt(list.Count - 1);
    }

Рассмотрим более сложный пример с ошибкой:

    public static void ProcessList()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      string str = GetStringOrNull(list, list.Count); // <=
    }

    public static string GetStringOrNull(List<string> list, int index)
    {
      if (index > list.Count)
        return null;

      return list.ElementAt(index);
    }

Коллекция 'list' передаётся в метод 'GetStringOrNull', который содержит ошибку в условии оператора 'if'. При подобных аргументах метод должен вернуть 'null', но из-за ошибки выбрасывает исключение.

Исправленный вариант:

    public static void ProcessList()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      string str = GetStringOrNull(list, list.Count);
    }

    public static string GetStringOrNull(List<string> list, int index)
    {
      if (index >= list.Count)
        return null;

      return list.ElementAt(index);
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки переполнения буфера (записи или чтения за пределами выделенной для буфера памяти).

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

CWE-687