할당 크기는 부호 있는 값이 음수이면 오버플로가 발생할 수 있는 부호 없는 축소 변환의 결과입니다.
이 경고는 Visual Studio 2022 버전 17.13에 추가되었습니다.
발언
할당에 지정된 크기가 부호 없는 값으로 음수 부호 있는 값을 변환한 결과일 수 있다고 보고합니다. 예를 들어:
void* CustomAlloc(size_t);
int* CreateIntArray(int numberOfElements)
{
int* p = (int*)CustomAlloc(numberOfElements * sizeof(int)); // Warning: C26838
return p;
}
식은 numberOfElements * sizeof(int)
, numberOfElements
서명되고 sizeof(int)
서명되지 않았습니다. 64비트 컴퓨터에서 numberOfElements
sizeof(int)
곱하면 부호 없는 값으로 승격됩니다.
numberOfElements
음수이면 결과 값이 오버플로되거나 CustomAlloc
전달될 때 예기치 않은 결과가 발생할 수 있습니다.
이 검사는 new
, malloc
및 VirtualAlloc
같은 일반적인 할당 함수에 적용됩니다. 이 검사는 함수 이름에 alloc
(대/소문자를 구분하지 않는) 사용자 지정 할당자 함수에도 적용됩니다.
이 검사는 경우에 따라 검사가 보수적이므로 특정 검사에서 오버플로를 방지할 수 있음을 인식하지 못합니다.
본보기
부호 있는 음수 값으로 인해 numberOfElements * sizeof(int)
오버플로될 수 있는 이전 코드 예제를 수정하려면 해당 값이 오버플로되지 않도록 검사를 도입합니다. 예를 들어:
void* CustomAlloc(size_t);
int* CreateIntArray(int numberOfElements)
{
if (numberOfElements < 0)
return nullptr;
int* p = (int*)CustomAlloc(numberOfElements * sizeof(int));
// ...
return p;
}
이전 예제에서 음수 값을 확인하면 C26832
경고가 해결됩니다. 관련된 형식의 크기에 따라 이 검사를 수행하면 C26831
같은 다른 경고가 발생할 수 있습니다. 예를 들어 32비트 시스템에서는 int
및 size_t
모두 32비트이므로 곱하기 결과는 음수 값 없이도 계속 오버플로될 수 있습니다.