Advertencia C6263
Uso de _alloca en un bucle; esto puede desbordar rápidamente la pila
Esta advertencia indica que llamar dentro _alloca
de un bucle para asignar memoria puede provocar desbordamiento de pila. _alloca
asigna memoria de la pila, pero esa memoria solo se libera cuando se cierra la función que realiza la 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 _resetstkoflw
función, no hay 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 _alloca
dentro de un bucle si el tamaño de asignación o el número de iteraciones es desconocido, ya que podría producir un desbordamiento de pila. En estos casos, considere otras opciones, como la memoria del montón o las clases de biblioteca estándar de C++.
Nombre de análisis de código: USINGALLOCAINLOOP
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);
}
}
}