概要
すべての引数型のサイズが 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 と静的ツール のロゴ テスト ページを参照してください。