Partager via


C6262

avertissement C6262 : La fonction utilise des octets de pile <constants> : exceeds/analyze:stacksize<constant 2>.Si possible, déplacez certaines données vers le tas

Cet avertissement indique qu'un dépassement de l'utilisation de la pile par rapport à un seuil prédéfini (constant 2) a été détecté dans une fonction.La taille du cadre de pile par défaut pour cet avertissement est 16 Ko pour le mode utilisateur, 1 Ko pour le mode noyau.La pile est limitée même en mode utilisateur, et l'échec de la validation d'une page de pile génère une exception de dépassement de capacité de la pile.Le mode noyau a une limite de taille de la pile de 12 Ko, qui ne peut pas être augmentée ; par conséquent, le code en mode noyau doit fortement limiter l'utilisation de la pile.

Pour résoudre le problème sous-jacent à cet avertissement, vous pouvez déplacer certaines données vers le tas ou une autre mémoire dynamique. En mode utilisateur, un grand cadre de pile peut ne pas être un problème- et cet avertissement peut être supprimé- mais un cadre de pile de grande taille augmente le risque d'un dépassement de capacité de la pile. (Un grand cadre de pile peut se produire si la fonction utilise fortement la pile 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 en fait, mais uniquement jusqu'à la limite du système. Vous pouvez utiliser l'option de ligne de commande /analyze pour modifier la valeur de <constant 2>, mais l'augmenter présente un risque qu'une erreur ne soit pas rapportée.

Pour le code de mode noyau, par exemple dans des projets de conducteur, la valeur de <constant 2> est à 1 Ko.Les gestionnaires bien rédigés doivent avoir très peu de fonctions qui approchent cette valeur, et modifier la limite vers le bas peut être souhaitable. Les mêmes techniques générales qui sont utilisées pour le code en mode utilisateur pour réduire la taille de la pile peuvent être adaptées au code en mode noyau.

Exemple

Le code suivant génère cet avertissement car char buffer alloue 16 382 octets, et la variable locale de type entier i alloue 4 octets supplémentaires, qui dépassent au total la limite de taille de la 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 de malloc et free présente de nombreux pièges en terme de fuites de mémoire et d'exceptions.Pour éviter complètement ce genre de problème de fuites et d'exception, utilisez les mécanismes fournis par la bibliothèque de modèles standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vector.Pour plus d’informations, consultez Pointeurs intelligents (Modern C++) et Référence de bibliothèque standard C++.

Pour corriger cet avertissement en modifiant la taille de la pile

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

    La boîte de dialogue Pages de propriétés s'affiche.

  2. Développez Propriétés de Configuration.

  3. Développez C/C++.

  4. Sélectionnez les propriétés de Ligne de Commande.

  5. Dans Options supplémentaires, ajoutez /analyze:stacksize16388.

Voir aussi

Tâches

Comment : utiliser les contrôles natifs à l'exécution

Référence

/STACK (Allocations de la pile)

_resetstkoflw