C6263
upozornění C6263: použití _alloca ve smyčce může rychle přeplnit zásobník
Toto upozornění signalizuje, že volání _alloca uvnitř smyčky k přidělení paměti může způsobit přetečení zásobníku. _alloca přidělí paměť ze zásobníku, ale tato paměť je uvolněna pouze při ukončení volání funkce.Zásobník je i v uživatelském režimu omezen a nezdaří-li se zapsat stránku zásobníku, dojde k výjimce přetečení zásobníku.Funkce _resetstkoflw obnoví ze stavu přetečení zásobníku, čímž povolí programu pokračovat místo selhání se závažnou chybou výjimky programu.Pokud funkce _resetstkoflw není volána, nejsou žádné ochranné stránky po předchozí výjimce.Při dalším přetečení zásobníku nebudou vůbec žádné výjimky a proces skončí bez varování.
Měli byste se vyhnout volání _alloca uvnitř smyčky, pokud je velikost přidělení nebo počet iterací neznámý, protože to může způsobit přetečení zásobníku.V těchto případech zvažte další možnosti, například paměť haldy nebo třídy Standardní knihovna C++ – referenční dokumentace.
Příklad
Následující kód generuje toto upozornění:
#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();
}
}
Následující kód používá malloc( ) k opravě tohoto upozornění:
#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);
}
}
}