Compartilhar via


Aviso C6201

O índice 'index-name' está fora do intervalo de índice válido 'mínimo' a 'máximo' para possivelmente o buffer alocado na 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 potencialmente 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 ele define i como 14, que é um elemento após o fim:

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 nos 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 arrays alocados em pilha. Ele não considera, por exemplo, matrizes passadas para a função com um comprimento anotado da linguagem de anotação de código-fonte (SAL) da Microsoft.

Essa análise não consegue captar todos os índices possíveis fora dos limites porque nem toda aritmética pode ser analisada com precisão. Ele é 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 está garantido em limites.