Udostępnij za pośrednictwem


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.