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 _alloca dans une boucle si la taille d'allocation ou le nombre d'itérations sont inconnus car cela 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 Référence de la bibliothèque C++ standard.

Exemple

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

Voir aussi

Référence

malloc

_alloca

_malloca

Autres ressources

Référence de la bibliothèque C++ standard