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