メインコンテンツ

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

MISRA C:2012 Rule 10.4

Both operands of an operator in which the usual arithmetic conversions are performed shall have the same essential type category

説明

ルール定義

Both operands of an operator in which the usual arithmetic conversions are performed shall have the same essential type category 1 .

根拠

異なる型の間で暗黙的な変換を使用すると、値、符号、精度の損失の可能性を含め、意図しない結果を引き起こす場合があります。

実質的な型についての詳細は、MISRA C Rule 10.x の実質的な型を参照してください。

Polyspace 実装

チェッカーは、演算の 2 つのオペランドの実質的な型が異なる場合に、このルールの違反を報告します。チェッカー メッセージに、演算の 2 辺で検出された型が表示されます。

オペランドの 1 つが定数 0 である場合、チェッカーはこのルールに対する違反を報告しません。

演算で符号なし整数オペランドと符号付き整数定数オペランドが使用されている場合、符号付き定数の表現がそれと等価の符号なしの値と同じバイナリ表現であれば、Polyspace® は違反を報告しません。たとえば以下のコードでは、11U のバイナリ表現が同じであるため、Polyspace は式 (var + 1) の型は実質的な符合なし整数型であると仮定します。

unsigned int var;
int signed_var = (int) (var + 1);
この仮定により、上記のコードはこのルールに準拠していることになります。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#define S64_MAX (9223372036854775807LL)
#define S64_MIN (-9223372036854775808LL)
long long input_s64_a, input_s64_b, result_s64;

void my_func(void){
   if (input_s64_a < S64_MIN + input_s64_b) { //Noncompliant: 2 violations
      result_s64 = S64_MIN;
   }
}

この例では、S64_MIN の型が実質的に符号なしです。値 9223372036854775808LL は、64 ビット変数で表現可能な最大値よりも大きい値です。したがって、この値はオーバーフローし、結果が負の値にラップ アラウンドするため、-9223372036854775808LL は実質的に符号なしです。

演算子 input_s64_a < S64_MIN + input_s64_b は、2 回、ルールに違反します。

  • + 演算子は、ルールに違反します。左オペランドは実質的に符号なしで、右オペランドは符号付きです。

  • < 演算子も、ルールに違反します。型の上位変換の結果として、+ 演算子の結果は実質的に符号なしです。ここで、< 演算子の左オペランドは実質的に符号付きですが、右オペランドは実質的に符号なしです。

チェック情報

グループ: 実質的な型モデル
カテゴリ: 必要
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.