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

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

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

단언(assertion)

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

검증

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

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

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

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

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