Ostrzeżenie C6200
Indeks "index" jest poza prawidłowym zakresem indeksu "min" do "max" dla buforu nonstack "nazwa-parametru"
To ostrzeżenie wskazuje, że przesunięcie liczby całkowitej do określonej tablicy nonstack przekracza maksymalne granice tej tablicy, powodując niezdefiniowane zachowanie i potencjalnie ulega awarii.
Uwagi
Jedną z typowych przyczyn tej wady jest użycie rozmiaru tablicy jako indeksu do tablicy. Ponieważ indeksowanie tablic w języku C/C++ jest oparte na zera, maksymalny indeks prawny tablicy jest mniejszy niż liczba elementów tablicy.
Nazwa analizy kodu: INDEX_EXCEEDS_MAX_NONSTACK
Przykład
Poniższy kod generuje to ostrzeżenie. Ten problem wynika z for
pętli przekraczającej zakres indeksu, próbując uzyskać dostęp do indeksu 14 (15 elementu), gdy indeks 13 (14 element) jest ostatnim:
void f()
{
int* buff = new int[14]; // array of 0..13 elements
for (int i = 0; i <= 14; i++) // i exceeds the index
{
buff[i] = 0; // warning C6200
}
delete[] buff;
}
Aby poprawić oba ostrzeżenia, użyj poprawnego rozmiaru tablicy, jak pokazano w poniższym kodzie:
void f()
{
int* buff = new int[14]; // array of 0..13 elements
for (int i = 0; i < 14; i++) // i == 13 on the final iteration
{
buff[i] = 0; // initialize buffer
}
delete[] buff;
}
Algorytmy heurystyczne
Analiza kodu nie zawsze może udowodnić, czy indeks tablicy jest w zakresie. Może się to zdarzyć na przykład wtedy, gdy indeks jest obliczany na podstawie złożonego wyrażenia, w tym tych wyrażeń wywołujących inne funkcje. W takich przypadkach analiza kodu może wrócić do innych wskazówek, aby określić zakres, do których może należeć wyrażenie indeksu tablicy.
Rozważmy na przykład następującą funkcję, która używa rand()
w obliczeniach indeksu jako stand-in dla wywołania funkcji, którego analiza kodu nie może przeanalizować:
#include <stdlib.h>
void f()
{
int* buff = new int[14];
for (int i = 1; i < 14; i++)
{
buff[rand()] = 0; // no warning, nothing is known about the return value of rand()
buff[rand() % 15] = 0; // warning C6200, rand() % 15 is known to be in the range 0..14 and index 14 is out of bounds
buff[rand() % 14] = 0; // no warning, rand() % 14 is known to be in the range 0..13
}
delete[] buff;
}
Analiza kodu nie ostrzega tylko o rand()
tym, że nie ma żadnych informacji o wartości zwracanej. Z drugiej strony rand() % 15
i rand() % 14
podaj wskazówki dotyczące zakresu zwracanej rand()
wartości i analizy kodu mogą użyć tych informacji, aby określić, że indeks jest poza granicami w pierwszym przypadku, ale nie drugi.