メインコンテンツ

MISRA C:2012 Rule 6.3

A bit field shall not be declared as a member of a union

R2024a 以降

説明

ルール定義

A bit field shall not be declared as a member of a union 1 .

This rule comes from MISRA C™:2012 Amendment 3.

根拠

C 標準は、型の内部でのビット フィールドのビット位置を指定していません。たとえば、次のコードのビット フィールド oneByte は、int32_t ストレージ単位の先頭 8 ビットまたは末尾 8 ビットの可能性があります。

int32_t oneByte:8;
ビット フィールドの正確なビット位置は、プロセッサのエンディアン、コンパイラ、およびその他の実装依存要素によって異なります。型パニングのために共用体内でビット フィールドを使用する場合、ビット フィールドのストレージは未指定であり、実装によって異なります。このコードでは、32 ビット number でのビット フィールド oneByte のオーバーレイ方法は未指定です。
union myUnion {
	int32_t number;
	int oneByte: 8;
};

void foo() {
	union myUnion U1;
	U1.number = 0xDEADBEEF;
}
U1.oneByte の値は、実装に応じて 0xDE または 0xEF のいずれかになります。

共用体内でビット フィールドを使用する場合、コードの動作は実装によって異なります。共用体内でのビット フィールドの使用は避けてください。

Polyspace 実装

ビット フィールドが共用体のメンバーとして宣言されている場合、Polyspace® はこのルールの違反を報告します。ビット フィールドを共用体メンバー内のサブオブジェクトとして宣言することは、このルールの違反ではありません。たとえば、struct 内にビット フィールドがあり、struct を含む共用体を宣言する場合、このルールの違反ではありません。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

この例では、ビット フィールドが共用体 myUnion1 内で宣言されています。C 標準ではビット フィールドのビット位置が未指定であるため、関数 foo() の戻り値は実装によって異なります。Polyspace はこのルールの違反を報告します。

#include<stdint.h>
union myUnion1 {
	int32_t number;
	int oneByte: 8 //Noncompliant
};
union myUnion2 {
	int32_t number;
	int8_t oneByte; //Compliant
};
struct date {
	int day : 5;
	int m : 4;
	int y;
};

union myUnion3 { //Compliant
	int64_t numDate;
	struct date sDate;
};

int foo() {
	union myUnion1 U1;
	U1.number = 0xDEADBEEF;
	if(U1.oneByte == 0xDE) {
		return 1;
	} else {
		return -1;
	}

}

myUnion2 に示すように、ビット フィールドの代わりに 8 ビット整数を使用することを検討してください。myUnion2 では oneByte のビット位置が指定されています。この共用体を型パニングの目的で使用しても、コード処理系定義になりません。この共用体はこのルールに準拠しています。myUnion3 に示すようにビット フィールドを共用体のサブオブジェクトとして維持することは、このルールに準拠しています。

チェック情報

グループ:
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2024a で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.