Avertissement C6262

La fonction utilise constant_1 octets de pile : dépasse /analyze :stacksize constant_2. Envisagez de déplacer des données vers le tas

Notes

Cet avertissement indique que l’utilisation de la pile qui dépasse un seuil prédéfini (constant_2) a été détectée dans une fonction. La taille d’image de pile par défaut pour cet avertissement est de 16 Ko pour le mode utilisateur, 1 Ko pour le mode noyau. La pile, même en mode utilisateur, est limitée et l’échec de validation d’une page de pile provoque une exception de dépassement de pile. Le mode noyau a une limite de taille de pile de 12 Ko, ce qui ne peut pas être augmenté. Essayez de limiter agressivement l’utilisation de la pile dans le code en mode noyau.

Pour corriger le problème derrière cet avertissement, vous pouvez déplacer des données vers le tas ou vers une autre mémoire dynamique. En mode utilisateur, une trame de pile volumineuse peut ne pas être un problème, et cet avertissement peut être supprimé, mais un cadre de pile volumineux augmente le risque de dépassement de capacité de la pile. (Une trame de pile volumineuse peut se produire si la fonction utilise la pile fortement ou est récursive.) La taille totale de la pile en mode utilisateur peut être augmentée si le dépassement de capacité de la pile se produit réellement, mais uniquement jusqu’à la limite système.

Pour le code en mode noyau, par exemple, dans les projets de pilotes, la valeur de constant_2 est définie sur 1 Ko. Les pilotes bien écrits doivent avoir peu de fonctions qui approchent de cette valeur, et la modification de la limite vers le bas peut être souhaitable. Les mêmes techniques générales utilisées pour le code en mode utilisateur afin de réduire la taille de la pile peuvent être adaptées au code en mode noyau.

Nom de l’analyse du code : EXCESSIVESTACKUSAGE

Ajuster la taille de la pile pour supprimer l’avertissement

Vous pouvez utiliser l’option /analyze:stacksize de ligne de commande pour modifier la valeur de constant_2, mais augmenter le risque qu’une erreur ne soit pas signalée.

Pour supprimer l’avertissement sur la ligne de commande

  • Ajoutez l’option /analyze:stacksize <new-size> à la ligne de commande du compilateur. Utilisez une valeur supérieure <new-size>à constant_1. Par exemple, si constant_1 est 27180, vous pouvez entrer /analyze:stacksize 32768.

Pour supprimer l’avertissement dans l’IDE

  1. Dans l’IDE Visual Studio, sélectionnez le projet dans la fenêtre Explorateur de solutions.

  2. Dans la barre de menus, choisissez Projet>Propriétés.

  3. Dans la boîte de dialogue Pages de propriétés, sélectionnez la page de propriétés de la> ligne de commande C/C++>Configuration.

  4. Dans Les options supplémentaires, ajoutez /analyze:stacksize <new-size>, où <new-size> est supérieure à constant_1. Par exemple, si constant_1 est 27180, vous pouvez entrer /analyze:stacksize 32768. Sélectionnez OK pour enregistrer vos modifications.

Exemple

Le code suivant génère cet avertissement, car char buffer nécessite 16 382 octets sur la pile, et la variable i entière locale nécessite un autre 4 octets, qui dépassent ensemble la limite de taille de pile par défaut de 16 Ko.

// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382

void f( )
{
    int i;
    char buffer[MAX_SIZE];

    i = 0;
    buffer[0]='\0';

    // code...
}

Le code suivant corrige cet avertissement en déplaçant certaines données vers le tas.

// cl.exe /c /analyze /EHsc /W4
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 16382

void f( )
{
    int i;
    char *buffer;

    i = 0;
    buffer = (char *) malloc( MAX_SIZE );
    if (buffer != NULL)
    {
        buffer[0] = '\0';
        // code...
        free(buffer);
    }
}

L’utilisation et mallocfree présente de nombreux pièges, tels que les fuites de mémoire et les exceptions. Pour éviter tous ces types de fuites et de problèmes d’exception, utilisez les mécanismes fournis par la bibliothèque standard C++ (STL). Il s’agit notamment de shared_ptr , unique_ptr et vector . Pour plus d’informations, consultez Smart Pointers and C++ Standard Library.

Voir aussi

/STACK (Allocations de pile)
_resetstkoflw
Guide pratique pour utiliser les vérifications natives à l’exécution