Предупреждение C6263
Использование _alloca в цикле; Это может быстро переполнение стека
Замечания
Это предупреждение указывает, что вызов _alloca
внутри цикла выделения памяти может привести к переполнению стека. _alloca
выделяет память из стека, но эта память освобождается только при выходе вызывающей функции. Стек, даже в пользовательском режиме, ограничен, и ошибка фиксации страницы стека приводит к исключению переполнения стека. Функция _resetstkoflw
выполняет восстановление после переполнения стека, что позволяет программе продолжить работу вместо того, чтобы завершить работу с неустранимой ошибкой. _resetstkoflw
Если функция не вызывается, после предыдущего исключения нет страницы защиты. При следующем переполнении стека отсутствуют исключения и процесс завершается без предупреждения.
Следует избегать вызова _alloca
внутри цикла, если размер выделения или число итерации неизвестно, так как это может привести к переполнению стека. В этих случаях рассмотрите другие варианты, такие как память кучи или классы стандартной библиотеки C++.
Имя анализа кода: USINGALLOCAINLOOP
Пример
Следующий код создает это предупреждение:
#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();
}
}
Следующий код использует malloc( ) для исправления этого предупреждения:
#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);
}
}
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по