|
다른분이 테스트해보셨는데...vc 2005, 볼랜드 c++컴파일러 5.5.1에서는 이러한 현상이 없습니다. 한번 오류내고 빠진다는... c빌더에서 이런 현상이 난다면 델파이쪽도 비슷할거 같은데요. 어차피 씨빌더는 내부적으로 파스칼로 변환되어 처리되므로.. 같은 버그가 있을거 같습니다. -locke
locke 님이 쓰신 글 :
: 안녕하세요. 로크(locke)입니다.
:
: c빌더로 업무개발중 아래와 비슷한 코딩을 하게되었습니다. (c빌더 6입니다)
:
: 일단 아래를 봐주세요.
:
: while(true)
: {
: try
: {
: break;
: } catch(Exception &e)
: {
: ShowMessage("Error");
: } //catch
: } //while
: int *a = null;
: *a = 54; <-오류 나는 부분(이해를 쉽게하기위해 인위적으로 오류 발생)
:
: while루프안에 try-catch블럭이 있는데
: try블럭안에서 break로 루프를 탈출합니다.
: 루프밖에서 연산오류가 발생하면 루프안의 catch(exception handler)로 프로세스가 이동하여 "Error"라는 오류창을 띄워줍니다.
: 고로 이 프로그램은 오류창 확인해주면 또 오류나고 무한루프가 되어버립니다.
:
: 어떤 한 블럭안에서 오류가 나면 c++컴파일러는 그것을 처리할 수 있는 이벤트 핸들러를 찾아서 넘겨주고
: 그게 없으면 어플리케이션 오류를 발생시킬텐데
: 위의 예제를 보면..약간 좀 아이러니합니다.
: 제가 가만히 생각해보니 try문을 만날때 사용자의 이벤트 핸들러(=catch)를 스택상에 -이미 오류나면 분기할 부분을- 저장하고 있다가 루프안에서 break로 그 블럭을 빠져나올 때
: 오류시 분기부분을 스택에서 해제하지 않았고 그 이유로 블럭밖에서 오류가 났음에도 불구하고
: 해당 이벤트 핸들러로 정의된 catch문으로 분기를 하는것 같습니다.
: 이거 c++빌더 컴파일러의 버그일지? 아니면 c++랭귀지는 모두 다 이렇게 되는건지..
: 다른 분들은 어떻게 생각하시나요? 여지껏 코딩하면서 이런 경우는 처음 봅니다.
: -locke
|