C6262
경고 C6262: 함수에서 <constant> 바이트의 스택을 사용하는데 이 크기가 /analyze:stacksize<constant>을(를) 초과합니다.일부 데이터를 힙으로 이동하십시오.
이 경고는 함수 내에서 사전 설정된 임계값을 초과하는 스택 사용 (constant 2)이 발견되었음을 나타냅니다.이 경고의 기본 스택 프레임 크기는 16 KB 사용자 모드에서 커널 모드에 대 한 1KB입니다.사용자 모드인 경우에도 스택은 제한되며 스택 페이지 커밋에 실패하면 스택 오버플로 예외가 발생할 수 있습니다.커널 모드는 12 KB 스택 크기 한계를 늘릴 수 없습니다. 따라서 커널 모드 코드는 스택 사용을 제한 적극적으로 해야 합니다.
문제는이 경고를 해결 하려면 , 다른 동적 메모리 힙에 데이터 하거나 이동할 수 있습니다. 사용자 모드에서는 하나의 큰 스택 프레임에 문제가 되지 않을 수 있습니다-그리고 이 경고가 표시 될 수 있습니다-하지만 큰 스택 프레임이 스택 오버플로가 발생할 위험이 높아집니다. (함수가 스택을 많이 사용하거나 또는 재귀적일 경우, 큰 스택 프레임은 발생할 수 있습니다.) 실제로 스택 오버플로가 발생 하면 되지만 시스템도 까지만 사용자 모드로 총 스택 크기를 늘릴 수 있습니다. 시스템 제한까지만이 아니라, 실제로 스택 오버플로가 발생하면, 사용자 모드에서 총 스택 크기는 늘어날 수 도 있습니다. 사용할 수 있는 /analyze 명령줄 옵션에 대 한 값을 변경 하려면 <constant 2>, 오류가 보고 되지 않을 수도 있는 위험을 유발할 것 증가할 수 있습니다.
커널-모드 코드에 대한 -예를 들어, 드라이버 프로젝트- <constant 2> 의 값이 1 KB로 설정 됩니다.잘 작성 된 드라이버는 이 값에 접근하는 함수들은 거의 없으며, 제한 아래로 변경는 것이 좋습니다. 사용자 모드 코드에 대한 스택 크기를 줄이기 위해 사용 되는 일반적인 방법은 커널 모드 코드에 적용할 수 있습니다.
예제
다음 코드에서는 char buffer 가 16382바이트를 할당하고 지역 정수 변수 i 가 4바이트를 더 할당하여 기본 스택 크기 제한인 16K바이트를 초과하기 때문에 이 경고가 생성됩니다.
// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
다음 코드에서는 일부 데이터를 힙으로 이동하여 이 경고를 해결합니다.
// cl.exe /c /analyze /EHsc /W4
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char *buffer;
i = 0;
buffer = (char *) malloc( MAX_SIZE );
if (buffer != NULL)
{
buffer[0] = '\0';
// code...
free(buffer);
}
}
Malloc과 free의 사용은 메모리 누수 및 예외가 많은 함정이 있습니다.이러한 유형의 누수와 예외 문제를 방지하려면, c + + 표준 템플릿 라이브러리 (STL)에서 제공하는 메커니즘을 사용합니다.여기에는 shared_ptr, unique_ptr, 및 vector가 포함됩니다.자세한 내용은 스마트 포인터(최신 C++) 및 C++ 표준 라이브러리 참조를 참조하십시오.
스택 크기를 조정하여 이 경고를 해결하려면 다음 단계를 따릅니다.
메뉴 모음에서 프로젝트 메뉴에서 속성을 선택합니다.
속성 페이지 대화 상자가 표시됩니다.
구성 속성을 확장합니다.
여기서 **C/C++**을 확장합니다.
여기서 명령줄 속성을 선택합니다.
추가 옵션에서 /analyze:stacksize16388을 추가합니다.