영어로 읽기

다음을 통해 공유


경고 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 작은 버퍼를 할당합니다. 이로 인해 나중에 버퍼에 액세스하려는 시도가 범위를 벗어날 수 있습니다. 이 코드 패턴은 원격 코드 실행 취약성을 초래할 수 있습니다.

이 검사는 , mallocVirtualAlloc. 같은 일반적인 할당 함수에 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;
}

참고 항목

C26831
C26832