CodeSOD: 나는 존재한다 노트

CodeSOD: 나는 존재한다

Greta는 오래된 Pascal 개발 환경에서 작업하던 중, 파일이 실제로 존재함에도 불구하고 프로그램에서 파일이 존재하지 않는다고 보고하는 버그를 발견했습니다. 그녀는 이 문제를 시스템 라이브러리의 FileExists 함수로 추적했습니다. 이 함수는 파일의 마지막 수정 타임스탬프를 가져오는 FileAge에 의존합니다. FileAge는 다시 시간 형식을 변환하기 위해 FileTimeToDosDateTime을 사용합니다. 결정적인 결함은 FileAge가 FileTimeToDosDateTime의 반환 값을 처리하는 방식에 있습니다. FileTimeToDosDateTime은 성공 또는 실패를 나타내기 위해 부울 값을 반환하고, 실패 시 오류 코드를 설정합니다. 그러나 FileAge는 이 부울 반환 값을 확인하지 않습니다. FileTimeToDosDateTime이 실패하면 FileAge는 -1을 반환합니다. 결과적으로 FileExists는 이 -1을 파일이 존재하지 않는 것으로 해석합니다. Greta의 특정 버그의 근본 원인은 파일을 작성하는 프로세스가 "마지막 쓰기 시간"을 설정하지 않았다는 것입니다. 유효한 마지막 쓰기 시간이 없으면 FileTimeToDosDateTime이 실패하고, 이로 인해 FileAge가 -1을 반환하며, 따라서 FileExists는 파일을 잘못하여 존재하지 않는 것으로 보고합니다. 이는 시스템 라이브러리에서 오류 처리에 있는 미묘한 오류가 중요한 기능 버그로 이어지는 일반적인 문제를 강조합니다.