Condividi tramite


C6263

avviso C6263: utilizzo di _alloca in un ciclo: in questo modo può verificarsi il rapido overflow dello stack

L'avviso indica che la chiamata di _alloca all'interno di un ciclo per allocare la memoria può determinare un overflow dello stack._alloca alloca la memoria dallo stack, ma tale memoria viene liberata solo quando si esce dalla funzione chiamante.Lo stack, anche in modalità utente, è limitato e la mancata riuscita del commit di una pagina provoca un'eccezione di overflow dello stack.La funzione _resetstkoflw consente di recuperare dalla condizione di overflow dello stack, permettendo a un programma di continuare invece a restituire un errore di eccezione irreversibile.Se la funzione _resetstkoflw non viene chiamata, dopo l'eccezione precedente non è presente alcun guard page.Al successivo overflow dello stack non ci sarà alcuna eccezione e il processo terminerà senza alcun avviso.

Evitare di chiamare _alloca all'interno di un ciclo se la dimensione dell'allocazione o il conteggio delle iterazioni non è noto, in quanto ciò potrebbe provocare un overflow dello stack.In questi casi considerare altre opzioni, quali la memoria heap o le classi Riferimento della libreria C++ standard.

Esempio

Il codice seguente genera questo avviso:

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

Per risolvere il problema nel codice seguente viene utilizzato malloc():

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

Vedere anche

Riferimenti

malloc

_alloca

_malloca

Altre risorse

Riferimento della libreria C++ standard