AUTOSAR C++14 Rule A12-0-2
Bitwise operations and operations that assume data representation in memory shall not be performed on objects
説明
ルール定義
Bitwise operations and operations that assume data representation in memory shall not be performed on objects.
根拠
C++ では、メモリ内のオブジェクト表現には以下が含まれます。
さまざまなアクセス権限を使用して宣言されたデータ メンバー
ビット フィールド データ メンバー
データ メンバー間のパディング バイト
データ メンバーの末尾にあるパディング バイト
バーチャル関数をサポートするための vtable へのポインター
このようなメモリ内のオブジェクトのさまざまな部分の配置は環境によって異なります。加えて、オブジェクトの静的データ メンバーや関数メンバーは、メモリ内で個別の物理的な場所に保存されます。メモリ内のデータの特定の配置を前提とし、オブジェクトに対するビット演算を実行すると、気が付かずに前提を誤り、オブジェクトの値表現の一部ではないビットにアクセスする可能性があります。このようなビットへのアクセスは未定義動作につながる可能性があります。
バーチャル関数を含む次のクラスについて考えます。
class notPOD{
public:
virtual void foo();
int value;
protected:
double dvalue;
};
//...
int main(){
notPOD Obj;
std::memset(&Obj, 57, 2); // attempts to set Obj::value to 57
}Obj がメモリ ブロック内に保存されている場合、そのブロックには変数 Obj::value と変数 Obj::dvalue に加えて、バーチャル テーブルへのポインターが含まれています。メモリ内のこのポインターのサイズまたはその位置は環境によって異なる場合があります。main() では、std::memset() が以下を前提として Obj::value の値を設定しようとします。
Obj::valueは、Objのメモリ表現内の最初のブロックです。Obj::valueは、メモリ内で 2 バイトで表現されます。
一般的にこれらの前提は正しくないため、std::memset() の使用は未定義動作につながる可能性があります。たとえば、バーチャル テーブルへのポインターを誤って変更した場合は、foo() を呼び出すと、予期せぬ関数が呼び出される可能性があります。
クラスの表現とメモリ内の構造は環境によって異なるため、値表現と一緒に追加のバイトが含まれている場合があります。オブジェクトのデータ表現に依存してビット演算を実行すると、値表現の一部ではないビットの変更を引き起こし、未定義動作につながる可能性があります。メモリ内のオブジェクトの特定の表現を前提としてビットにアクセスする演算は避けてください。クラスに対して演算を実行するには、専用のメンバー関数、オーバーロードされた演算子、またはミューテーターを使用してください。
Polyspace 実装
メモリ ビットにアクセスする C 関数には、std::memset()、std::memcpy()、std::memmove()、std::strcpy()、std::memcmp()、std::strcmp() があります。Polyspace® は、以下の場合にステートメントにフラグを設定します。
C 関数を使用して、非トリビアル オブジェクトを初期化またはコピーする。
C 関数を使用して、非標準のレイアウト オブジェクトを比較する。
パディング データを含むオブジェクトに対して C 関数を使用する。
非準拠の演算を含むステートメントにはフラグが設定され、関連するクラス宣言が強調表示されます。トリビアルおよび標準のレイアウト クラスに関する定義については、C++ Standard、[class]、段落 6 および 7 をそれぞれ参照してください。
例外として、パディング データを含まないトリビアルと標準のレイアウト オブジェクトのメモリ ビットに C 関数を使用してアクセスする演算には、Polyspace はフラグを設定しません。パディング データを含まないトリビアルと標準のレイアウト クラスに対するビット演算の使用は、このルールに準拠していますが、適切な使用法ではありません。代わりに、専用のメンバー関数、オーバーロードされた演算子、またはミューテーターを使用してください。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 |
| カテゴリ: Required、Partially automated |
バージョン履歴
R2020b で導入