Philip Withnall
philip.withnall@collabora.co.uk 2015
함수 입출력을 검사하며 사전 계획에 따라 프로그래밍합니다
조성호
shcho@gnome.org 2016-2018.

# 전 후 상태 테스트

# 전 후 상태 테스트

안전한 코드 작성에 있어 중요한 부분은 잘못된 데이터를 코드로 전달하는지 확인하는 과정입니다. 게다가 일부 악의적인 입력을 전달할 수 있고, 더 많은 코드에서 이 값을 들여다 보며, 권한 탈취 가능성에 더욱 큰 잠재성이 있습니다.

잘못된 데이터의 전달을 막는 표준 방식은 모든 입력과, 모든 출력, 라이브러리 또는 모듈에 공개적으로 나타나는 모든 함수를 검사하는 방식입니다. 검사는 두 단계로 이루어집니다:

## 단언(assertion)

프로그래머 오류를 확인하고 처리 실패시 프로그램을 중단하십시오.

## 검증

잘못된 입력을 확인하고 처리 실패시 충분한 오류 메시지를 반환하십시오.

검증은 복잡한 영역이며 GErrors로 처리합니다. 이 부분의 나머지는, 프로그래머 오류 만을 잡는 전 후 상태의 단언을 다룹니다. 프로그래머 오류는 함수에서 허용하지 않는 문서로 남겨둔 처리 방식입니다. `NULL` 값을 전달하면 안된다고 문서에 남겨둔 부분에 `NULL` 값을 전달했을 경우, 또는 양수 값을 전달해야 하는 함수에 음수 값을 전달했을 경우를 예로 들 수 있습니다. 프로그래머 오류는 출력으로도 나타날 수 있습니다. 문서에 `NULL` 값을 반환한다고 기록하지 않았는데 `NULL` 값을 반환하거나, 실행에 실패했을 때 GError 출력을 설정하지 않았을 경우가 이에 해당합니다.

전 후 상태 단언부를 코드에 추가하면 각 함수의 동작을 좀 더 확실하게 파악할 수 있으며, 코드 자체에 단언부를 추가하는 만큼 그 자체로 완전한 문서화를 이룹니다. 모든 단언부는 `(nullable)`과 같은 관련 인트로스펙션 주석으로 적절하게 문서에 남겨두어야 합니다.

`g_return_if_fail()` 함수와 `g_return_val_if_fail()` 함수를 활용하여 전 후 상태 단언부를 구현합니다.

이전 상태 단계에서는 다른 코드를 실행하기 전 함수의 시작 부분에서 각 매개변수를 검사해야합니다(예를 들면, GObject는 `NULL`이 될 수 있기에 GObject에서 자체 데이터 구조를 가져옴). 이후 상태 단계에서는 함수 마지막 부분의 출력 매개 변수와 반환 값을 검사해야합니다. 기타 제어 흐름을 한군데로 모아둘 목적으로 단일 `return` 구문과 `goto` 문을 사용해야합니다. 예제는 링크를 참고하십시오.