メインコンテンツ

AUTOSAR C++14 Rule M5-0-10

If the bitwise operators ~and << are applied to an operand with an underlying type of unsigned char or unsigned short, the result shall be immediately cast to the underlying type of the operand

説明

ビット演算子 ~ および << を、符号なし char または符号なし short の潜在型のオペランドに適用する場合、その結果をオペランドの潜在型にすぐにキャストするものとします。

根拠

ビット演算子 ~ および << を符号なし short や符号なし char などの小さい整数型に適用すると、演算の前に汎整数拡張が行われます。つまり、小さい整数型がそれよりも大きな整数型に昇格されてから、演算が行われます。このようなビット演算には、想定以上に高次のビットが含まれる可能性があります。次に例を示します。

uint8_t var = 0x5aU;
uint8_t result = (~var)>>4;
var のバイナリ表現は 0101 1010 であり、~var の場合は 1010 0101 です。result0000 1010 であると想定できます。~var が計算される前に var が大きい整数に昇格されるため、結果は 1111 1010 になります。この高次のビットは想定外である可能性があります。このような演算の結果は、実装に含まれる int のサイズに依存する可能性があります。

混乱と予期せぬエラーを回避するには、演算結果を使用する前に、ビット演算子 ~ および >> の結果をオペランドの潜在型にキャストします。次に例を示します。

uint8_t var = 0x5aU;
uint8_t result = (static_cat<unit8_t>(~var))>>4;
この例での result のバイナリ表現は 0000 1010 であり、これは期待値です。

例外として、これらのビット演算子を short 整数型に対して適用し、その直後に演算結果を同じ潜在型のオブジェクトに代入する場合、型のキャストは必要となりません。たとえば、この例での結果の値は 0000 1010 であり、キャストは必要になりません。

uint8_t var = 0x5aU;
unit8_t result = ~var; // No higher order bits 
                       // due to implicit conversion
uint8_t result = results>>4;

Polyspace 実装

以下の条件がすべて当てはまる場合、Polyspace® はビット演算子 ~ および >> の使用にフラグを設定します。

  • 演算子が unsigned short または unsigned char オペランドに対して使用される。

  • 演算の結果が、潜在型がオペランドと同じオブジェクトに即時に代入されない。

  • 結果がオペランドの潜在型にキャストされずに使用される。

トラブルシューティング

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

すべて展開する

#include<cstdint>
void foo(){
	uint8_t var = 0x5aU;
	uint8_t result;
	result = ( ~var ) >> 4; // Non-compliant
	result = static_cast<uint8_t>(( ~var )) >> 4; // Compliant
	uint8_t cbe = ~var;//Compliant by Exception
}

この例では、Polyspace が小さい整数型 var に対する ~ の使用にフラグを設定します。以下の理由から、~ 演算子にフラグが設定されます。

  • 符号なし short 整数型 var に対して演算を行っている。

  • ~varuint8_t にキャストせずに演算子の結果が式で使用されている。

~ 演算子の結果が unit8_t にキャストされる場合、その使用方法はこのルールに準拠しています。~ の結果が即時に変数 unit8_t に代入される場合は、例外として、その使用方法はこのルールに準拠しています。

チェック情報

グループ:
カテゴリ: Required、Automated
PQL 名: std.autosar_cpp14.M5_0_10

バージョン履歴

R2019a で導入