V2009. Consider passing the 'Foo' argument as a constant pointer/reference.


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

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

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

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

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

Указатель 'a' лучше сделать константным. Во-первых, сразу станет понятно, что аргумент используется только для чтения. Во-вторых, сделав функцию 'foo()' константной, можно будет добавить константность для других переменных и функций.

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

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;        // Ошибка компиляции
}

Найденные ошибки

Проверено проектов
346
Собрано ошибок
13 188

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;