メインコンテンツ

AUTOSAR C++14 Rule M5-8-1

The right hand operand of a shift operator shall lie between zero and one less than the width in bits of the underlying type of the left hand operand.

説明

ルール定義

The right hand operand of a shift operator shall lie between zero and one less than the width in bits of the underlying type of the left hand operand.

根拠

シフト演算子を使用する場合、右辺のオペランドの値は次の条件を満たす必要があります。

  • ゼロ以上であること。

  • 左辺のオペランドのデータ型のビット サイズ未満であること。

上記の条件を満たさない場合、シフト演算子を使用すると未定義の動作になるため、プログラムが予測不可能な挙動をし、予期しない結果が生成されます。

Polyspace 実装

シフト演算子の右辺で負のオペランドを使用すると、Polyspace® がルール違反を報告します。シフト演算子の右辺のオペランドが左辺のオペランドのデータ型のビット サイズ以上である場合にも、Polyspace は違反を報告します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

int shifted_output (int val) {
    if (val < 3) { 
        return val<<3; //Compliant
    }
    
    if (val > 3) { 
        return val>>-1; //Noncompliant
    } 
    
    return val<<33; //Noncompliant
}

この例では、最初の if ステートメントではシフト演算子の右辺のオペランドが int のサイズより小さく、ゼロより大きいため、Polyspace は違反を報告しません。シフト演算子の右辺のオペランドは、2 番目の if ステートメントでは負であり、3 番目のステートメントでは int のサイズより大きいため、Polyspace は違反を報告します。

チェック情報

グループ:
カテゴリ: Required、Partially automated

バージョン履歴

R2019a で導入