본문 바로가기

~2006.07.30/外(바깥 외) - Code

연습문제 31.

다음 C 코드 조각에서 몇가지 우연을 발견할 수 있는가?
이 코드가 어떤 라이브러리의 루틴 깊숙한 곳에 들어있다고 가정하고
생각해 보라


fprintf(stderr, "Error, continue?");
gets(buf);


이코드에는 잠재적인 문제점이 몇가지 있다.
뭔저 이 코드는 tty 환경을 가정한다. 이 가정이 참이라면 문제
없겠지만, 이 코드가 stderr도 stdin도 열려있지 않은 GUI 환경에서
호출된다면 어떻게 되겠는가?


둘째 이 코드에는 문제가 많은 gets가 쓰였다. gets는 사용자가
입력한 대로 인자로 받은 버퍼에다 무한정 글자를 채운다. 악의를
가진 사용자는 이런 헛점을 이용해서 여러 다양한 시스템에서 버퍼
오버런 보안 구멍을 뚫곤 한다. 절대 gets()를 사용하지 말라.


셋째. 이 코드는 사용자가 영어를 알고 있다고 가정한다.
마지막으로 정신이 제대로 박힌 사람이라면 아무도 이런 사용자의
반응이 필요한 라이브러리 안에 넣어두지 않을 것이다.


"실용주의 프로그래머(Pragmatic Programmer" 중에서.

'~2006.07.30 > 外(바깥 외) - Code' 카테고리의 다른 글

TrollTech Qt Compile.  (2) 2005.11.07