Avertissement C6263

Utilisation de _alloca dans une boucle ; cela peut rapidement dépasser la pile

Notes

Cet avertissement indique que l’appel _alloca à l’intérieur d’une boucle pour allouer de la mémoire peut entraîner un dépassement de capacité de pile. _alloca alloue de la mémoire de la pile, mais cette mémoire est libérée uniquement lorsque la fonction appelante se ferme. 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 capacité de pile. La fonction _resetstkoflw récupère d’une condition de dépassement de capacité de la pile, ce qui permet à un programme de poursuivre son exécution au lieu d’échouer avec une erreur d’exception fatale. Si la _resetstkoflw fonction n’est pas appelée, il n’existe aucune page de garde après l’exception précédente. La prochaine fois qu’il y a un dépassement de capacité de pile, il n’y a aucune exception du tout et le processus se termine sans avertissement.

Vous devez éviter d’appeler _alloca à l’intérieur d’une boucle si la taille d’allocation ou le nombre d’itérations est inconnu, car cela peut entraîner un dépassement de capacité de pile. Dans ces cas, envisagez d’autres options telles que la mémoire du tas ou les classes de bibliothèque standard C++.

Nom de l’analyse du code : USINGALLOCAINLOOP

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