﻿# V3057\. Function receives an odd argument\.

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

Рассмотрим примеры:

**Недопустимые символы в пути**

```cpp
string GetLogPath(string root)
{
  return System.IO.Path.Combine(root, @"\my|folder\log.txt");
}
```

В функцию 'Combine\(\)' передаётся путь, содержащий недопустимый символ '\|'\. В результате чего функция сгенерирует исключение 'ArgumentException'\.

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

```cpp
string GetLogPath(string root)
{
  return System.IO.Path.Combine(root, @"\my\folder\log.txt"); 
}
```

**Странный аргумент функции форматирования**

```cpp
string.Format(mask, 1, 2, mask);
```

Функция 'string\.Format\(\)' заменяет один или более элементов формата в указанной строке\. Анализатор считает подозрительным, если в строку форматирования пытаются записать эту же строку\.

**Недопустимый индекс**

```cpp
var pos = mask.IndexOf('\0');
if (pos != 0)
    asciiname = mask.Substring(0, pos);
```

'IndexOf\(\)' возращает позицию искомого аргумента\. Если аргумент не найден, то функция возвращает значение '\-1'\. А если передать отрицательный индекс в функцию 'Substring\(\)', то возникнет 'ArgumentOutOfRangeException'\.

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

```cpp
var pos = mask.IndexOf('\0');
if (pos > 0)
    asciiname = mask.Substring(0, pos);
```

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

```cpp
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' и необходимую обработку отрицательных значений:

```cpp
if (data.Length < index + length)
  length = data.Length - index;
             
if (length < 0)
  .... // Error handling
```