Condividi tramite


Avviso C6263

Uso di _alloca in un ciclo; questo può aumentare rapidamente lo stack di overflow

Osservazioni:

Questo avviso indica che la chiamata _alloca all'interno di un ciclo per allocare memoria può causare un overflow dello stack. _alloca alloca memoria dallo stack, ma tale memoria viene liberata solo quando la funzione chiamante viene chiusa. Lo stack, anche in modalità utente, è limitato e il commit di una pagina dello stack causa un'eccezione di overflow dello stack. La funzione _resetstkoflw esegue il ripristino da una condizione di overflow dello stack, consentendo di continuare l'esecuzione di un programma anziché interromperlo con un errore di eccezione irreversibile. Se la _resetstkoflw funzione non viene chiamata, non esiste alcuna pagina di protezione dopo l'eccezione precedente. La volta successiva che è presente un overflow dello stack, non sono presenti eccezioni e il processo termina senza avviso.

È consigliabile evitare di chiamare _alloca all'interno di un ciclo se le dimensioni di allocazione o il numero di iterazioni è sconosciuto perché potrebbe causare l'overflow dello stack. In questi casi, prendere in considerazione altre opzioni, ad esempio la memoria heap o le classi della libreria standard C++.

Nome dell'analisi del codice: USINGALLOCAINLOOP

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

Il codice seguente usa malloc( ) per correggere l'avviso:

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

Vedi anche