警告 C26831
分配大小可能是数值溢出的结果
注解
此警告报告为分配指定的大小可能是数值溢出导致的。 例如:
void *SmallAlloc(int);
void foo(int i, int j)
{
int* p = (int*)SmallAlloc(i + j); // Warning: C26831
p[i] = 5;
}
如果 i+j
溢出,SmallAlloc
则返回小于预期的缓冲区。 这可能导致稍后对缓冲区的访问尝试超出边界。 此代码模式可能会导致远程代码执行漏洞。
此检查适用于常见的分配函数,例如 new
、malloc
和 VirtualAlloc
。 此检查也适用于函数名称中具有 alloc
(不区分大小写)的自定义分配器函数。
有些检查可能会阻止溢出,而此检查有时无法识别这一点,因为它是保守的。
此警告在 Visual Studio 2022 版本 17.7 及更高版本中可用。
示例
若要修复 i+j
可能溢出的上一个代码示例,请引入检查以确保它不会溢出。 例如:
void *SmallAlloc(int);
void foo(int i, int j)
{
if (i < 0 || j < 0 )
{
return;
}
if (i > 100 || j > 100)
{
return;
}
int* p = (int*)SmallAlloc(i + j);
p[i] = 5;
}
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈