Partilhar via


Aviso C6201

O índice 'index-name' está fora do intervalo de índice válido 'mínimo' a 'máximo' para possivelmente buffer alocado em pilha 'variável'

Esse aviso indica que um deslocamento inteiro para a matriz de pilha especificada excede os limites máximos dessa matriz. Isso pode causar erros de estouro de pilha, comportamento indefinido ou falhas.

Comentários

Uma causa comum desse defeito é usar o tamanho de uma matriz como um índice na matriz. Como a indexação de matriz C/C++ é baseada em zero, o índice máximo legal em uma matriz é um a menos que o número de elementos da matriz.

Nome da análise de código: INDEX_EXCEEDS_MAX

Exemplo

O código a seguir gera o aviso C6201. A for condição de loop excede o intervalo de índice válido para buff quando é definido i como 14, que é um elemento após o final:

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
    }
}

Para corrigir o aviso, verifique se o índice permanece dentro dos limites. O código a seguir mostra a condição de loop corrigida:

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
    }
}

Heurística

Essa análise é limitada a matrizes alocadas em pilha. Ele não considera, por exemplo, matrizes passadas para a função com um comprimento anotado pela linguagem de anotação de código-fonte (SAL) da Microsoft.

Essa análise não pode capturar todos os índices fora dos limites possíveis porque nem toda aritmética pode ser analisada com precisão. Ele está ajustado para relatar casos em que pode garantir que um índice fora dos limites seja possível. A ausência de um aviso não significa que o índice esteja garantido dentro dos limites.