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 Standard C++ Library Reference.

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

Standard C++ Library Reference