3년 묵은 버그…

@codemaru · January 08, 2010 · 3 min read

때로는 전혀 엉뚱한 곳에서 엄청나게 황당한 일들을 마주하곤 한다. 첫 눈에 반한 것처럼 접근한 여성이, ‘도를 아십니까’라는 사실을 알게 되었을 때와 같은 느낌이랄까? 어쨌든 오늘이 바로 그런 날이었다. 회사 프로그램에 기능 추가를 하고 있는데, 뭔가 의도하지 않은 대로 동작하는 삘이 느껴졌다. 예감대로 무한 루프를 돌고 있었다. 디버깅을 하다가 결국 원인이 되는 라인을 찾았는데 단일 연결 리스트 코드가 문제였다. 바로 다음 라인이다.

for(prev=LstBegin(l); prev->next!=item; prev=prev->next)

  break;

C언어를 어제 배운 학생도 이 줄은 완전 뻘짓 라인이라는 것을 알 것이다.

원래 내가 의도했던 라인은 다음과 같은 것이다.

for(prev=LstBegin(l); prev->next != item; prev=prev->next)

  ;

당연하게도 코드를 고치가 문제는 해결되었다. 하지만 찜찜한 기분은 어쩔 수 없었다. 속으로 아마 코드를 새로운 소스 트리로 옮기는 과정에서 오류가 발생했을 것이라 합리화를 시작한다. 주석이 담긴 줄을 추가 하려다 저런 거겠지, 라고 생각하고 싶었다. 하지만 break는 저 상황에 어울릴만한 문장도 아니다.

svn 트리를 뒤졌다. 결과는 3초도 되지 않아 밝혀졌다. 어처구니 없게도 2007년 4월 처음 코드를 쓰던 당시부터 그렇게 작성한 것으로 나왔다. 흐미~ 이건 머지? ㅋ~ 그 동안 문제가 없었던 것은 그 리스트 코드를 쓰는 곳이 단 한 곳이며, 그 단 한 곳 조차도 기능이 필요 없어서 사용하지 않았기 때문이었다. 3년 만에 처음 설계 당시 포함시켰던 바로 그 기능을 사용하게 된 것이다. 그러면서 케케묵은 버그가 같이 발견된 것이다.

TDD가 어깨 뒤에서 나를 비웃는 소리가 들린다. ^^;;

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중