# 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 == std::addressof(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 != std::addressof(other));
      ....
    }

Примечание: в проверке на равенство самому себе лучше использовать функцию 'std::addressof' вместо оператора '&'. Такая проверка будет работать корректно, даже если класс содержит перегруженный оператор '&'.

Данная диагностика классифицируется как:

CWE-404

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