Перемещенный из объекта не должен быть получен доступ для чтения
Доступ к объекту, перемещенному из объекта, не допускается.
Поскольку содержимое исходного объекта обычно не задано после операции перемещения, небезопасно выполнять операции, которые получают доступ к содержимому исходного объекта после операции перемещения. Доступ к содержимому исходного объекта после операции перемещения может привести к нарушению целостности данных, непредвиденному значению или незаконному удалению указателя.
Операции, которые не делают никаких допущений о состоянии объекта, не нарушают это правило.
Стандарт C++ задает, что эти операции перемещения оставляют исходный объект в четко заданном состоянии после перемещения:
Перемещение конструкции, назначение перемещения, преобразование[1] перемещение конструкции и преобразование назначения перемещения std::unique_ptr напечатать
Перемещение конструкции, назначение перемещения, преобразование конструкции перемещения, преобразование назначения перемещения std::shared_ptr напечатать
Перемещение конструкции и перемещение назначения из std::unique_ptr от std::shared_ptr напечатать
Перемещение конструкции, назначение перемещения, преобразование конструкции перемещения и преобразование назначения перемещения std::weak_ptr напечатать
std::move() от std::basic_ios напечатать
Перемещайте конструктор и перемещайте назначение std::basic_filebuf напечатать
Перемещайте конструктор и перемещайте назначение std::thread напечатать
Перемещайте конструктор и перемещайте назначение std: unique_lock напечатать
Перемещайте конструктор и перемещайте назначение std::shared_lock напечатать
Перемещайте конструктор и перемещайте назначение std::promise напечатать
Перемещайте конструктор и перемещайте назначение std::future напечатать
Перемещение конструкции, назначение перемещения, преобразование конструкции перемещения и преобразование назначения перемещения std::shared_future напечатать
Перемещайте конструктор и перемещайте назначение std::packaged_task напечатать
Поскольку эти операции перемещения оставляют исходный объект в четко заданном состоянии, доступ к исходному объекту после вызова этих функций совместим с этим правилом.
Polyspace® поднимает флаг, если исходный объект считывается после перемещения его содержимого к целевому объекту путем вызова std::move функция явным образом. Polyspace не помечает доступ к исходному объекту, если:
Исходным объектом явной операции перемещения являются следующие типы:
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::basic_ios
std::basic_filebuf
std::thread
std::unique_lock
std::shared_lock
std::promise
std::future
std::shared_future
std::packaged_task
Операция перемещения выполняется неявно. Для образца - функция std::remove может получить доступ к исходному объекту после неявной операции перемещения. Polyspace не помечает его. Лучшая практика состоит в том, чтобы избегать таких операций и использовать более безопасные альтернативы, которые предотвращают случайный доступ, такие как std::erase.
Исходный объект является встроенным базовым типом, таким как: int, enum, float, double, указатель, std::intptr_t, std::nullptr_t.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Специальные функции представителей |
| Категория: Требуемая, Частично автоматизированная |
[1] Преобразовывающий конструктор является конструктором, который не объявлен со спецификатором explicit. См. Преобразование конструктора.