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 です。result は 0000 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 から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 式 |
| カテゴリ: Required、Automated |
PQL 名: std.autosar_cpp14.M5_0_10 |
バージョン履歴
R2019a で導入