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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für