共用方式為


警告 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 中,和 j 都會 i 升階為整數,而加法的結果會儲存在暫存整數中。 然後,暫存整數會隱含轉換成 unsigned short ,然後再將值儲存在 中 size 。 轉換至 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