BadOverflowGuard(Windows 驱动程序 CodeQL 查询)

概述

如果所有参数类型的大小都小于 4 个字节,则通过与添加的参数之一进行比较来检查加法溢出会失败。 这是因为添加的结果将提升为 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;
}

若要修复该 bug,请通过将加法与至少为 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 和静态工具徽标测试 页。