트러블슈팅: CRLF로 인해 맞는 코드의 테스트가 실패하는 현상 해결하기
본인이 열심히 작성한 코드들이 모여 하나의 기능을 완성했다면, 최종적으로 테스트를 통과하는지를 확인해 해당 기능이 실제로 잘 작동하는지를 검증해야 합니다. 그런데 로직에 자신이 있는데도 테스트가 계속 실패한다면, 어떻게 해야 할까요?
사실 이런 상황에서 확신을 갖기는 쉽지 않습니다. 대부분은 ‘내 코드에 문제가 있나?’ 하는 의심과 함께, 본인의 코드를 이리저리 고치기 시작하게 되죠. 하지만 이 과정에서 정작 맞는 코드를 손상시켜 또 다른 문제를 만들어내고, 결국 정답에서 점점 멀어지며 시간만 허비하게 되는 일이 자주 발생합니다.
저 역시 같은 경험을 했습니다. 테스트가 통과되지 않아 수많은 시간을 들여 코드를 수정했지만, 알고 보니 문제는 코드에 있지 않았습니다. 처음에는 GPT에게 도움을 요청했지만, 자꾸만 이상한 방향으로 코드를 바꾸라고 해서 오히려 더 미궁에 빠지기도 했는데요.
결론적으로 핵심 원인은 코드가 아니라 Windows의 줄바꿈 방식인 CRLF였습니다.
CRLF로 인해 실패하는 테스트 목록
CRLF로 인해 제대로 된 코드임에도 실패하게 되는 테스트는 아래 6종류입니다.
- read-normal
- read-boundary
- fork-read
- fork-close
- exec-read
- multi-child-fd
해당 테스트들의 .output 파일을 살펴보면, 다음과 같이 정답 텍스트와 다르게 실제 읽어온 문자가 일부분 잘려있고, 결국 정답 텍스트와의 불일치로 인해 테스트가 실패하게 되는 것을 확인할 수 있습니다.
테스트가 실패하는 이유
현재 테스트를 실행하는 운영체제 환경은 Linux 기반의 Ubuntu인데요. 리눅스에서는 줄바꿈 시 개행 문자로 LF(Line Feed, 0x0a)만 사용됩니다.
반면, Windows에서는 줄바꿈을 CRLF(Carriage Return + Line Feed, 0x0d 0x0a)로 처리해 1바이트가 더 추가됩니다. 이 차이로 인해, 리눅스 환경에서 CRLF 방식으로 저장된 파일을 읽게 되면, 각 줄마다 불필요한 1바이트(CR)가 문자열로 인식되어 읽기에 포함되면서, 줄마다 예상보다 더 많은 데이터를 읽게 되지요.
그 결과, 파일 전체를 읽는 과정에서 실제보다 읽는 바이트 수가 많아지게 되고, 특정 바이트 수만큼 읽도록 제한된 상황에서는 텍스트의 일부가 누락되거나, 줄 끝이 잘리며 덜 읽히는 현상이 발생할 수 있습니다.
해결 방법
이 문제는 CRLF로 줄바꿈된 파일을 Linux의 줄바꿈 방식인 LF로 변환해줌으로써 손쉽게 해결할 수 있는데요. 이전 글에서 설명했던 dos2unix를 활용하면 됩니다. 해당 글을 참고해 터미널에서 dos2unix의 설치를 완료합니다.
그 다음에는 dos2unix 명령어를 사용해 문제가 발생하는 파일인 sample.txt를 변환해주면 되는데요. sample.txt가 위치한 디렉터리로 이동한 뒤, 다음 명령어를 실행해줍니다.
sudo dos2unix sample.txt
실행 전 find sample.txt
를 통해 해당 디렉터리에 sample.txt가 있는지 확인해볼 수 있습니다.
변환 이후 테스트를 돌려보면 기존에 CRLF로 인해 실패하던 테스트들이 정상적으로 통과되는 것을 확인할 수 있습니다.
'크래프톤 정글 > Code 정글(C언어)' 카테고리의 다른 글
[Pintos] Pintos-Kaist Project2 User Programs Solution 및 Docker 기반 프로젝트 실습 템플릿 (0) | 2025.05.27 |
---|---|
[Pintos] User Programs 테스트 및 디버깅 정보 공유 (0) | 2025.05.24 |
[Pintos] User Programs Part2 구현하기 (동기화 처리된 fork 구현, 파일 시스템 관련 시스템 콜 마무리) (0) | 2025.05.23 |
[Pintos] User Programs Part 2 전체적인 큰 그림 그리기 (0) | 2025.05.21 |
[Pintos] User Programs Part1 구현하기 (프로세스 실행 및 인자 전달, 시스템 콜 및 사용자 포인터 검증, 프로세스 동기화 및 종료) (0) | 2025.05.20 |