남이 짜놓은 VS 6 프로젝트를 VS 2005 로 포팅중 다음과 같은 디버그 에러를 발견...

사용자 삽입 이미지

실제로 close.c 함수를 찾아서 따라가 보면 close.c 함수의 47 번째 라인은 아래와 같다.



즉, file 등을 사용한 후에 닫을 때 fd = close() 처럼 리턴 결과를 fd 로 넘기는데, open 에 실패하여 fd 값이 음수인 경우 정상적으로 close 를 시킬 수 없으므로 위와 같이 Assertion Failed 를 내게 되어 있다.

예를 들어서 아래와 같은 코드에서 assertion failed 가 발생할 수 있다.



위의 경우 파일 열기에 실패하여 fd 값이 음수로 오는 경우 6 라인에서 open 도 안했는데 close() 를  호출한 것이 되어 close 함수가 정의되어 있는 close.c 함수에서 Assertion Failed 가 된다. 이런 경우, open 에 성공했을 때만 close 해줘야 하므로 close 함수는 4 라인에 위치해야 한다.

결국, Call Stack 을 열심히 뒤져본 끝에 위와 같이 close() 함수를 잘못 호출하고 있는 부분을 찾은 끝에 디버깅에 성공했다.

재미있는 것은 위와 같은 코드가 VS 6.0 에서는 정상적으로 빌드가 되고 실행이 된다는 것.

이와 같은 잠재적인 버그도 검출하지 못하는 VS 6.0 은 역시 하루빨리 버려야 한다 -0-

참고로 소켓 통신등을 구현할때에도 VS 6.0 에서 문제없이 쓰던 close( sock ) 함수는 closesocket( sock ) 와 같이 closesocket 함수로 바꿔 써줘야 한다.


크리에이티브 커먼즈 라이선스
Creative Commons License
http://soyoja.com/trackback/305 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon hyperdash 2009/03/30 00:22  댓글주소  수정/삭제  댓글쓰기

    VC 6.0 문제가 많구먼????

    어서 빨리 6.0 버려~~~~ 영세한 SI 업체가 아니고서는 6.0 쓰는곳이 없을텐데...

    • BlogIcon soyoja 2009/04/05 21:23  댓글주소  수정/삭제

      인터넷에 돌아다니는 소스들을 찾아보거나 주위를 둘러보면...
      아직도 은근히 6.0 으로 개발하는 사람들이 많더라고...

이름 암호 홈페이지