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 行目にフラグを立てます。