경고 C26831
할당 크기는 숫자 오버플로의 결과일 수 있습니다.
이 경고는 할당에 지정된 크기가 숫자 오버플로의 결과일 수 있음을 보고합니다. 예시:
void *SmallAlloc(int);
void foo(int i, int j)
{
int* p = (int*)SmallAlloc(i + j); // Warning: C26831
p[i] = 5;
}
오버플로하는 경우 i+j
예상보다 작은 버퍼를 반환합니다 SmallAlloc
. 이로 인해 나중에 버퍼에 액세스하려는 시도가 범위를 벗어날 수 있습니다. 이 코드 패턴은 원격 코드 실행 취약성을 초래할 수 있습니다.
검사는 , malloc
및 VirtualAlloc
. 같은 일반적인 할당 함수에 new
적용됩니다. 이 검사는 함수 이름에 대/소문자를 구분하지 않는 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;
}