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