共用方式為


警告 C26833

配置大小可能是系結檢查之前數值溢位的結果

備註

此警告會報告為配置指定的大小可能是數值溢位的結果。 例如:

void* SmallAlloc(int);

void foo(unsigned i, unsigned j)
{
    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

    int* p = (int*)SmallAlloc(size + 5); // Warning: C26833
    p[j] = 5;
}

檢查 size > 50 是否太晚。 如果 i + j 溢位,它會產生傳遞檢查的小型值。 然後, SmallAlloc 配置小於預期的緩衝區。 這可能會導致界限外嘗試稍後存取緩衝區。 此程式碼模式可能會導致遠端程式碼執行弱點。

這項檢查適用于常見的配置函式,例如 newmallocVirtualAlloc 。 檢查也適用于函式名稱中不 alloc 區分大小寫的自訂配置器函式。

這項檢查有時無法辨識某些檢查可能會防止溢位,因為檢查是保守的。

此警告適用于 Visual Studio 2022 17.7 版和更新版本。

範例

若要修正先前的程式碼範例,請確定 i+j 無法溢位。 例如:

void* SmallAlloc(int);

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

    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

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

另請參閱

C26831
C26832