Freigeben über


Warnung C6200

Index 'index' liegt außerhalb des gültigen Indexbereichs 'min' bis 'max' für nichtstackpuffer 'Parametername'

Diese Warnung gibt an, dass ein ganzzahliger Offset in das angegebene Nichtstackarray die maximalen Grenzen dieses Arrays überschreitet, was zu nicht definierten Verhaltensweisen und potenziell Abstürzen führt.

Hinweise

Eine häufige Ursache für diesen Fehler ist die Verwendung der Größe eines Arrays als Index in das Array. Da die C/C++-Arrayindizierung nullbasiert ist, ist der maximal zulässige Index in einem Array eins kleiner als die Anzahl der Arrayelemente.

Codeanalysename: INDEX_EXCEEDS_MAX_NONSTACK

Beispiel

Der folgende Code generiert diese Warnung. Dieses Problem stammt aus der for Schleife, die den Indexbereich überschreitet und versucht, auf Index 14 (das 15. Element) zuzugreifen, wenn Index 13 (das 14. Element) die letzte ist:

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

Um beide Warnungen zu korrigieren, verwenden Sie die richtige Arraygröße, wie im folgenden Code gezeigt:

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

Heuristik

Die Codeanalyse kann nicht immer nachweisen, ob sich ein Arrayindex im Bereich befindet. Dies kann beispielsweise passieren, wenn der Index aus einem komplexen Ausdruck berechnet wird, einschließlich der Ausdrücke, die andere Funktionen aufrufen. In diesen Fällen kann die Codeanalyse auf andere Hinweise zurückgreifen, um den Bereich zu bestimmen, in den ein Arrayindexausdruck fallen kann.

Betrachten Sie beispielsweise die folgende Funktion, die in Indexberechnungen als Stand-In für einen Funktionsaufruf verwendet rand() wird, den die Codeanalyse nicht analysieren kann:

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

Die Codeanalyse warnt nicht nur rand() , weil sie keine Informationen zu ihrem Rückgabewert enthält. Auf der anderen Seite rand() % 15 können und rand() % 14 Hinweise für den Bereich des Rückgabewerts rand() und der Codeanalyse diese Informationen verwenden, um zu bestimmen, dass der Index im ersten Fall außerhalb der Grenzen, aber nicht im zweiten Fall liegt.