C6263
Actualización: noviembre 2007
C6263
Advertencia C6263: Se utilizará _alloca en un bucle: esto puede provocar un rápido desbordamiento de pila
Esta advertencia indica que llamar a _alloca dentro de un bucle para asignar memoria pueden producir un desbordamiento de pila. _alloca asigna memoria de la pila, pero esa memoria sólo se libera cuando sale la función de llamada. La pila está limitada incluso en modo de usuario y un error al confirmar una página de la pila provoca una excepción de desbordamiento de pila. La función _resetstkoflw se recupera de una condición del desbordamiento de pila, lo que permite que el continúe en lugar de generar un error de excepción grave. Si no se llama a la función _resetstkoflw, no queda ninguna página de protección después de la excepción anterior. La próxima vez que haya un desbordamiento de pila, no habrá ninguna excepción en absoluto y el proceso finalizará sin avisar.
Debe evitar llamar a _allocadentro de un bucle si el tamaño de asignación o el número de iteraciones es desconocido, porque podría producir un desbordamiento de pila. En estos casos, considere otras opciones como, por ejemplo, memoria de montón o las clases Standard C++ Library Reference.
Ejemplo
El código siguiente genera esta advertencia:
#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();
}
}
El código siguiente utiliza malloc() para corregir esta advertencia:
#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);
}
}
}