Cette page vous a-t-elle été utile ?
Votre avis sur ce contenu est important. N'hésitez pas à nous faire part de vos commentaires.
Vous avez d'autres commentaires ?
1500 caractères restants
Exporter (0) Imprimer
Développer tout
Important Il est possible que le présent document ne corresponde pas aux pratiques recommandées pour le développement actuel. Par ailleurs, il se peut que des liens de téléchargement et d'autres ressources ne soient plus valides. La version recommandée actuelle est disponible ici.

C6263

Mise à jour : novembre 2007

C6263

Avertissement C6263 : Utilisation de _alloca dans une boucle ; cette opération peut rapidement provoquer un débordement de la pile

Cet avertissement indique que l'appel à _alloca dans une boucle pour allouer de la mémoire peut provoquer un dépassement de capacité de la pile. _alloca alloue de la mémoire à partir de la pile, mais cette mémoire est libérée uniquement à la sortie de la fonction d'appel. 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. La fonction _resetstkoflw est récupérée à partir d'une condition de dépassement de capacité de la pile, en autorisant un programme à continuer au lieu d'échouer en provoquant une erreur d'exception irrécupérable. Si la fonction _resetstkoflw n'est pas appelée, aucune page de garde n'est créée après la précédente exception. Lors du prochain dépassement de capacité de la pile, aucune exception n'est levée et le processus s'achève sans avertissement.

Vous devez éviter d'appeler _allocadans une boucle si la taille d'allocation ou le nombre d'itérations est inconnu car il peut provoquer un dépassement de capacité de la pile. Dans ces cas, utilisez d'autres options, par exemple la mémoire de tas ou les classes Standard C++ Library Reference.

Le code suivant génère cet avertissement :

#include <windows.h>
#include <malloc.h>
#include <excpt.h>
#include <stdio.h>

#define MAX_SIZE 50

void f ( int size )
{
  char* cArray;
  __try
  {
    for(int i = 0; i < MAX_SIZE; i++)
    {
      cArray = (char *)_alloca(size);

     // process cArray...
    }
  }
  __except(GetExceptionCode() == STATUS_STACK_OVERFLOW ? 
              EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH )
  {
     // code...
     puts("Allocation Failed");
    _resetstkoflw();
  }
}

Le code suivant utilise malloc() pour corriger cet avertissement :

#include <windows.h>
#define MAX_SIZE 50

void f ( int size )
{
  char* cArray;

  for(int i = 0; i < MAX_SIZE; i++)
  {
     cArray = (char *) malloc(size);
     if (cArray != NULL)
     {
       // process cArray...
       free(cArray);
     }
  }
}

Ajouts de la communauté

AJOUTER
Afficher:
© 2015 Microsoft