このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MISRA C Rule 10.x の実質的な型
MISRA C™:2012 および MISRA C:2023 Rule 10.x はデータ型をカテゴリに分類します。このルールでは、同じカテゴリのデータ型を実質的に同様の型として扱います。
たとえば、データ型 float
、double
、および long double
は実質的な浮動小数点型と見なされます。ルール 10.1 では、%
演算に実質的な浮動小数点オペランドが含まれてはならないことを規定しています。この記述は、そのオペランドが、float
、double
、および long double
という 3 つのデータ型のいずれをもつ可能性もないことを意味します。
実質的な型のカテゴリ
実質的な型は以下のカテゴリに属します。
実質的な型カテゴリ | 標準的な型 |
---|---|
実質的な boolean 型 |
|
実質的な文字型 | char |
実質的な enum 型 | 名前付き enum |
実質的な符号付き型 | 符号付き char 、符号付き short 、符号付き int 、符号付き long 、符号付き long long |
実質的な符号なし型 | 符号なし char 、符号なし short 、符号なし int 、符号なし long 、符号なし long long |
実質的な浮動小数点型 | 実質的な実数の浮動小数点型: float 、double 、long double |
実質的な複素数の浮動小数点型: float _Complex 、double _Complex 、long double _Complex |
MISRA C での実質的な型の使用方法
以下のルールではそれぞれのステートメントで実質的な型が使用されます。
MISRA C:2012 | MISRA C:2023 | 説明 | 例 |
---|---|---|---|
MISRA C:2012 Rule 10.1 | MISRA C:2023 Rule 10.1 | Operands shall not be of an inappropriate essential type. |
|
MISRA C:2012 Rule 10.2 | MISRA C:2023 Rule 10.2 | Expressions of essentially character type shall not be used inappropriately in addition and subtraction operations. |
|
MISRA C:2012 Rule 10.3 | MISRA C:2023 Rule 10.3 | The value of an expression shall not be assigned to an object with a narrower essential type or of a different essential type category. | データ型 |
MISRA C:2012 Rule 10.4 | MISRA C:2023 Rule 10.4 | Both operands of an operator in which the usual arithmetic conversions are performed shall have the same essential type category. | 実質的な符号付きカテゴリに属する符号付き |
MISRA C:2012 Rule 10.5 | MISRA C:2023 Rule 10.5 | The value of an expression should not be cast to an inappropriate essential type. | 実質的な浮動小数点型と実質的な文字型の間ではキャストを実行しません。 |
MISRA C:2012 Rule 10.6 | MISRA C:2023 Rule 10.6 | The value of a composite expression shall not be assigned to an object with wider essential type. | 乗算、2 進加算、またはビット演算に符号なし |
MISRA C:2012 Rule 10.7 | MISRA C:2023 Rule 10.7 | If a composite expression is used as one operand of an operator in which the usual arithmetic conversions are performed then the other operand shall not have wider essential type. | 加算演算の一方のオペランドが 2 つの符号なし |
MISRA C:2012 Rule 10.8 | MISRA C:2023 Rule 10.8 | The value of a composite expression shall not be cast to a different essential type category or a wider essential type. | 乗算、2 進加算、またはビット演算に符号なし char オペランドが含まれる場合、その結果をより範囲が広い符号なし int 型をもつ変数には代入しません。 |
定数の実質的な型
整数定数の標準の型が signed int
の場合、実質的な型は、整数定数値を表現するために必要な、最もランクが下位の符号付き型です。同様に、整数定数の標準の型が unsigned int
の場合、実質的な型は、整数定数値を表現するために必要な、最もランクが下位の符号なし型です。
たとえば、次の式を考えてみます。
void bitShift(uint32_t shiftVal) { uint32_t shiftResult; shiftResult = 1U << shiftVal; }
char
であるため、1U
の型は実質的に unsigned char
です。式の結果の実質的な型
以降の節では、特定の種類の演算が行われる式の結果の、実質的な型を示します。ここに示すのは、実質的な型を判断することが簡単ではないケースのみであり、全ルールを網羅したリストではないことに注意してください。
関係演算子
結果の型は実質的には boolean です。
ビット単位シフト演算子
左側のオペランドが実質的に符号なしであり、両方のオペランドが整数定数ではない (つまり結果の実質的な型が、結果値を格納できる、最もランクが下位の符号なし型である) 場合、結果の実質的な型はこの左側のオペランドと同じです。
ビット単位の補数
オペランドが実質的に符号なしであり、整数定数ではない (つまり結果の実質的な型が、結果値を格納できる、最もランクが下位の符号なし型である) 場合、結果の実質的な型はこのオペランドと同じです。
単項プラス
オペランドが実質的に符号付きまたは符号なしの場合、結果の実質的な型はオペランドと同じです。
単項マイナス
オペランドが実質的に符号付きであり、整数定数ではない (つまり結果の実質的な型が、結果値を格納できる、最もランクが下位の符号付き型である) 場合、結果の実質的な型はオペランドと同じです。
条件
2 番目と 3 番目のオペランドの実質的な型が同じである場合、この型が結果の実質的な型になります。これらの実質的な型が異なるものの、両方のオペランドが実質的に符号付き (符号なし) の場合、結果の実質的な型は、ランクが上位の方のオペランドの実質的な符号付き (符号なし) 型と同じです。
演算子 *
、/
、%
、+
、-
、&
、|
、および ^
を含む式の実質的な型
演算子 *
、/
、%
、+
、-
、&
、|
、および ^
により、複合式が作成されます。Polyspace® は以下のように仮定します。
式に実質的な文字型、
-
または+
オペランド、int
以下のランクの整数型 (実質的な符号付きまたは符号なし) が含まれている場合、式の実質的な型はchar
です。たとえば、以下のコードの式(chA + siA)
と(chA - siA)
の実質的な型はchar
です。char chA; int siA; unsigned int suA; char exp1 = chA + siA; char exp2 = chA - suA;
式が整数定数式の場合、その式の実質的な型は、式の結果を表現するために必要な最下位ランクの符号付き型 (STLR) です。たとえば、式
(250+350)
の実質的な型はsigned short
です。これは、結果である600
の STLR がsigned short
であるためです。式に実質的に符号なしの整数定数が含まれている場合、その式の実質的な型は、式の結果を表現するために必要な最下位ランクの符号なし型 (UTLR) です。たとえば、式
(5U+4U)
の実質的な型はunsigned char
です。これは、結果である9U
の UTLR がunsigned char
であるためです。両方のオペランドが実質的な符号付き型または実質的な符合なし型の場合、式の実質的な型は、最上位ランクのオペランドの実質的な型です。
上記のいずれのケースにも該当しない式の場合、式の実質的な型は式の標準の型と同じです。
複合式に、1 つの実質的な符号なし整数型オペランドと符号付き整数定数オペランドが含まれている場合、Polyspace は符号付き整数定数オペランドのバイナリ表現をチェックします。このオペランドのバイナリ表現が、それと等価の符号なしの値と同じ場合、Polyspace は整数定数の実質的な型が符号なし型であると仮定してコードを解析します。その後、式の型は実質的な符号なし型と仮定されます。たとえば以下のコードでは、1
と 1U
のバイナリ表現が同じであるため、Polyspace は式 (var + 1)
の型は実質的な符合なし整数であると仮定します。
unsigned int var;
int signed_var = (int) (var + 1);
MISRA C:2023 Rule 10.4
に準拠していることになります。Polyspace は (var + 1)
の型が実質的な符合なし整数であると仮定することから、この式を実質的な符合付き int
型にキャストすると、MISRA C:2023 Rule 10.8
の違反になります。