EN JP CN

CWARN.BITOP.SIZE

CWARN.BITOP.SIZE

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

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

脆弱性とリスク

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

脆弱コード例

1  typedef unsigned int u32;
2  typedef unsigned long long u64;

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

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

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

  ...

10   value64 &= ~mask32;
11  }

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