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