Avertissement C6200

L’index 'index' est hors de la plage d’index valide 'min' à 'max' pour la mémoire tampon nonstack 'parameter-name'

Cet avertissement indique qu’un décalage entier dans le tableau nonstack spécifié dépasse les limites maximales de ce tableau, provoquant un comportement non défini et potentiellement des plantages.

Notes

Une cause courante de ce défaut consiste à utiliser la taille d’un tableau comme index dans le tableau. Étant donné que l’indexation de tableau C/C++ est basée sur zéro, l’index légal maximal dans un tableau est un inférieur au nombre d’éléments de tableau.

Nom de l’analyse du code : INDEX_EXCEEDS_MAX_NONSTACK

Exemple

Le code suivant génère cet avertissement. Ce problème provient de la boucle dépassant la for plage d’index, en tentant d’accéder à l’index 14 (le 15e élément) lorsque l’index 13 (le 14e élément) est le dernier :

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

Pour corriger les deux avertissements, utilisez la taille correcte du tableau, comme indiqué dans le code suivant :

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

Heuristique

L’analyse du code ne peut pas toujours prouver si un index de tableau est dans la plage. Cela peut se produire, par exemple, lorsque l’index est calculé à partir d’une expression complexe, y compris les expressions qui appellent d’autres fonctions. Dans ces cas, l’analyse du code peut retomber sur d’autres indices pour déterminer la plage dans laquelle une expression d’index de tableau peut tomber.

Par exemple, considérez la fonction suivante qui utilise rand() dans les calculs d’index en tant que stand-in pour un appel de fonction que l’analyse du code ne peut pas analyser :

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

L’analyse du code n’avertit pas simplement rand() parce qu’elle n’a pas d’informations sur sa valeur de retour. D’autre part, rand() % 15 et rand() % 14 fournissez des indications sur la plage de la valeur de retour et l’analyse du rand() code peuvent utiliser ces informations pour déterminer que l’index est hors limites dans le premier cas, mais pas le deuxième.