Анализатор обнаружил потенциально возможную ошибку, связанную с тем, что в качестве фактического аргумента в функцию передаётся очень странное значение.
Рассмотрим примеры:
Недопустимые символы в пути
string GetLogPath(string root)
{
return System.IO.Path.Combine(root, @"\my|folder\log.txt");
}
В функцию 'Combine()' передаётся путь, содержащий недопустимый символ '|'. В результате чего функция сгенерирует исключение 'ArgumentException'.
Корректный вариант:
string GetLogPath(string root)
{
return System.IO.Path.Combine(root, @"\my\folder\log.txt");
}
Странный аргумент функции форматирования
string.Format(mask, 1, 2, mask);
Функция 'string.Format()' заменяет один или более элементов формата в указанной строке. Анализатор считает подозрительным, если в строку форматирования пытаются записать эту же строку.
Недопустимый индекс
var pos = mask.IndexOf('\0');
if (pos != 0)
asciiname = mask.Substring(0, pos);
'IndexOf()' возращает позицию искомого аргумента. Если аргумент не найден, то функция возвращает значение '-1'. А если передать отрицательный индекс в функцию 'Substring()', то возникнет 'ArgumentOutOfRangeException'.
Корректный вариант:
var pos = mask.IndexOf('\0');
if (pos > 0)
asciiname = mask.Substring(0, pos);
Обратите внимание, что анализатор может также выдать предупреждение, когда в метод передаётся корректный аргумент, но соответствующий параметр внутри метода может принять недопустимое значение.
static void Bar(string[] data, int index, int length)
{
if (index < 0)
throw new Exception(....);
if (data.Length < index + length)
length = data.Length - index; // <=
....
Array.Copy(data, index, result, 0, length); // <=
}
static void Foo(string[] args)
{
Bar(args, 4, 2); // <=
....
}
В данном случае анализатор выдаст предупреждение, что при вызове метода 'Bar' соответствующий аргументу '2' параметр ('length') внутри метода может принять отрицательное значение, которое дальше используется при вызове метода 'Array.Copy'. Это приведёт к возникновению исключения 'ArgumentOutOfRangeException'.
И действительно, если размер массива 'args' ('data' внутри метода 'Bar') будет меньше 4, внутри метода 'Bar' в 'length' будет записано отрицательное значение несмотря на то, что в метод передаётся положительное значение - 2. Как следствие - при вызове 'Array.Copy' будет выброшено исключение.
В метод 'Bar' следует добавить проверку нового значения 'length' и необходимую обработку отрицательных значений:
if (data.Length < index + length)
length = data.Length - index;
if (length < 0)
.... // Error handling
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3057. |