경고
할당 크기는 오버플로를 초래할 수 있는 축소 변환의 결과입니다.
설명
이 경고는 할당에 지정된 크기가 숫자 오버플로를 초래하는 축소 변환의 결과일 수 있음을 보고합니다. 예시:
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에서 둘 다 i 정 j 수로 승격되고 추가 결과는 임시 정수에 저장됩니다. 그런 다음, 임시 정수는 값을 저장하기 unsigned short 전에 암시적으로 1로 size캐스팅됩니다. 오버플로될 unsigned short 수 있는 캐스트입니다. 이 경우 SmallAlloc 예상보다 작은 버퍼를 반환할 수 있습니다. 이로 인해 나중에 버퍼에 액세스하려는 시도가 범위를 벗어날 수 있습니다. 이 코드 패턴은 원격 코드 실행 취약성을 초래할 수 있습니다.
이 검사는 , malloc및 VirtualAlloc. 같은 일반적인 할당 함수에 new적용됩니다. 이 검사는 함수 이름에 대/소문자를 구분하지 않는 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;
}