다음을 통해 공유


경고 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);
     }
  }
}

참고 항목