C6263
ostrzeżenie C6263: użycie _alloca w pętli; może to szybko spowodować przepełnienie stosu
To ostrzeżenie wskazuje, że wywołanie _alloca wewnątrz pętli aby przydzielić pamięć może spowodować przepełnienie stosu._alloca przydziela pamięć ze stosu, ale pamięć jest zwalniana tylko wtedy, kiedy funkcja wywołująca istnieje.Stos, nawet w trybie użytkownika jest ograniczony i błąd zatwierdzenia strony stosu spowoduje wyjątek przepełnienia stosu.Funkcja _resetstkoflw powraca ze stanu przepełnienia stosu, pozwalając programowi na kontynuowanie zamiast zakończenia pracy zwracając błąd wyjątku krytycznego.Jeśli funkcja _resetstkoflw nie jest wywoływana, nie ma żadnej strony zabezpieczenia po poprzednim wyjątku.Przy następnym przepełnieniu stosu nie wystąpią żadne wyjątki a proces zakończy się bez ostrzeżenia.
Należy unikać wywoływania _alloca wewnątrz pętli, jeśli rozmiar alokacji lub liczba iteracji są nieznane, ponieważ może to spowodować przepełnienie stosu.W tych przypadkach należy rozważyć inne opcje, takie jak pamięć sterty lub klasy Biblioteka języka C++ wzorcowego.
Przykład
Poniższy kod generuje to ostrzeżenie:
#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();
}
}
W poniższym kodzie użyto funkcji malloc( ) do naprawy tego ostrzeżenia:
#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);
}
}
}