2004년 12월 2일 목요일

Syntax check - 방어적인 프로그래밍

오늘은 갑자기 잘돌던 html parser가 메모리를 2기가나 쓰더니 Memory 부족으로 미쳐버렸다.
메모리와 하드를 포함한 서버의 모든 공간을 침식해 나가려고 했다.
겨우 kill -9로 멈췄는 데, 2기가짜리 core file을 떨구느라 20~30분 더 걸렸다.


new, delete도 거의 안 쓰고 STL만 쓰고 있는 데도 memory leak이 발생한게
이상해서 좀 뒤져보니, 역시나 무한 루프를 돌고 있었다.


무한 루프를 도는 원인을 보니 parser가 parsing하면서 pointer를 증가시켜 가면서
앞으로 나가지 않고 제자리에서 뱅글뱅글 멈춰있었다.
그래서 종료조건인 EOF가 나오지 않았다.


내가 만든건 아니고 senior가 만든건데,
결론은 관리자의 parsing rule을 입력 받을 때 syntax check를 하지 않았기 때문이다.
관리자가 잘못된 문법을 입력해서 parser가 미쳐버렸던 것이다.


처음에는 parsing logic에 문제가 있는 줄 알고 이리저리 fprintf를 집어넣어가며 파보았는 데,
parser는 역시 코드가 너무 복잡하다.
흐름을 따라 갈 수가 없었다.


혹시나 해서 중간 중간 변수 값을 몇 개 씩어보니,
역시나 문법에 맞지 않는 입력이 들어온 것이었다.
그래서 syntax check 코드를 집어 넣어서 잘못된 관리자 입력시에는 syntax error를 내고 종료하기로 했다.


개발자는 코딩할 때, 사용자의 입력을 믿어서는 안된다.
언제나 방어적인 프로그래밍이 필요하다.

댓글 없음:

댓글 쓰기