반응형

남이 짜놓은 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 함수로 바꿔 써줘야 한다.


+ Recent posts