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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per