다음을 통해 공유


경고 C6201

인덱스 'index-name'이 스택 할당 버퍼 'variable'에 대해 유효한 인덱스 범위 'minimum'에서 'maximum'로 벗어났습니다.

이 경고는 지정된 스택 배열의 정수 오프셋이 해당 배열의 최대 범위를 초과했음을 나타냅니다. 스택 오버플로 오류, 정의되지 않은 동작 또는 충돌이 발생할 수 있습니다.

설명

이 결함의 일반적인 원인 중 하나는 배열의 크기를 배열의 인덱스로 사용하는 것입니다. C/C++ 배열 인덱싱은 0부터 시작하므로 배열에 대한 최대 법적 인덱스는 배열 요소 수보다 1보다 작습니다.

코드 분석 이름: INDEX_EXCEEDS_MAX

예시

다음 코드는 경고 C6201을 생성합니다. for 루프 조건이 14로 설정 i 되는 경우의 유효한 인덱스 범위를 초과합니다. 이 범위 buff 는 끝의 한 요소입니다.

void f()
{
    int buff[14]; // array of 0..13 elements
    for (int i = 0; i <= 14; i++) // i == 14 exceeds the bounds
    {
        buff[i] = 0; // initialize buffer
    }
}

경고를 수정하려면 인덱스가 경계에 있는지 확인합니다. 다음 코드는 수정된 루프 조건을 보여줍니다.

void f()
{
    int buff[14]; // array of 0..13 elements
    for (int i = 0; i < 14; i++) // i == 13 on the final iteration
    {
        buff[i]= 0; // initialize buffer
    }
}

경험적 학습

이 분석은 스택 할당 배열로 제한됩니다. 예를 들어 SAL(Microsoft 소스 코드 주석 언어) 주석 길이를 사용하여 함수에 전달된 배열은 고려하지 않습니다.

모든 산술 연산을 정확하게 분석할 수 있는 것은 아니기 때문에 이 분석이 가능한 모든 범위를 벗어난 인덱스를 catch할 수는 없습니다. 범위를 벗어난 인덱스를 보장할 수 있는 사례를 보고하도록 조정됩니다. 경고가 없으면 인덱스가 경계에 있다고 보장되는 것은 아닙니다.