AUTOSAR C++14 Rule A18-5-10
Placement new shall be used only with properly aligned pointers to sufficient storage capacity
説明
ルール定義
Placement new shall be used only with properly aligned pointers to sufficient storage capacity.
根拠
new 演算子は単一操作で、オブジェクトの保存に必要な量のメモリをヒープ上に割り当て、割り当てられたメモリに新しいオブジェクトを構築します。割り当てと構築を分離し、オブジェクトをスタック上またはヒープ上の事前割り当てメモリに配置するには、配置 new を使用します。配置 new は特定の状況、たとえば、オブジェクトを既知のメモリ位置に配置する必要がある場合などに、new よりも有利です。
new 演算子は、オブジェクトに必要な正しい量のアライメント済みメモリを自動的に割り当てます。一方、配置 new を使用する場合は、渡すポインターに十分なストレージ容量があり、正しくアライメントされていることを手動で確認しなければなりません。この制約に違反すると、オブジェクトがアライメントされていない場所に構築されたり、割り当て境界外のメモリが初期化されたりして、予期しない動作、あるいは実装によって異なる動作を引き起こす可能性があります。
Polyspace 実装
ポインター ptr がスタック上に事前割り当てされた m バイトのメモリを指し、アライメントが n であるものとします。たとえば、ptr が配列である場合、次のようになります。
uint8_t ptr[5];
sizeof(uint8_t) * 5 で、アライメントは alignof(uint8_t) です。配置 new 式でこのポインターに m バイトを超える割り当てを行ったり、割り当てで必要なアライメントが n より大きい場合、チェッカーは違反を報告します。ポインター アライメントを判断する際、チェッカーは std::align などの明示的なアライメントを考慮に入れます。チェッカーはヒープ上に事前割り当てされたメモリのポインターを考慮に入れません。使用可能なストレージは使用可能なメモリに依存するからです。これは実行時にならないとわかりません。
トラブルシューティング
ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 言語サポート ライブラリ |
| カテゴリ: Required、Automated |
バージョン履歴
R2020b で導入