버퍼를 늘리는 함수에서 *buffer = realloc(*buffer, n) 같은 줄이 자주 보이는데, 이 줄은 분명한 지점에서 틀렸습니다. 할당에 실패하면 유일하게 소유한 포인터가 널로 덮어써집니다. C11 초안에 따르면 이때 기존 객체는 바뀌지 않은 채 할당된 상태로 남습니다. 결국 함수는 아직 해제해야 할 저장 공간으로 가는 유일한 경로를 잃게 됩니다.
제가 생각하는 함수는 호출자에게서 char **buffer와 size_t *capacity를 받습니다. *buffer는 유효한 할당을 소유하고, 요청 크기는 0보다 크며 현재 용량보다도 큽니다.
결과는 먼저 임시 포인터에 받아야 합니다. 실패하면 할당 오류를 반환하고 두 출력 슬롯은 그대로 둡니다. 성공하면 반환된 포인터와 새 용량을 기록합니다.
문서에 넣어야 할 규칙이 하나 더 있습니다. realloc이 성공하면 기존 객체의 수명이 끝나므로, 반환된 주소가 우연히 같더라도 호출자가 저장해 둔 별칭은 더 이상 쓸 수 없습니다. 지금 초안은 성공과 실패만 반환하고, 성공한 뒤에는 별칭을 다시 만들라고 호출자에게 요구합니다. 이 정도면 된다고 보지만, 별칭 규칙이 지금 문장으로 충분히 분명한지는 아직 확신하지 못합니다.

