경고 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 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기