CWARN.BITOP.SIZE

ビット演算のオペランドのサイズが異なります

CWARN.BITOP.SIZE チェッカーは、ビット演算 (&=、|=、^=) に異なるサイズのオペランドを持つコードを検出します。ビット演算の両方のオペランドは通常、チェッカーが 32 ビット値で使用されている 64 ビットマスクにフラグを立てない場合であっても、32 ビットまたは 64 ビットの値でなければなりません。

脆弱性とリスク

符号なしの 32 ビット値が 64 ビット型に変換されると、32 高いビットがゼロに設定されます。これは当初の設計の意図でない可能性があるため、予期しない結果が発生する可能性があります。

脆弱コード例

コピー
  typedef unsigned int u32;
  typedef unsigned long long u64;

  u32 get_u32_value(void);
  u64 get_u64_value(void);

  void example(void) {
    u32 mask32 = 0xff;
    u64 mask64 = 0xff;

    u32 value32 = get_u32_value();
    u64 value64 = get_u64_value();

  ...

   value64 &= ~mask32;
  }

このコードでは、Klocwork は、32 ビットマスクが 64 ビットデータで使用されている 10 行目にフラグを立てます。