Freigeben über


Warnung C6263

Verwenden von _alloca in einer Schleife; dies kann schnell überlaufstapeln

Hinweise

Diese Warnung gibt an, dass das Aufrufen _alloca in einer Schleife zum Zuordnen des Speichers zu Stapelüberlauf führen kann. _alloca weist Speicher aus dem Stapel zu, aber dieser Speicher wird nur freigegeben, wenn die aufrufende Funktion beendet wird. Für den Stapel gilt – auch im Benutzermodus – eine Beschränkung, und eine fehlgeschlagene Ausführung einer Stapelseite führt zu einem Überlauf des Stapels. Die _resetstkoflw-Funktion sorgt nach Stapelüberläufen für eine Wiederherstellung, sodass ein Programm fortgesetzt werden kann, statt mit einem schwerwiegenden Ausnahmefehler fehlzuschlagen. Wenn die _resetstkoflw Funktion nicht aufgerufen wird, gibt es nach der vorherigen Ausnahme keine Schutzseite. Wenn es das nächste Mal einen Stapelüberlauf gibt, gibt es überhaupt keine Ausnahmen, und der Prozess wird ohne Warnung beendet.

Sie sollten das Aufrufen von _alloca in einer Schleife vermeiden, wenn die Belegungsgröße oder die Anzahl der Iterationen unbekannt ist, da es zu einem Stapelüberlauf kommen kann. In diesen Fällen sollten Sie andere Optionen wie Heap-Speicher oder C++-Standardbibliotheksklassen in Betracht ziehen.

Codeanalysename: USINGALLOCAINLOOP

Beispiel

Der folgende Code generiert diese Warnung:

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

Im folgenden Code wird malloc() verwendet, um die Warnung zu korrigieren:

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

Siehe auch