BadOverflowGuard (Windows Driver CodeQL クエリ)

概要

すべての引数の型のサイズが 4 バイトより小さい場合、加算の引数の 1 つとの比較による加算のオーバーフローのチェックは失敗します。 これは、加算の結果が 4 バイトの int にプロモートされるためです。

推奨事項

加算結果を少なくとも 4 バイトの値と比較して、オーバーフローを確認します。

この例では、比較の結果、整数オーバーフローが発生します。

unsigned short CheckForInt16OverflowBadCode(unsigned short v, unsigned short b)
{
    if (v + b < v) // BUG: "v + b" will be promoted to 32 bits
    {
        // ... do something
    }
    return v + b;
}

バグを修正するには、加算を少なくとも 4 バイトの値と比較してオーバーフローをチェックします。

unsigned short CheckForInt16OverflowCorrectCode(unsigned short v, unsigned short b)
{
    if (v + b > 0x00FFFF)
    {
        // ... do something
    }
    return v + b;
}

追加の詳細

このクエリは、Microsoft GitHub CodeQL リポジトリにあります。 Windows ドライバー開発者が CodeQL をダウンロードして実行する方法の詳細については、「CodeQL と静的ツールのロゴ テスト」ページを参照してください。