メインコンテンツ

MISRA C++:2008 Rule 9-5-1

説明

ルール定義

Unions shall not be used 1

根拠

共用体を使用して値を格納すると、値が誤って解釈される可能性があり、未定義の動作につながる可能性があります。次に例を示します。

union Data{
	int i;
	double d;
};
void bar_int(int);
void bar_double(double);
void foo(void){
	Data var;
	var.d = 3.1416;
	bar_int(var.d);//Undefined Behavior
} 
bar_int の呼び出しで、共用体の double データが int として誤って解釈されます。これは未定義の動作です。コンパイラによるこの誤った解釈に対する対応は、実装に応じて異なる可能性があります。未定義の動作を回避するため、union を使用しないでください。

場合によっては、効率化のために共用体を使用する必要があります。このような場合は、関連する処理系定義のコンパイラ動作をドキュメント化してから、共用体を使用します。前述のケースでは、union を使用する前に、使用するコンパイラのマニュアルを参照し、doubleint として解釈されることに対するコンパイラの対応をドキュメント化します。

Polyspace 実装

Polyspace® は、union の宣言にフラグを設定します。コード内で union の使用が必要または許容されると思われる場合があります。このような場合、結果に注釈を付けるかまたはコード コメントを使用することで、違反を正当化します。詳細は、以下を参照してください。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <iostream>

union Pi{ //Noncompliant
	int i;
	double d;
};

void foo(void){

	std::cout << std::endl;

	Pi pi;
	pi.d = 3.1416;// pi holds a double
	std::cout << "pi.d: " << pi.d << std::endl;     
	std::cout << "pi.i: " << pi.i << std::endl;      // Undefined Behavior

	std::cout << std::endl;

	pi.i = 4;     // pi holds an int
	std::cout << "pi.i: " << pi.i << std::endl;
	std::cout << "pi.d: " << pi.d << std::endl;      // Undefined Behavior

	std::cout << std::endl;

}

この例では、union Pidouble および int が含まれています。このコードでは、union を使用して intdouble として (あるいはこの逆として) 誤って解釈されます。このような誤った解釈は未定義の動作であり、バグと、実装に依存するコードの動作につながる可能性があります。Polyspace は union 宣言にフラグを設定します。

チェック情報

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

バージョン履歴

R2013b で導入


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.