C++26 Contracts, assert를 대체하는 계약 프로그래밍
C++26 Contracts: Introduction to Preconditions and Postconditions

C++26에 도입된 Contracts는 함수 선언에 pre와 post로 사전조건과 사후조건을 명시해 API 요구사항을 코드에 드러낸다. 기존 assert와 달리 선언부에 계약을 노출하고, ignore·observe·enforce·quick-enforce 네 가지 평가 시맨틱을 지원한다. 현재 GCC 16만 -fcontracts 플래그로 사용 가능하며, 계약 위반 시 핸들러를 교체할 수 있다. 단, 계약은 입력 검증이 아니며 predicate 내 상태 변경은 피해야 한다.
중요한 점은 Contracts의 이러한 측면 때문에 계약 단언이 오류 처리와 입력 검증에 사용되어서는 안 된다는 것입니다. 함수가 특정 이벤트를 오류로 보고해야 하는 계약 내 요구사항을 가진다면, 그 처리는 선택 사항이 아닌 표준 C++ 제어문으로 수행해야 하며, 결코 계약 단언으로 해서는 안 됩니다.
HN 토론
110- cogman10
나는 이게 마음에 안 든다.
계약을 걸어서 런타임 에러를 컴파일 타임 에러로 바꿀 수 있다면야 적극 찬성이다. 그런데 이건 그냥 런타임 에러를 더 만드는 것처럼 보인다. 그 지점에서 이건 `assert`보다 나을 게 없어 보인다. 정말로 assert하겠다고 약속한다는 점(아마도)만 빼면 말이다.
이 글은 또한 큰 문제 하나를 지적하는데, 바로 "중요한 점은, Contracts의 이런 측면 때문에 계약 단언을 에러 처리와 입력 검증에 사용해서는 안 된다는 것이다. 어떤 함수가 특정 이벤트를 에러로 보고해야 한다는 계약 내 요구사항을 가지고 있다면, 그 처리는 선택 사항이 아닌 표준 C++ 제어문으로 해야 하며, 결코 계약 단언으로 해서는 안 된다."라는 부분이다.
계약이 무엇에 쓰이는 건지에 대한 이런 흐릿한 정의는 십중팔구 혼란을 불러올 것이다. 입력 검증은 아니고, 매개변수 검증이다.. 그런데 진짜 검증은 아니고 에러를 내는 검사다, 그런데 우리가 만들어내는 에러는 아니다.
- WalterBright
나는 예전에 계약의 열렬한 팬이었고, 90년대에 Zortech C++ 컴파일러에서 실제로 구현하기도 했다:
https://www.digitalmars.com/ctg/contract.html
D에서도 구현했다. 하지만 결국 그다지 유용하지 않다는 게 드러났다.
- ZuLuuuuuu
이걸 보니 Eiffel 프로그래밍 언어의 "Design by Contract" 개념이 떠오른다:
https://en.wikipedia.org/wiki/Design_by_contract
https://www.eiffel.com/values/design-by-contract/introductio...
- Surac
그럼 대체 뭐가 좋다는 거야, 입력을 검증하는 데 쓰지도 못한다면? 매개변수 범위를 편하게 적어두는 방법. 그 이상도 이하도 아니다
- gavinray
재미난 얘기 하나: 이게 표준에 들어가기를 기다리면서 몇 년 전에 C/C++에 Contracts를 추가하는 GCC 컴파일러 플러그인을 작성했었다
https://gavinray97.github.io/blog/adding-invariant-to-cpp-de...
결과적으로 그 글은 GCC 플러그인 작성 입문서로서가 제일 유용했던 걸로 드러났지만, 적어도 재미는 있었다
- tsukikage
이 글은 최적화 활용 사례를 전혀 언급하지 않는다. 혹시 누군가 이미 답을 꿰뚫고 있고 내가 답을 찾아 헤매기 전에 말인데, 여기 의도 중 일부는 이것들이 최적화 단계에 정보를 주는 것, 어쩌면 if (!(some_condition)) { __builtin_unreachable(); } 관용구가 달성할 수 있는 것과 비슷하게 하는 것도 포함되나?
- MetaverseClub
이걸 설계할 때 그들이 머릿속에 그린 사용 사례가 뭔지 궁금하다.
런타임 단언과 문서화라면, 그래, 작동하겠지만 계약 없이도 논란의 여지 없이 괜찮게 작동한다.
형식 검증이라면, 설계가 완전히 빗나갔다.
- randyrand
나만 그런지 모르겠지만, C++처럼 거대하고 복잡한 언어는 그 어느 때보다 매력 없어 보인다.
코드를 손으로 작성할 거라면, 아름답고 쾌적한 언어에 대한 요구가 그 어느 때보다 커졌다.