Предупреждение 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);
     }
  }
}

См. также