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