index.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Chapter&#160;1.&#160;Boost.Contract 1.0.0</title>
  5. <link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="index.html" title="Chapter&#160;1.&#160;Boost.Contract 1.0.0">
  8. <link rel="next" href="boost_contract/full_table_of_contents.html" title="Full Table of Contents">
  9. </head>
  10. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  11. <table cellpadding="2" width="100%"><tr>
  12. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
  13. <td align="center"><a href="../../../../index.html">Home</a></td>
  14. <td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
  15. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  16. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  17. <td align="center"><a href="../../../../more/index.htm">More</a></td>
  18. </tr></table>
  19. <hr>
  20. <div class="spirit-nav"><a accesskey="n" href="boost_contract/full_table_of_contents.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
  21. <div class="chapter">
  22. <div class="titlepage"><div>
  23. <div><h2 class="title">
  24. <a name="boost_contract"></a>Chapter&#160;1.&#160;Boost.Contract 1.0.0</h2></div>
  25. <div><div class="author"><h3 class="author">
  26. <span class="firstname">Lorenzo</span> <span class="surname">Caminiti <code class="email">&lt;<a class="email" href="mailto:lorcaminiti@gmail.com">lorcaminiti@gmail.com</a>&gt;</code></span>
  27. </h3></div></div>
  28. <div><p class="copyright">Copyright &#169; 2008-2019 Lorenzo Caminiti</p></div>
  29. <div><div class="legalnotice">
  30. <a name="boost_contract.legal"></a><p>
  31. Distributed under the Boost Software License, Version 1.0 (see accompanying
  32. file LICENSE_1_0.txt or a copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  33. </p>
  34. </div></div>
  35. </div></div>
  36. <div class="toc">
  37. <p><b>Table of Contents</b></p>
  38. <dl class="toc">
  39. <dt><span class="section"><a href="index.html#boost_contract.introduction">Introduction</a></span></dt>
  40. <dt><span class="section"><a href="boost_contract/full_table_of_contents.html">Full Table of Contents</a></span></dt>
  41. <dt><span class="section"><a href="boost_contract/getting_started.html">Getting Started</a></span></dt>
  42. <dt><span class="section"><a href="boost_contract/contract_programming_overview.html">Contract
  43. Programming Overview</a></span></dt>
  44. <dt><span class="section"><a href="boost_contract/tutorial.html">Tutorial</a></span></dt>
  45. <dt><span class="section"><a href="boost_contract/advanced.html">Advanced</a></span></dt>
  46. <dt><span class="section"><a href="boost_contract/extras.html">Extras</a></span></dt>
  47. <dt><span class="section"><a href="boost_contract/examples.html">Examples</a></span></dt>
  48. <dt><span class="section"><a href="reference.html">Reference</a></span></dt>
  49. <dt><span class="section"><a href="boost_contract/release_notes.html">Release Notes</a></span></dt>
  50. <dt><span class="section"><a href="boost_contract/bibliography.html">Bibliography</a></span></dt>
  51. <dt><span class="section"><a href="boost_contract/acknowledgments.html">Acknowledgments</a></span></dt>
  52. </dl>
  53. </div>
  54. <div class="blockquote"><blockquote class="blockquote"><p>
  55. <span class="emphasis"><em><span class="quote">&#8220;<span class="quote">Our field needs more formality, but the profession has not
  56. realized it yet.</span>&#8221;</span></em></span>
  57. </p></blockquote></div>
  58. <div class="blockquote"><blockquote class="blockquote"><p>
  59. <span class="emphasis"><em>-- Bertrand Meyer (see <a class="link" href="boost_contract/bibliography.html#Meyer97_anchor">[Meyer97]</a>
  60. page 400)</em></span>
  61. </p></blockquote></div>
  62. <p>
  63. This library implements <a href="http://en.wikipedia.org/wiki/Design_by_contract" target="_top">contract
  64. programming</a> (a.k.a., Design by Contract or DbC) <a href="#ftn.boost_contract.f0" class="footnote" name="boost_contract.f0"><sup class="footnote">[1]</sup></a> for the C++ programming language. All contract programming features
  65. are supported by this library: Subcontracting, class invariants (also for static
  66. and volatile member functions), postconditions (with old and return values),
  67. preconditions, customizable actions on assertion failure (e.g., terminate the
  68. program or throw exceptions), optional compilation of assertions, disable assertions
  69. while already checking other assertions (to avoid infinite recursion), and more
  70. (see <a class="link" href="boost_contract/contract_programming_overview.html#boost_contract.contract_programming_overview.feature_summary" title="Feature Summary">Feature
  71. Summary</a>).
  72. </p>
  73. <div class="section">
  74. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  75. <a name="boost_contract.introduction"></a><a class="link" href="index.html#boost_contract.introduction" title="Introduction">Introduction</a>
  76. </h2></div></div></div>
  77. <p>
  78. Contract programming allows to specify preconditions, postconditions, and class
  79. invariants that are automatically checked when functions are executed at run-time.
  80. These conditions assert program specifications within the source code itself
  81. allowing to find bugs more quickly during testing, making the code self-documenting,
  82. and increasing overall software quality (see <a class="link" href="boost_contract/contract_programming_overview.html" title="Contract Programming Overview">Contract
  83. Programming Overview</a>).
  84. </p>
  85. <p>
  86. For example, consider the following function <code class="computeroutput"><span class="identifier">inc</span></code>
  87. that increments its argument <code class="computeroutput"><span class="identifier">x</span></code>
  88. by <code class="computeroutput"><span class="number">1</span></code> and let's write its contract
  89. using code comments (see <a href="../../example/features/introduction_comments.cpp" target="_top"><code class="literal">introduction_comments.cpp</code></a>):
  90. </p>
  91. <p>
  92. </p>
  93. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">inc</span><span class="special">(</span><span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span>
  94. <span class="comment">// Precondition: x &lt; std::numeric_limit&lt;int&gt;::max()</span>
  95. <span class="comment">// Postcondition: x == oldof(x) + 1</span>
  96. <span class="special">{</span>
  97. <span class="special">++</span><span class="identifier">x</span><span class="special">;</span> <span class="comment">// Function body.</span>
  98. <span class="special">}</span>
  99. </pre>
  100. <p>
  101. </p>
  102. <p>
  103. The precondition states that at function entry the argument <code class="computeroutput"><span class="identifier">x</span></code>
  104. must be strictly smaller than the maximum allowable value of its type (so it
  105. can be incremented by <code class="computeroutput"><span class="number">1</span></code> without
  106. overflowing). The postcondition states that at function exit the argument
  107. <code class="computeroutput"><span class="identifier">x</span></code> must be incremented by <code class="computeroutput"><span class="number">1</span></code> with respect to the <span class="emphasis"><em>old value</em></span>
  108. that <code class="computeroutput"><span class="identifier">x</span></code> had before executing
  109. the function (indicated here by <code class="literal"><span class="emphasis"><em>oldof</em></span></code><code class="computeroutput"><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>).
  110. Note that postconditions shall be checked only when the execution of the function
  111. body does not throw an exception.
  112. </p>
  113. <p>
  114. Now let's program this function and its contract using this library (see <a href="../../example/features/introduction.cpp" target="_top"><code class="literal">introduction.cpp</code></a>
  115. and <a class="link" href="boost_contract/tutorial.html#boost_contract.tutorial.non_member_functions" title="Non-Member Functions">Non-Member
  116. Functions</a>):
  117. </p>
  118. <p>
  119. </p>
  120. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  121. <span class="keyword">void</span> <span class="identifier">inc</span><span class="special">(</span><span class="keyword">int</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
  122. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_x</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span> <span class="comment">// Old value.</span>
  123. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  124. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  125. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">x</span> <span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">());</span> <span class="comment">// Line 17.</span>
  126. <span class="special">})</span>
  127. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  128. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_x</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Line 20.</span>
  129. <span class="special">})</span>
  130. <span class="special">;</span>
  131. <span class="special">++</span><span class="identifier">x</span><span class="special">;</span> <span class="comment">// Function body.</span>
  132. <span class="special">}</span>
  133. </pre>
  134. <p>
  135. </p>
  136. <p>
  137. When the above function <code class="computeroutput"><span class="identifier">inc</span></code>
  138. is called, this library will:
  139. </p>
  140. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  141. <li class="listitem">
  142. First, execute the functor passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">precondition</span><span class="special">(...)</span></code>
  143. that asserts <code class="computeroutput"><span class="identifier">inc</span></code> precondition.
  144. </li>
  145. <li class="listitem">
  146. Then, execute <code class="computeroutput"><span class="identifier">inc</span></code> body
  147. (i.e., all the code that follows the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="special">...</span></code> declaration).
  148. </li>
  149. <li class="listitem">
  150. Last, execute the functor passed to <code class="computeroutput"><span class="special">.</span><span class="identifier">postcondition</span><span class="special">(...)</span></code>
  151. that asserts <code class="computeroutput"><span class="identifier">inc</span></code> postcondition
  152. (unless <code class="computeroutput"><span class="identifier">inc</span></code> body threw
  153. an exception).
  154. </li>
  155. </ul></div>
  156. <p>
  157. For example, if there is a bug in the code calling <code class="computeroutput"><span class="identifier">inc</span></code>
  158. so that the function is called with <code class="computeroutput"><span class="identifier">x</span></code>
  159. equal to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">max</span><span class="special">()</span></code> then the program will terminate with an error
  160. message similar to the following (and it will be evident that the bug is in
  161. the calling code):
  162. </p>
  163. <pre class="programlisting">precondition assertion "x &lt; std::numeric_limits&lt;int&gt;::max()" failed: file "introduction.cpp", line 17
  164. </pre>
  165. <p>
  166. Instead, if there is a bug in the implementation of <code class="computeroutput"><span class="identifier">inc</span></code>
  167. so that <code class="computeroutput"><span class="identifier">x</span></code> is not incremented
  168. by <code class="computeroutput"><span class="number">1</span></code> after the execution of the
  169. function body then the program will terminate with an error message similar
  170. to the following (and it will be evident that the bug is in <code class="computeroutput"><span class="identifier">inc</span></code>
  171. body): <a href="#ftn.boost_contract.introduction.f0" class="footnote" name="boost_contract.introduction.f0"><sup class="footnote">[2]</sup></a>
  172. </p>
  173. <pre class="programlisting">postcondition assertion "x == *old_x + 1" failed: file "introduction.cpp", line 20
  174. </pre>
  175. <p>
  176. By default, when an assertion fails this library prints an error message such
  177. the ones above to the standard error <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code> and
  178. terminates the program calling <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
  179. (this behaviour can be customized to take any user-specified action including
  180. throwing exceptions, see <a class="link" href="boost_contract/advanced.html#boost_contract.advanced.throw_on_failures__and__noexcept__" title="Throw on Failures (and noexcept)">Throw
  181. on Failures</a>). Note that the error messages printed by this library contain
  182. all the information necessary to easily and uniquely identify the point in
  183. the code at which contract assertions fail. <a href="#ftn.boost_contract.introduction.f1" class="footnote" name="boost_contract.introduction.f1"><sup class="footnote">[3]</sup></a>
  184. </p>
  185. <div class="note"><table border="0" summary="Note">
  186. <tr>
  187. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../doc/src/images/note.png"></td>
  188. <th align="left">Note</th>
  189. </tr>
  190. <tr><td align="left" valign="top"><p>
  191. C++11 lambda functions are necessary to use this library without manually
  192. writing a significant amount of boiler-plate code to program functors that
  193. assert the contracts (see <a class="link" href="boost_contract/extras.html#boost_contract.extras.no_lambda_functions__no_c__11_" title="No Lambda Functions (No C++11)">No
  194. Lambda Functions</a>). That said, this library implementation does not
  195. use C++11 features and should work on most modern C++ compilers (see <a class="link" href="boost_contract/getting_started.html" title="Getting Started">Getting Started</a>).
  196. </p></td></tr>
  197. </table></div>
  198. <p>
  199. In addition to contracts for non-member functions as shown the in the example
  200. above, this library allows to program contracts for constructors, destructors,
  201. and member functions. These can check class invariants and can also <span class="emphasis"><em>subcontract</em></span>
  202. inheriting and extending contracts from base classes (see <a href="../../example/features/introduction_public.cpp" target="_top"><code class="literal">introduction_public.cpp</code></a>
  203. and <a class="link" href="boost_contract/tutorial.html#boost_contract.tutorial.public_function_overrides__subcontracting_" title="Public Function Overrides (Subcontracting)">Public
  204. Function Overrides</a>): <a href="#ftn.boost_contract.introduction.f2" class="footnote" name="boost_contract.introduction.f2"><sup class="footnote">[4]</sup></a>
  205. </p>
  206. <p>
  207. </p>
  208. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  209. <span class="keyword">class</span> <span class="identifier">vector</span>
  210. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span>
  211. <span class="special">:</span> <span class="identifier">BASES</span>
  212. <span class="special">{</span>
  213. <span class="keyword">public</span><span class="special">:</span>
  214. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// For subcontracting.</span>
  215. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  216. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="comment">// Checked in AND with base class invariants.</span>
  217. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">());</span>
  218. <span class="special">}</span>
  219. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">,</span>
  220. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span> <span class="comment">// For virtuals.</span>
  221. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">unsigned</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  222. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">size</span><span class="special">());</span> <span class="comment">// Old values for virtuals.</span>
  223. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span> <span class="comment">// For overrides.</span>
  224. <span class="identifier">override_push_back</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vector</span><span class="special">::</span><span class="identifier">push_back</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">value</span><span class="special">)</span>
  225. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Checked in OR with base preconditions.</span>
  226. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">());</span>
  227. <span class="special">})</span>
  228. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Checked in AND with base postconditions.</span>
  229. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
  230. <span class="special">})</span>
  231. <span class="special">;</span>
  232. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
  233. <span class="special">}</span>
  234. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="comment">// Define `override_push_back` above.</span>
  235. <span class="comment">// Could program contracts for those as well.</span>
  236. <span class="keyword">unsigned</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
  237. <span class="keyword">unsigned</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
  238. <span class="keyword">unsigned</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span> <span class="special">}</span>
  239. <span class="keyword">private</span><span class="special">:</span>
  240. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">vect_</span><span class="special">;</span>
  241. <span class="special">};</span>
  242. </pre>
  243. <p>
  244. </p>
  245. <h4>
  246. <a name="boost_contract.introduction.h0"></a>
  247. <span class="phrase"><a name="boost_contract.introduction.language_support"></a></span><a class="link" href="index.html#boost_contract.introduction.language_support">Language
  248. Support</a>
  249. </h4>
  250. <p>
  251. The authors of this library advocate for contracts to be added to the core
  252. language. Adding contract programming to the C++ standard has a number of advantages
  253. over any library implementation (shorter and more concise syntax to program
  254. contracts, specify contracts in declarations instead of definitions, enforce
  255. contract constant-correctness, expected faster compile- and run-time, vendors
  256. could develop static analysis tools to recognize and check contracts statically
  257. when possible, compiler optimizations could be improved based on contract conditions,
  258. etc.).
  259. </p>
  260. <p>
  261. The <a class="link" href="boost_contract/bibliography.html#P0380_anchor">[P0380]</a> proposal supports basic contract
  262. programming, it was accepted and it will be included in C++20. This is undoubtedly
  263. a step in the right direction, but unfortunately <a class="link" href="boost_contract/bibliography.html#P0380_anchor">[P0380]</a>
  264. only supports pre- and postconditions while missing important features such
  265. as class invariants and old values in postconditions, not to mention the lack
  266. of more advanced features like subcontracting (more complete proposals like
  267. <a class="link" href="boost_contract/bibliography.html#N1962_anchor">[N1962]</a> were rejected by the C++ standard
  268. committee). All contracting programming features are instead supported by this
  269. library (see <a class="link" href="boost_contract/contract_programming_overview.html#boost_contract.contract_programming_overview.feature_summary" title="Feature Summary">Feature
  270. Summary</a> for a detailed comparison between the features supported by
  271. this library and the ones listed in different contract programming proposals,
  272. see <a class="link" href="boost_contract/bibliography.html" title="Bibliography">Bibliography</a> for a list
  273. of references considered during the design and implementation of this library,
  274. including the vast majority of contract programming proposals submitted to
  275. the C++ standard committee).
  276. </p>
  277. </div>
  278. <div class="footnotes">
  279. <br><hr style="width:100; text-align:left;margin-left: 0">
  280. <div id="ftn.boost_contract.f0" class="footnote"><p><a href="#boost_contract.f0" class="para"><sup class="para">[1] </sup></a>
  281. Design by Contract (DbC) is a registered trademark of the Eiffel Software company
  282. and it was first introduced by the Eiffel programming language (see <a class="link" href="boost_contract/bibliography.html#Meyer97_anchor">[Meyer97]</a>).
  283. </p></div>
  284. <div id="ftn.boost_contract.introduction.f0" class="footnote"><p><a href="#boost_contract.introduction.f0" class="para"><sup class="para">[2] </sup></a>
  285. In this example the function body is composed of a single trivial instruction
  286. <code class="computeroutput"><span class="special">++</span><span class="identifier">x</span></code>
  287. so it easy to check by visual inspection that it does not contain any bug
  288. and it will always increment <code class="computeroutput"><span class="identifier">x</span></code>
  289. by <code class="computeroutput"><span class="number">1</span></code> thus the function postcondition
  290. will never fail. In real production code, function bodies are rarely this
  291. simple and can hide bugs which make checking postconditions useful.
  292. </p></div>
  293. <div id="ftn.boost_contract.introduction.f1" class="footnote"><p><a href="#boost_contract.introduction.f1" class="para"><sup class="para">[3] </sup></a>
  294. <span class="bold"><strong>Rationale:</strong></span> The assertion failure message
  295. printed by this library follows a format similar to the message printed by
  296. Clang when the C-style <code class="computeroutput"><span class="identifier">assert</span></code>
  297. macro fails.
  298. </p></div>
  299. <div id="ftn.boost_contract.introduction.f2" class="footnote"><p><a href="#boost_contract.introduction.f2" class="para"><sup class="para">[4] </sup></a>
  300. The <code class="computeroutput"><span class="identifier">pushable</span></code> base class is
  301. used in this example just to show subcontracting, it is somewhat arbitrary
  302. and it will likely not appear in real production code.
  303. </p></div>
  304. </div>
  305. </div>
  306. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  307. <td align="left"><p><small>Last revised: December 10, 2019 at 00:23:48 GMT</small></p></td>
  308. <td align="right"><div class="copyright-footer"></div></td>
  309. </tr></table>
  310. <hr>
  311. <div class="spirit-nav"><a accesskey="n" href="boost_contract/full_table_of_contents.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
  312. </body>
  313. </html>