경고 C6262
함수는 스택의 constant_1 바이트를 사용합니다. /analyze:stacksize constant_2 초과합니다. 일부 데이터를 힙으로 이동하는 것이 좋습니다.
설명
이 경고는 미리 설정된 임계값(constant_2)을 초과하는 스택 사용량이 함수에서 검색되었음을 나타냅니다. 이 경고의 기본 스택 프레임 크기는 사용자 모드의 경우 16KB, 커널 모드의 경우 1KB입니다. 사용자 모드에서도 스택이 제한되며 스택 페이지를 커밋하지 못하면 스택 오버플로 예외가 발생합니다. 커널 모드에는 12KB 스택 크기 제한이 있으므로 늘릴 수 없습니다. 커널 모드 코드에서 스택 사용을 적극적으로 제한합니다.
이 경고 뒤에 있는 문제를 해결하려면 일부 데이터를 힙 또는 다른 동적 메모리로 이동할 수 있습니다. 사용자 모드에서는 하나의 큰 스택 프레임이 문제가 되지 않을 수 있으며 이 경고가 표시되지 않을 수 있지만 스택 프레임이 크면 스택 오버플로의 위험이 높아질 수 있습니다. (함수가 스택을 많이 사용하거나 재귀적일 경우 큰 스택 프레임이 발생할 수 있습니다.) 스택 오버플로가 실제로 발생하는 경우 시스템 제한까지만 사용자 모드의 총 스택 크기를 늘릴 수 있습니다.
커널 모드 코드(예: 드라이버 프로젝트)의 경우 constant_2 값은 1KB로 설정됩니다. 잘 작성된 드라이버에는 이 값에 접근하는 함수가 거의 없어야 하며 제한을 하향 변경하는 것이 바람직할 수 있습니다. 스택 크기를 줄이기 위해 사용자 모드 코드에 사용되는 동일한 일반 기술을 커널 모드 코드에 적용할 수 있습니다.
코드 분석 이름: EXCESSIVESTACKUSAGE
스택 크기를 조정하여 경고를 표시하지 않습니다.
명령줄 옵션을 사용하여 /analyze:stacksize
constant_2 값을 변경할 수 있지만 이 옵션을 늘리면 오류가 보고되지 않을 수 있는 위험이 발생합니다.
명령줄에서 경고를 표시하지 않는 경우
/analyze:stacksize <new-size>
컴파일러 명령줄에 옵션을 추가합니다. constant_1보다 큰 값을<new-size>
사용합니다. 예를 들어 constant_1 27180인 경우 입력/analyze:stacksize 32768
할 수 있습니다.
IDE에서 경고를 표시하지 않는 경우
Visual Studio IDE의 솔루션 탐색기 창에서 프로젝트를 선택합니다.
메뉴 모음에서 프로젝트>속성을 선택합니다.
속성 페이지 대화 상자에서 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.
추가 옵션에서 constant_1보다 큰 위치를
<new-size>
추가/analyze:stacksize <new-size>
합니다. 예를 들어 constant_1 27180인 경우 입력/analyze:stacksize 32768
할 수 있습니다. 확인을 선택하여 변경 내용을 저장합니다.
예시
다음 코드는 스택에 16,382바이트가 필요하고 로컬 정수 변수 i
에는 기본 스택 크기 제한인 16KB를 초과하는 4바이트가 추가로 필요하기 때문에 char buffer
이 경고를 생성합니다.
// 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);
}
}
메모리 누수 및 free
예외와 같은 많은 문제를 사용하고 malloc
있습니다. 이러한 종류의 누수 및 예외 문제를 모두 방지하려면 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 포함 shared_ptr
, unique_ptr
및 vector
. 자세한 내용은 스마트 포인터 및 C++ 표준 라이브러리를 참조하세요.