Udostępnij za pośrednictwem


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

Zobacz też

Informacje

funkcja malloc

_alloca

_malloca

Inne zasoby

Biblioteka języka C++ wzorcowego