このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MISRA C:2012 Rule 10.1
Operands shall not be of an inappropriate essential type
説明
ルール定義
Operands shall not be of an inappropriate essential type 1 .
根拠
実質的な型カテゴリはオブジェクトまたは式の実質的な型を定義します。
実質的な型カテゴリ | 標準的な型 |
---|---|
実質的な boolean 型 |
オプション |
実質的な文字型 | char |
実質的な enum 型 | 名前付き enum |
実質的な符号付き型 | 符号付き char 、符号付き short 、符号付き int 、符号付き long 、符号付き long long |
実質的な符号なし型 | 符号なし char 、符号なし short 、符号なし int 、符号なし long 、符号なし long long |
実質的な浮動小数点型 | 実数の浮動小数点型: 複素数の浮動小数点型: |
一部の演算子のオペランドには、特定の実質的な型を使用できません。次の表で、各行は演算子とオペランドの組み合わせを表しています。実質的な型の列が対応する行に対して空白でない場合、その型をオペランドとして使用するときに MISRA による制約があります。表内の番号は表の後の根拠リストと対応します。
演算 | 算術オペランドの実質的な型カテゴリ | |||||||
---|---|---|---|---|---|---|---|---|
演算子 | オペランド | boolean | 文字 | enum | 符号付き | 符号なし | 浮動小数点 | |
実 | 複素 | |||||||
[ ] | 整数 | 3 | 4 | 1 | 9 | |||
+ (単項) | 3 | 4 | 5 | |||||
- (単項) | 3 | 4 | 5 | 8 | ||||
+ - | いずれか | 3 | 5 | |||||
++ -- | 3 | 5 | 9 | |||||
* / | いずれか | 3 | 4 | 5 | ||||
% | いずれか | 3 | 4 | 5 | 1 | 9 | ||
< > <= >= | いずれか | 3 | 9 | |||||
== != | いずれか | 10 | 10 | |||||
! && || | 任意 | 2 | 2 | 2 | 2 | 2 | 2 | |
<< >> | 左 | 3 | 4 | 5、6 | 6 | 1 | 9 | |
<< >> | 右 | 3 | 4 | 7 | 7 | 1 | 9 | |
~ & | ^ | 任意 | 3 | 4 | 5、6 | 6 | 1 | 9 | |
?: | 1 番目 | 2 | 2 | 2 | 2 | 2 | 2 | |
?: | 2 番目と 3 番目 |
これらのオペランドに対する実質的な浮動小数点型の式は制約違反です。
オペランドがブール値と解釈される場合、実質的な boolean 型の式を使用します。
オペランドが数値と解釈される場合、実質的な boolean 型のオペランドを使用しません。
オペランドが数値と解釈される場合、実質的な文字型のオペランドを使用しません。文字データの数値は処理系定義です。
算術演算では、実質的な enum 型のオペランドを使用しません。enum オブジェクトは処理系定義の整数型を使用します。そのため、enum オブジェクトを含む演算は予期しない型の結果となる場合があります。
実質的な符号なし型のオペランドでは、シフト演算とビット演算のみ実行します。実質的な符号付き型にシフト演算およびビット演算を使用すると、結果として得られる数値は未定義または処理系定義になります。
負のシフトでの未定義の動作を回避するには、実質的な符号なしの右辺のオペランドを使用します。
単項マイナス演算子には、実質的な符号なし型のオペランドを使用しません。実装された int のサイズが結果の符号属性を決定します。
これらのオペランドに対する実質的な複素数の浮動小数点型の式は制約違反です。
浮動小数点型の比較は、予期しない実装依存の結果につながる可能性があります。浮動小数点型を比較するときには、浮動小数点の粒度 (
FLT_EPSILON
) と数値の大きさを考慮してください。
ビットフィールド型に関しては、ビットフィールドが次のように実装されている場合にどうなるかに注意してください。
boolean として実装されている場合は、ビットフィールドが実質的に boolean です。
符号付き型または符号なし型として実装されている場合は、ビットフィールドが実質的に符号付きまたは符号なしです。
ビットフィールドの型は、ビットフィールドを表現可能な最小の型です。たとえば、
stmp
型は実質的に 8 ビットの整数です。typedef signed int mybitfield; typedef struct { mybitfield f1 : 1; } stmp;
実質的な型についての詳細は、MISRA C Rule 10.x の実質的な型を参照してください。
Polyspace 実装
Polyspace® は、演算のオペランドの実質的な型が不適切な場合に、このルールの違反を報告します。例外として、Polyspace は以下の場合には違反を報告しません。
実質的な符号付き型の非負の整数定数式を、シフト演算子の右オペランドとして使用する場合。
実質的な実数の浮動小数点型または実質的な複素数の浮動小数点型のオブジェクトを、定数リテラル 0、マクロ
INFINITY
または-INFINITY
と比較する場合。
トラブルシューティング
ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。
例
チェック情報
グループ: 実質的な型モデル |
カテゴリ: 必要 |
AGC カテゴリ: 推奨 |
バージョン履歴
参考
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.