警告 C26832

分配大小是可能导致溢出的收缩转换的结果

备注

此警告报告为分配指定的大小可能是导致数值溢出的收缩转换的结果。 例如:

void* SmallAlloc(int);

void foo(unsigned short i, unsigned short j)
{
    unsigned short size = i + j;
    
    int* p = (int*)SmallAlloc(size); // Warning: C26832
    p[i] = 5;
}

在表达式 i + j 中,ij 都提升为整数,加法的结果存储在临时整数中。 然后,在 size 中存储值之前,将临时整数隐式强制转换为 unsigned short。 强制转换为 unsigned short 可能会溢出,在这种情况下,SmallAlloc 可能会返回比预期更小的缓冲区。 这可能导致稍后对缓冲区的访问尝试超出边界。 此代码模式可能会导致远程代码执行漏洞

此检查适用于常见的分配函数,例如 newmallocVirtualAlloc。 此检查也适用于函数名称中具有 alloc(不区分大小写)的自定义分配器函数。

有些检查可能会阻止溢出,而此检查有时无法识别这一点,因为它是保守的。

此警告在 Visual Studio 2022 版本 17.7 及更高版本中可用。

示例

若要修复 i+j 可能溢出的上一个代码示例,请引入检查以确保它不会溢出。 例如:

void *SmallAlloc(int);

void foo(unsigned short i, unsigned short j)
{
    if (i > 100 || j > 100)
        return;

    unsigned short size = i + j;
    
    int* p = (int*)SmallAlloc(size);
    p[i] = 5;
}

另请参阅

C26831
C26833