switch문의 이상현상 가능성?
글쓴이: puaxx / 작성시간: 금, 2007/11/23 - 11:08오전
아무리 소스코드를 봐도 문제는 없고(소스코드를 마르고 닳도록 본것 같군요.), 발생할 가능성은 switch문에서 엉뚱한 곳으로 진입한다는 것밖에 생각할수 없는 상황이다 보니....아무튼 원인이 안보이다 보니 별의별 생각을 다하게 되는군요.
컴파일러는 borland c++ 3.1 이구요.OS는 DOS입니다.
switch(input_code){
case 1:
case 2:
case 3:
case 77:
}
특이사항은 case 1,2,3까지는 break문이 없습니다. 그리고 default문도 없구요. 요지는 input_code가 77이나 3일때 case 2번이나 case 1번으로 진입할 가능성이 있느냐는 것인데요. 만약에 그렇다면 모든 문제가 이것하나로 설명이되는 상태인데....
논리적으로나 물리적으로나 아무리 따져봐도 저런일이 발생할 가능성은 거의 0에 가깝다는것이 저를 괴롭게 만든다는 것입니다.
의견좀 부탁드리겠습니다.
Forums:
c++은 그렇지만
기계어로 번역이 되면 저 순서가 반드시 보장이 되는지 잘 모르겠군요... 어떠한 이유로 case 1:과 case 77:의 순서가 바뀌어서 번역이 된다면(컴파일러의 입장에서는 그렇게 해도 의미상에는 변화가 없고 성능상 더 좋다고 판단 될 경우) 그런 경우가 생길지도 모르지요.
break가 없는 것은
break가 없는 것은 의도적으로 그렇게 쓸 수는 있지만 별로 좋은 스타일은 아닙니다.
또한 주석등으로 break를 의도적으로 뺐다고 알려주는 것이 좋구요.
switch의 동작이 이상한것같다면, 동등한 nested if로 바꿔서 테스트해보시는 것이 좋겠네요.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
여테까지 봐도
여테까지 봐도 그런경우는 없습니다..
예시가 좀더 명확했으면 더 정확한답이 나왔을텐데말이죠..
역어셈블해서 봐야지 명확할 것 같네요.
예시가 정확하지 않아서 확실하진 않네요.
그런 경우를 당한 적은 없습니다만...
디버깅정보 집어넣고 컴파일한 후 역어셈블해서 해당 switch문을 보면 정확하게 알 수 있을 것 같네요.
"77이나 3일때 case
"77이나 3일때 case 2번이나 case 1번으로 진입할 가능성이 있느냐"
위 코드에서 절대로 그럴 수 없습니다. 만일 그렇게 실행한다면 그 컴파일러는 엉터리 컴파일러입니다. 제가 아는한 bc31 이 그런 컴파일러는 아닙니다.
도스 환경이라면 segfault 에 둔감하기 때문에, switch 문 실행 전에 어떤 이유에서든 발생한 오류가 실행에 영향을 미쳤을 겁니다.
Orion Project : http://orionids.org
디버거로 추적해보셨겠죠?
재현이 어느정도 되는 경우라면 디버거로 추적해보심이;;;
디버거로 추적해보셨겠죠?
재현이 어느정도 되는 경우라면 디버거로 추적해보심이;;;
엥? 왜 2개가 올라왔지? 이런 이런 게시판 버그;;;
댓글 달기