Visual Studio 경고 C6386
VS IDE에서 C++ 코드 작성 중 C6386 경고 메시지가 출력되었다.
왜 그런지 살펴보기 위해 여러 코드들을 살펴보게 되었다.
static constexpr int MAX_STACK_DEPTH = 5;
typedef enum class ActivityType {
ACT_MAIN_MANU,
ACT_SELECT_MODEL,
ACT_SELECT_COLOR,
};
typedef struct {
int top;
int running;
ActivityType stack[MAX_STACK_DEPTH];
}AppContext;
ctx.running = 1;
ctx.stack[0] = ActivityType::ACT_MAIN_MANU;
void push(AppContext* ctx) {
if (ctx->top < MAX_STACK_DEPTH)
{
ctx->stack[++ctx->top] = act;
}
}
문제가 된 코드는 ctx->stack[++ctx->top] = act; 이 코드의 ctx->stack 배열이다.
경고 문구는 다음과 같다.
ctx->stack'에 쓰는 동안 버퍼 오버런이 발생했습니다.
stack[...] 배열 접근 시 인덱스 값이 존재하지 않는데, 접근하거나 범위에 벗어나 오류가 발생한 것이다.
if문 조건식을 살펴보도록 한다. ctx->stack[0~4] 사용 가능하다. 만약 ctx->top
값이 4인 경우 값이 먼저 5로 증감하고 ctx->stack
배열로 접근하려 할 것이다. 접근한 장소에는 예상되지 않는 결과를 초래할 것이다.
코드는 간단한데, 먼저 ctx->top = 0;
인덱스 값을 초기화부터 진행하고
if문 유효한 범위로 if (ctx->top < MAX_STACK_DEPTH -1)
조건식을 변경하여 범위가 충족한 경우 더 이상 경고 문구가 발생되지 않을 것이다.
...
ctx.top = 0;
void push(AppContext* ctx) {
if (ctx->top < MAX_STACK_DEPTH - 1)
{
ctx->stack[++ctx->top] = act;
}
}