Перемещенный из объекта не должен быть получен доступ для чтения
Доступ к объекту, перемещенному из объекта, не допускается.
Поскольку содержимое исходного объекта обычно не задано после операции перемещения, небезопасно выполнять операции, которые получают доступ к содержимому исходного объекта после операции перемещения. Доступ к содержимому исходного объекта после операции перемещения может привести к нарушению целостности данных, непредвиденному значению или незаконному удалению указателя.
Операции, которые не делают никаких допущений о состоянии объекта, не нарушают это правило.
Стандарт 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
. См. Преобразование конструктора.