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