Share via


C6263

경고 C6263: 루프에서 _alloca를 사용하고 있습니다. 이 경우 빠른 시간 내에 스택 오버플로가 발생할 수 있습니다.

이 경고는 루프 내에서 _alloca를 호출하여 메모리를 할당하면 스택 오버플로가 발생할 수 있음을 나타냅니다. _alloca는 스택으로부터 메모리를 할당하지만 해당 메모리는 호출하는 함수가 종료될 때만 해제됩니다. 사용자 모드인 경우에도 스택은 제한되며 스택 페이지 커밋에 실패하면 스택 오버플로 예외가 발생할 수 있습니다. _resetstkoflw 함수는 스택 오버플로 상태를 복구하여 프로그램이 치명적 예외 오류와 함께 실패하는 대신 계속 실행되도록 합니다. _resetstkoflw 함수를 호출하지 않으면 앞의 예외 다음에는 가드 페이지가 없게 됩니다. 다음에 스택 오버플로가 발생하면 예외가 전혀 발생하지 않고 프로세스가 경고 없이 종료됩니다.

스택 오버플로가 발생할 수 있기 때문에 할당 크기 또는 반복 횟수를 알 수 없는 경우에는 루프 내에서 _alloca를 호출하지 않아야 합니다. 이러한 경우에는 힙 메모리 또는 Standard C++ Library Reference 클래스와 같은 다른 방법을 사용해 보십시오.

예제

다음 코드에서는 이 경고를 발생시킵니다.

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

참고 항목

참조

malloc

_alloca

_malloca

기타 리소스

Standard C++ Library Reference