
리눅스 매뉴얼 initstate(3)에는 glibc가 오류 때 NULL을 반환하지 않는다는 설명이 남아 있지만, 이 동작은 2013년에 수정됐다. 글을 올린 사람은 앞선 게시물의 주장을 정정하면서, 매뉴얼이 POSIX에서 이 함수의 오류를 정의하지 않는다는 점도 빠뜨렸다고 지적했다.
앞선 게시물은 glibc의 initstate가 POSIX 요구사항과 달리 오류 때 NULL을 반환하지 않는다고 주장했다. 당시 게시물에 실린 예제 코드는 다음과 같다.
// EINVAL: state array less than 8 bytes char *state = initstate(67, (char [1]){}, 1); assert(errno == EINVAL); // ok assert(state == NULL); // fails, despite posix requiring it to succeed
그러나 독자의 이메일을 받은 뒤 예제 코드를 다시 실행하자 NULL 반환을 확인하는 단언문이 성공했다. 글을 올린 사람은 앞서 테스트할 때 실수했을 가능성을 언급하고, 게시물의 해당 주장이 잘못됐다고 정정했다. 독자가 알려준 glibc 수정 기록에 따르면 이 버그는 2013년에 고쳐졌지만, 매뉴얼에는 이전 내용이 남아 있다.
더 살펴보니 initstate(3)에는 POSIX가 이 함수의 오류를 정의하지 않는다는 정보도 빠져 있었다. initstate(3p)의 ERRORS 항목은 “정의된 오류가 없다”고 설명한다. 따라서 glibc가 오류 때 errno를 설정하는 것은 POSIX 규정이 아니라 확장 기능이며, state 인수가 NULL일 때 오류로 처리하는 것도 glibc 확장이다.
반면 musl의 initstate 구현은 POSIX를 그대로 따른다. 어떤 오류에서도 errno를 설정하지 않으며, 널 포인터를 전달하면 세그멘테이션 오류가 발생한다. 글을 올린 사람은 이 사례를 통해 리눅스 매뉴얼이 상세하더라도 때때로 전체 조건을 설명하지 않을 수 있다고 짚었다.
앞선 게시물은 ‘C는 표준 C가 아니다’이며, 글을 올린 사람은 같은 달에 오래된 리눅스 매뉴얼 정보를 발견한 또 다른 사례도 겪었다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요