경고 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
작은 버퍼를 할당합니다. 이로 인해 나중에 버퍼에 액세스하려는 시도가 범위를 벗어날 수 있습니다. 이 코드 패턴은 원격 코드 실행 취약성을 초래할 수 있습니다.
이 검사는 , malloc
및 VirtualAlloc
. 같은 일반적인 할당 함수에 new
적용됩니다. 이 검사는 함수 이름에 대/소문자를 구분하지 않는 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;
}