# V672. It is possible that creating a new variable is unnecessary. One of the function's arguments has the same name and this argument is a reference.

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

Что бы лучше понять данный вид ошибки, рассмотрим пример:

    bool SkipFunctionBody(Body*& body, bool t)
    {
      body = 0;
      if (t)
      {
        Body *body = 0;
        if (!SkipFunctionBody(body, true))
          return false;
        body = new Body(body);
        return true;
      }
      return false;
    }

Для работы функции с функцией SkipFunctionBody () потребовалась временная переменная. Из-за невнимательности в блоке 'if' повторно объявляется временная переменная с именем 'body'. Это значит что аргумент 'body' не будет модифицирован внутри блока 'if'. Вместо него будет изменена локальная переменная. При выходе из функции значение переменной 'body' всегда будет равно NULL. Ошибка может проявиться не в данном месте программы, а где то далее, когда произойдет разыменование нулевого указателя. Для исправления ошибки следует создавать локальную переменную с другим именем. Корректный вариант кода:

    bool SkipFunctionBody(Body*& body, bool t)
    {
      body = 0;
      if (t)
      {
        Body *tmp_body = 0;
        if (!SkipFunctionBody(tmp_body, true))
          return false;
        body = new Body(tmp_body);
        return true;
      }
      return false;
    }

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V672.