시스템 프로그래머들이 예외를 찾아내는 접근 방식은 3가지 기준점으로 정형화되어 있습니다
① "0, 음수, NULL" (경계값의 3대장)
- 함수가 인자(Argument)를 받을 때,
- 입력될 수 있는 가장 극단적인 값을 기계적으로 대입해 보는 훈련
- 포인터가 들어온다면: "만약 아무 주소도 가리키지 않는 0번지(NULL)가 들어오면?"
- ptr == NULL일 때 역참조(*ptr)하면 즉시 세그멘테이션 폴트(프로그램 강제 종료)가 나므로 무조건 방어해야 함.
- 크기/숫자가 들어온다면: "만약 크기가 0이 들어오면?"
- 음수가 들어오면?
- 0바이트를 달라고 하거나 0바이트로 줄이라는 엉뚱한 요청을 어떻게 처리할 것인가?
② 함수의 생명주기(Lifecycle) 뒤틀기
- 정상적인 흐름은 malloc → realloc → free 순서입니다.
- 하지만 사용자는 이 순서를 절대 지켜주지 않는다고 가정합니다:
- 할당도 안 해놓고(ptr == NULL) 바로 늘려달라고 떼쓰면?
- "아, 그냥 새로 만들어줘야겠네(malloc)."
- 늘려달라면서 크기를 0으로 주면?
③ 리눅스 man page(설명서) 확인하기
- 가장 현실적인 정답은 "머리로 상상하지 않고 스펙 문서를 읽는 것"입니다.
- 새로운 시스템 함수나 라이브러리 함수를 구현할 때, 개발자들은 머리를 쥐어짜지 않고 터미널에 man [함수이름]을 칩니다.
- 매뉴얼의 {RETURN VALUE, ERRORS, DESCRIPTION} 섹션
- 어떤 비정상적인 입력이 들어올 수 있고 각각 어떻게 처리해야 하는지가 전부 적혀 있습니다.