예외는 어떻게 생각해내야 하는가?

Jinhoon Yoon·4일 전

시스템 프로그래머들이 예외를 찾아내는 접근 방식은 3가지 기준점으로 정형화되어 있습니다

① "0, 음수, NULL" (경계값의 3대장)

  • 함수가 인자(Argument)를 받을 때,
    • 입력될 수 있는 가장 극단적인 값을 기계적으로 대입해 보는 훈련
      • 포인터가 들어온다면: "만약 아무 주소도 가리키지 않는 0번지(NULL)가 들어오면?"
        • ptr == NULL일 때 역참조(*ptr)하면 즉시 세그멘테이션 폴트(프로그램 강제 종료)가 나므로 무조건 방어해야 함.
      • 크기/숫자가 들어온다면: "만약 크기가 0이 들어오면?"
      • 음수가 들어오면?
        • 0바이트를 달라고 하거나 0바이트로 줄이라는 엉뚱한 요청을 어떻게 처리할 것인가?

② 함수의 생명주기(Lifecycle) 뒤틀기

  • 정상적인 흐름은 malloc →\rightarrow realloc →\rightarrow free 순서입니다.
  • 하지만 사용자는 이 순서를 절대 지켜주지 않는다고 가정합니다:
    • 할당도 안 해놓고(ptr == NULL) 바로 늘려달라고 떼쓰면?
      • "아, 그냥 새로 만들어줘야겠네(malloc)."
    • 늘려달라면서 크기를 0으로 주면?
      • "아, 방을 빼겠다는 소리구나(free)."

③ 리눅스 man page(설명서) 확인하기

  • 가장 현실적인 정답은 "머리로 상상하지 않고 스펙 문서를 읽는 것"입니다.
  • 새로운 시스템 함수나 라이브러리 함수를 구현할 때, 개발자들은 머리를 쥐어짜지 않고 터미널에 man [함수이름]을 칩니다.
  • 매뉴얼의 {RETURN VALUE, ERRORS, DESCRIPTION} 섹션
    • 어떤 비정상적인 입력이 들어올 수 있고 각각 어떻게 처리해야 하는지가 전부 적혀 있습니다.

0개의 댓글