配置大小是帶正負號到未帶正負號縮小轉換的結果,如果帶正負號的值,可能會導致溢位。
此警告已在Visual Studio 2022 17.13版中新增。
言論
報告為配置指定的大小可能是將可能負號值轉換成不帶正負號值的結果。 例如:
void* CustomAlloc(size_t);
int* CreateIntArray(int numberOfElements)
{
int* p = (int*)CustomAlloc(numberOfElements * sizeof(int)); // Warning: C26838
return p;
}
表達式 numberOfElements * sizeof(int)、numberOfElements 已簽署,且 sizeof(int) 為不帶正負號。 在 64 位電腦上,當乘以 sizeof(int)時,numberOfElements 升階為未帶正負號的值。 當 numberOfElements 為負數時,產生的值可能會在傳遞至 CustomAlloc時溢位或產生非預期的結果。
這項檢查適用於常見的設定函式,例如 new、malloc和 VirtualAlloc。 此檢查也適用於函式名稱中具有 alloc(不區分大小寫)的自定義配置器函式。
這項檢查有時無法辨識某些檢查可能會防止溢位,因為檢查是保守的。
例
若要修正先前的程式代碼範例,其中 numberOfElements * sizeof(int) 可能會因為負號值而溢位,請引入檢查以確保它不會。 例如:
void* CustomAlloc(size_t);
int* CreateIntArray(int numberOfElements)
{
if (numberOfElements < 0)
return nullptr;
int* p = (int*)CustomAlloc(numberOfElements * sizeof(int));
// ...
return p;
}
在上一個範例中,檢查負值可解決 C26832 警告。 視所涉及的類型大小而定,這項檢查可能會導致不同的警告,例如 C26831。 例如,在32位系統上,int 和 size_t 都是32位,因此乘法的結果仍會溢位,而不會有負值。