Power_s.Ch1 = ( (uint8)(((*RequestData)[0]) << 8 ) | ((*RequestData)[1]) );
-> 次のエラーがスローされます:
- MISRA 2004 Required Rule 12.8 に違反、シフト演算子の右辺の範囲外の値
- MISRA 2004 Required Rule 10.1、複雑な整数式の暗黙の変換に違反します
これを解決するには?
1.u8オペランドを想定すると、7ビットを超えて左にシフトするには、 uint8 よりも広い整数が必要です。この場合、8でシフトしています。
2. Power_s.Ch1 が uint8 より大きい型であると仮定すると、unit8 からより高い整数型への暗黙的な変換が行われます。
整数昇格と算術変換規則を確認してください。シフトの場合、通常の単項変換は各オペランドに個別に適用され、結果の型は変換された左オペランドの型になります。
12.8 では、シフトの右オペランドは、左オペランドの基礎となる型のビット数よりも小さくなければならないと述べています。RequestData
タイプが の場合uint8_t*
、静的アナライザーは、uint8_t を 8 だけ左シフトする意味がないことを伝えています。RequestData
他のタイプの場合、静的アナライザーは壊れています。
10.1 は確かに、暗黙的な整数型の昇格を懸念しています。次の方法でコードを修正します。
uint8_t u8_result = (uint8_t)((*RequestData)[0] << SMALL_ENOUGH);
Power_s.Ch1 = (uint8_t)(u8_result | (*RequestData)[1]); // assuming Power_s.Ch1 is uint8_t.
ほとんどの場合、上記のように式を数行に分割する必要があります。そうしないと、多くのキャストのために判読できなくなります。