<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2003/XInclude" type="topic" id="preconditions" xml:lang="ko">

  <info>
    <link type="guide" xref="index#specific-how-tos"/>

    <credit type="author copyright">
      <name>Philip Withnall</name>
      <email its:translate="no">philip.withnall@collabora.co.uk</email>
      <years>2015</years>
    </credit>

    <include xmlns="http://www.w3.org/2001/XInclude" href="cc-by-sa-3-0.xml"/>

    <desc>함수 입출력을 검사하며 사전 계획에 따라 프로그래밍합니다</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>조성호</mal:name>
      <mal:email>shcho@gnome.org</mal:email>
      <mal:years>2016-2018.</mal:years>
    </mal:credit>
  </info>

  <title>전 후 상태 테스트</title>

  <section id="pre-and-post-conditions">
    <title>전 후 상태 테스트</title>

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

    <p>잘못된 데이터의 전달을 막는 표준 방식은 모든 입력과, 모든 출력, 라이브러리 또는 모듈에 공개적으로 나타나는 모든 함수를 검사하는 방식입니다. 검사는 두 단계로 이루어집니다:</p>
    <terms>
      <item>
        <title>단언(assertion)</title>
        <p>프로그래머 오류를 확인하고 처리 실패시 프로그램을 중단하십시오.</p>
      </item>
      <item>
        <title>검증</title>
        <p>잘못된 입력을 확인하고 처리 실패시 충분한 오류 메시지를 반환하십시오.</p>
      </item>
    </terms>

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

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

    <p><link href="https://developer.gnome.org/glib/stable/glib-Warnings-and-Assertions.html#g-return-if-fail"><code>g_return_if_fail()</code></link> 함수와 <link href="https://developer.gnome.org/glib/stable/glib-Warnings-and-Assertions.html#g-return-val-if-fail"><code>g_return_val_if_fail()</code></link> 함수를 활용하여 전 후 상태 단언부를 구현합니다.</p>

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