メインコンテンツ

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

MISRA C:2023 Rule 12.2

The right hand operand of a shift operator shall lie in the range zero to one less than the width in bits of the essential type of the left hand operand

R2024a 以降

説明

ルール定義

The right hand operand of a shift operator shall lie in the range zero to one less than the width in bits of the essential type of the left hand operand

根拠

以下のステートメントを考えてみます。

var = abc << num;
abc が 16 ビット整数の場合、num0..15 (非負かつ 16 未満) の範囲になければなりません。num が負または 16 より大きい場合、シフト演算の動作は未定義です。

Polyspace 実装

Polyspace® は、シフト演算子の右側のオペランドがこのルールで定義された範囲を超えている場合に違反を報告します。右側のオペランドが変数である場合、オペランドの取り得るすべての値がこのルールで定義された範囲内にあるのでない限り、違反が報告されます。

プリプロセッサ命令により、数値リテラルでシフト演算が行われる場合、Polyspace はその数値が 64 ビット幅であると仮定します。このような数値で有効なシフト範囲は 0 から 63 の間です。次に例を示します。

#if (1 << 64) //Noncompliant
//...
#endif
ビットフィールドが複合式内にある場合、Polyspace はこのチェックをビットフィールドのフィールド幅または基本データ型の幅に拡張します。

トラブルシューティング

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

すべて展開する

void foo(void) {
  int i;
  unsigned int BitPack = 0U;
  
  for (i = 0; i < 32; i++) {
    BitPack |= (1U << ((unsigned int)i));  //Noncompliant
  }
}

この例では、シフト演算子の左側のオペランド 1U の実質的な型は unsigned char です。右側のオペランドに許容される値は 0 から 7 の範囲内です。右側のオペランド i の範囲は 0 から 31 であるため、Polyspace はこのシフト演算子にフラグを設定します。

チェック情報

グループ:
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2024a で導入