警告 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
可能會傳回比預期較小的緩衝區。 這可能會導致界限外嘗試稍後存取緩衝區。 此程式碼模式可能會導致遠端程式碼執行弱點
這項檢查適用于常見的配置函式,例如 new
、 malloc
和 VirtualAlloc
。 檢查也適用于函式名稱中不 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;
}