メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C Rule 10.x の実質的な型

MISRA C™:2012 および MISRA C:2023 Rule 10.x はデータ型をカテゴリに分類します。このルールでは、同じカテゴリのデータ型を実質的に同様の型として扱います。

たとえば、データ型 floatdouble、および long double は実質的な浮動小数点型と見なされます。ルール 10.1 では、% 演算に実質的な浮動小数点オペランドが含まれてはならないことを規定しています。この記述は、そのオペランドが、floatdouble、および long double という 3 つのデータ型のいずれをもつ可能性もないことを意味します。

実質的な型のカテゴリ

実質的な型は以下のカテゴリに属します。

実質的な型カテゴリ標準的な型

実質的な boolean 型

bool または _Bool (stdbool.h で定義)

typedef により boolean 型を定義する場合、この型名をコーディング ルール チェックの前に指定しなければなりません。詳細は、有効な boolean 型 (-boolean-types)を参照してください。

実質的な文字型

char

実質的な enum 型

名前付き enum

実質的な符号付き型

符号付き char、符号付き short、符号付き int、符号付き long、符号付き long long

実質的な符号なし型

符号なし char、符号なし short、符号なし int、符号なし long、符号なし long long

実質的な浮動小数点型

実質的な実数の浮動小数点型: floatdoublelong double
実質的な複素数の浮動小数点型: float _Complexdouble _Complexlong double _Complex

MISRA C での実質的な型の使用方法

以下のルールではそれぞれのステートメントで実質的な型が使用されます。

MISRA C:2012MISRA C:2023説明
MISRA C:2012 Rule 10.1MISRA C:2023 Rule 10.1

Operands shall not be of an inappropriate essential type.

<< または >> 演算子の右オペランドは実質的な符号なし型でなければなりません。そうでない場合、負値が原因で未定義の動作になる可能性があります。

MISRA C:2012 Rule 10.2MISRA C:2023 Rule 10.2

Expressions of essentially character type shall not be used inappropriately in addition and subtraction operations.

char 型は数値を表しません。加算演算または減算演算ではこの型の変数を使用しません。

MISRA C:2012 Rule 10.3MISRA 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.

データ型 double の変数をより範囲が狭いデータ型 float の変数には代入しません。

MISRA C:2012 Rule 10.4MISRA 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.

実質的な符号付きカテゴリに属する符号付き int オペランドと、実質的な符号なしカテゴリに属する符号なし int オペランドを使用した加算演算を実行しません。

MISRA C:2012 Rule 10.5MISRA C:2023 Rule 10.5

The value of an expression should not be cast to an inappropriate essential type.

実質的な浮動小数点型と実質的な文字型の間ではキャストを実行しません。

MISRA C:2012 Rule 10.6MISRA C:2023 Rule 10.6

The value of a composite expression shall not be assigned to an object with wider essential type.

乗算、2 進加算、またはビット演算に符号なし char オペランドが含まれる場合、その結果をより範囲が広い符号なし int 型をもつ変数には代入しません。

MISRA C:2012 Rule 10.7MISRA 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 つの符号なし char オペランドを含む複合式である場合、もう一方のオペランドはより範囲の広い符号なし int 型をもってはなりません。

MISRA C:2012 Rule 10.8MISRA C:2023 Rule 10.8The 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;
}
この式では、値 1 を格納できる最もランクが下位の型が 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 は整数定数の実質的な型が符号なし型であると仮定してコードを解析します。その後、式の型は実質的な符号なし型と仮定されます。たとえば以下のコードでは、11U のバイナリ表現が同じであるため、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 の違反になります。

参考

トピック