# V2009. Consider passing the 'Foo' argument as a pointer/reference to const.

Данное диагностическое правило добавлено по просьбе пользователей.

Анализатор предполагает, что формальный параметр в виде указателя/ссылки может ссылаться на константный объект.

Данное предупреждение может быть выдано на следующий код:

- Экземпляр структуры или класса передается в функцию по ссылке, но не модифицируется в теле функции;
- Аргумент функции является указателем на неконстантный тип, но он используется только для чтения данных.

Эта диагностика может помочь при рефакторинге кода или предотвращении программных ошибок в будущем.

Рассмотрим пример такого кода:

    void foo(int *a)
    {
      int b = a[0] + a[1] + a[2];
      .... переменная 'a' больше не используется
    }

Переменную 'a' лучше сделать указателем на константное значение. Таким образом, сразу станет понятно, что аргумент используется только для чтения.

Исправленный код:

    void foo(const int *a)
    {
      int b = a[0] + a[1] + a[2];
      .... переменная 'a' больше не используется
    }

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

Иногда выдаваемые анализатором сообщения могут показаться несколько странными. Давайте рассмотрим один из таких случаев более подробно:

    typedef struct tagPOINT {
        int  x, y;
    } POINT, *PPOINT;

    void foo(const PPOINT a, const PPOINT b) {
      a->x = 1;     // Данные можно изменить
      a = b;        // Ошибка компиляции
    }

Анализатор предлагает сделать тип, на который ссылается указатель, константным. Это может показаться странным, так как здесь присутствует ключевое слово 'const'. Дело в том, что 'const' означает константность указателя. Объекты, на которую ссылаются указатели, доступна для модификации.

Для того, чтобы сделать сами объекты константными, следует поступить так:

    ....
    typedef const POINT *CPPOINT;

    void foo(const CPPOINT a, const CPPOINT b) {
      a->x = 1;     // Ошибка компиляции
      a = b;        // Ошибка компиляции
    }