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.