C++26 Contracts: 사전조건과 사후조건 입문

2 hours ago 3

C++26 Contracts는 함수 진입 시 요구사항을 pre, 정상 반환 시 보장을 post, 함수 내부 조건을 contract_assert로 표현함 함수 선언에 계약을 명시할 수 있어 구현을 열어보지 않고도 API 요구사항을 확인할 수 있으며, 하나의 사후조건으로 모든 정상 반환 경로를 검사할 수 있음 계약의 실행 방식은 Ignore, Observe, Enforce, Quick-enforce로 나뉘며, 계약을 작성했다고 항상 런타임 검사가 수행되거나 잘못된 실행이 차단되는 것은 아님 첫 번째 함수 선언이 계약을 확정하며, 사후조건에서 사용하는 값 전달 매개변수는 모든 선언에서 const여야 하는 등 선언과 조건식에 별도 규칙이 적용됨 계약은 입력 검증이나 오류 처리의 대체재가 아님. 필수 처리에는 일반 제어문을 사용하고, 계약 조건식의 부수 효과에 의존하지 않아야 함 assert에서 함수 계약으로 표준 라이브러리 강화가 잘못된 컨테이너 접근과 사전조건 위반을 검사하듯, C++26 Contracts로 사용자 코드의 요구사항도 표현할 수 있음 get_value(values, index)의 본문에 assert(index < values.size())를 넣으면 유효한 인덱스를 요구할 수 있지만, 두 가지 제약이 있음 검사가 활성화된 경우에만 실패 시 진단 메시지를 출력하고 종료하며, NDEBUG 를 정의하면 검사가 제거됨 요구사항이 구현 안에 있어 선언만 읽는 사용자는 벡터와 인덱스 사이의 관계를 알 수 없음 P2900, Contracts for C++로 도입된 pre(...) 는 매개변수 목록 뒤에 작성하며, 함수 진입 시 충족해야 할 조건을 나타냄 선언과 정의에 pre(index < values.size())를 붙여 요구사항을 API에 드러낼 수 있음 런타임 검사를 비활성화해도 API 문서화에 유용함 기존 assert와 달리 계약은 호출자의 요구사항과 함수의 반환 보장을 구분하고, 단순 활성화/비활성화보다 다양한 검사 방식을 제공함 벡터 {10, 20, 30}에서 인덱스 1을 읽으면 20을 반환하지만, 인덱스 10은 사전조건을 위반함 Compiler Explorer 예제의 GCC 실행에서는 enforce 정책에 따라 실패한 조건식과 위치 등을 출력하고 SIGABRT로 종료함 선언과 정의에 적용되는 규칙 첫 번째 선언이 함수의 계약을 확정함 이후 선언이나 정의에서는 계약 지정자를 생략하거나, 동일한 계...

Read Entire Article