코드를 작성하다 보면 에러가 나는 경우가 있습니다. 이 경우 실시간 디버깅을 하지 않고 run time상에서 실행이 어디까지 되었는지를 알 수 있도록 디버깅용 변수(tag) 하나를 선언해서 이용하는 경우도 있습니다.


int tag = 0;

void foo()
{
  int i, j, k;
  tag = 1;
  scanf_s("%d", &i);
  tag = 2;
  scanf_s("%d", &j);
  tag = 3;
  k = i / j; // 예외 발생 가능성이 존재
  tag = 4;
  printf("k=%d\n", k);
  tag = 5;
}


위 foo라는 함수는 2개의 숫자(i, j)을 입력받아서 나눈 값을 k에 넣고 화면에 출력하는 함수입니다. 여기에서 j의 값이 0이라면 예외가 발생하겠고, 이 경우 tag 변수에는 3의 값이 들어 갈 것입니다.




이상한 현상이 발생하여 테스트 코드를 작성해 보았습니다.


#include <stdio.h>

volatile int tag = 0;

class MyObj
{
public:
  virtual void foo()
  {
    int i, j, k;
    tag = 1;
    scanf_s("%d", &i);
    tag = 2;
    scanf_s("%d", &j);
    tag = 3;
    k = i / j;
    tag = 4;
    printf("k=%d\n", k);
    tag = 5;
  }
};

int main()
{
  __try
  {
    MyObj obj;
    obj.foo();
  } __except (1)
  {
  }
  printf("tag=%d\n", tag);
  return 0;
}




상기 코드를 빌드한 이후 i, j 값을 각각 8과 0을 입력하여 예외가 발생하도록 하였습니다. 그 결과 다음과 같은 결과가 나옵니다. 빌드 환경은 Microsoft Visual Studio 2012 32bit Release Compile - Optimization Maximize Speed (/O2) 입니다.


8 0
tag=2


Debug 모드에서는 정상적으로 "tag=3"으로 출력되는데 Release Mode에서는 tag의 값이 2로 나오더군요. 왜 이런 현상이 나타나는 걸까요?




소스 코드 및 실행 파일 첨부합니다. 

except_test.zip