Advertencia C6263

Uso de _alloca en un bucle; esto puede desbordar rápidamente la pila

Comentarios

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 del análisis de código: USINGALLOCAINLOOP

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

Consulte también