<aside>
📌 결론부터 얘기하자면 errno을 사용해도 된다. NULL, LONG_MAX도 전부 다 써도 된다.
현재 만연한 분위기로 인해 디펜스를 해야할 수도 있지만 분위기가 바꼈으면 좋겠다.
</aside>
errno
거의 모든 시스템 호출은 에러를 감지하면 외부 식별자 errno를 통해 오류 번호를 제공한다.
#include <errno.h>
extern int * __error();
#define errno (* __error())
- 여러 함수들의 man을 보면 ERRORS 섹션에 각 오류와 의미가 작성되어 있다.
- man에 따르면 “-1이 반환되면 실패를 분석하여 그에 따른 조치를 취할 수 있다”고 되어 있다.
- 거의 모든 시스템 호출에서 사용하는 표준 방식이고 에러 핸들링이 깔끔해진다.
- 특히, 반환 값으로 성공/실패 여부를 알기 힘들 때 유용하게 사용할 수 있다.
- 설정되면 다른 오류가 발생될 때 까지 유지되므로 오류가 발생한 후에 검사를 해야 한다.
- 함수 A가 실패해서 errno가 설정되면, 함수 B를 성공해도 A의 errno는 계속 유지된다.
사용하면 안되는 이유와 그에 대한 반박
슬랙에 올라온 의견들을 보면 사용하면 안된다가 많아서 이를 하나하나 반박해보려고 한다.
코딩이 쉬워진다 (with ft_atoi)
- “에러 핸들링이 편해지기 때문에 코딩이 쉬워진다”는 주장이다.
- 정확하게는 “errno를 사용하면 에러 핸들링이 깔끔해진다”이고 쉬워지는 건 아니다.
- 오히려 에러 핸들링을 하기 위해 추가되어야하는 부분이 생겨서 힘들 수도 있다.
- ft_atoi를 통해 반박해보고자 하는데 설명하기 전에 앞서 관련 man 페이지부터 살펴보자.
- ft_atoi의 반환값으로는 오버플로우를 알 수 없으며, 원본 함수는 errno를 사용하고 있다.
- 0 또는 -1이 반환 값이 변환이 성공해서인지 실패해서인지 알 수 없다.
- 원본에서는 errno 값이 ERNAGE 인지 확인한다.