MISRA C++:2008 Rule 9-5-1
Unions shall not be used
説明
ルール定義
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 を使用する前に、使用するコンパイラのマニュアルを参照し、double が int として解釈されることに対するコンパイラの対応をドキュメント化します。
Polyspace 実装
Polyspace® は、union の宣言にフラグを設定します。コード内で union の使用が必要または許容されると思われる場合があります。このような場合、結果に注釈を付けるかまたはコード コメントを使用することで、違反を正当化します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 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.