Sdílet prostřednictvím


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

Viz také

Referenční dokumentace

malloc

_alloca

_malloca

Další zdroje

Standardní knihovna C++ – referenční dokumentace