V794. The assignment operator should be protected from the case of this == &src.


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

Пример:

class C {
  char *p;
  size_t len;
public:
  C& operator = (const C& other) {
    delete p;
    len = other.len;
    p = new char[len];
    std::copy(other.p, other.p + len, p);
    return *this;
  }
};

Ошибка проявится, если 'this == &other', а соответственно 'p == other.p'. В таком случае, при вызове 'std::copy', произойдёт копирование неинициализированного массива самого в себя.

Корректный код:

C& operator = (const C& other) {
  if (this == &other)
    return *this;
  delete p;
  len = other.len;
  p = new char[len];
  std::copy(other.p, other.p + len, p);
  return *this;
}

Если же такой ситуации не может быть, то есть у этого оператора есть неявный контракт, то лучше формализовать его в виде 'assert':

C& operator = (const C& other) {
  MyAssert(this != &other);
  ....
}

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


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

Проверено проектов
336
Собрано ошибок
12 745

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

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

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

goto PVS-Studio;