このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
AUTOSAR C++14 Rule A12-8-3
説明
ルール定義
Moved-from object shall not be read-accessed.
根拠
一般的に、ソース オブジェクトの内容は移動演算後に不明確になるため、移動演算後にソース オブジェクトの内容にアクセスする演算の実行は危険です。移動演算後にソース オブジェクトの内容にアクセスすると、データ整合性違反、予期しない値、またはポインターの不正なデリファレンスにつながる可能性があります。
オブジェクトの状態に関する前提を持たない演算はこのルールに違反しません。
C++ 標準では、以下の移動演算では移動後にソース オブジェクトを明確に指定された状態にするように規定されています。
1
std::unique_ptr型の移動構築、移動代入、移動構築の変換、移動代入の変換std::shared_ptr型の移動構築、移動代入、移動構築の変換、移動代入の変換std::shared_ptr型のstd::unique_ptrからの移動構築と移動代入std::weak_ptr型の移動構築、移動代入、移動構築の変換、移動代入の変換std::basic_ios型のstd::move()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® はフラグを設定します。Polyspace は、以下の場合のソース オブジェクトへのアクセスにフラグを設定しません。
明示的な移動操作のソース オブジェクトは、以下の型のオブジェクトです。
std::unique_ptrstd::shared_ptrstd::weak_ptrstd::basic_iosstd::basic_filebufstd::threadstd::unique_lockstd::shared_lockstd::promisestd::futurestd::shared_futurestd::packaged_task
移動演算は暗黙的に実行されます。たとえば、関数
std::removeは暗黙的にオブジェクトを移動します。Polyspace は、暗黙的に移動されたオブジェクトへのアクセスにフラグを設定しません。移動されたオブジェクトに誤ってアクセスすることを回避するには、std::eraseを使用して削除済みオブジェクトを消去します。std::removeの使用についての詳細は、[非プロパーな erase-remove の用法]を参照してください。ソース オブジェクトは、次のような組み込みの基本型のオブジェクトです。
int、enum、float、double、pointer、std::intptr_t、std::nullptr_t。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 |
| カテゴリ: Required、Partially automated |
バージョン履歴
R2021a で導入
1 A converting constructor is a constructor that is not declared with the specifier explicit. See Converting constructor.