C언어 파일 입출력의 50년 된 버그: 레거시 미스터리를 풀다

2024-12-26

DOS 에뮬레이터를 개선하는 과정에서 개발자는 파일 입출력에서 사소해 보이는 버그를 발견했습니다. `echo` 명령어로 파일에 텍스트를 추가했는데 예상치 못한 결과가 나온 것입니다. 디버깅 결과, C 런타임 라이브러리가 읽기와 쓰기 전환을 처리하는 방식에 결함이 있는 것으로 나타났습니다. 이 결함은 1970년대, 심지어 그 이전의 UNIX 시스템까지 거슬러 올라갑니다. 이 글에서는 초기 K&R C부터 현대 C 표준까지 역사적 맥락을 자세히 살펴보고, 다양한 UNIX 버전과 C 컴파일러 간의 구현 차이를 조사합니다. 근본 원인은 초기 C 라이브러리가 업데이트 모드를 처리하는 데 제한이 있었던 것으로 밝혀졌으며, 서로 다른 운영체제와 컴파일러가 이러한 제한을 어떻게 처리했는지에 대한 차이점이 드러납니다. 저자는 오늘날에도 이식성 있는 C 코드에서는 파일 읽기와 쓰기를 전환할 때 명시적인 `fseek` 호출이 필요하다고 결론짓습니다.