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

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

Пример:

```cpp
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' произойдёт копирование неинициализированного массива самого в себя\.

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

```cpp
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':

```cpp
C& operator = (const C& other) {
  MyAssert(this != std::addressof(other));
  ....
}
```

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