Imported Upstream version 4.7.2
[platform/upstream/gcc48.git] / libstdc++-v3 / doc / xml / manual / debug_mode.xml
1 <chapter xmlns="http://docbook.org/ns/docbook" version="5.0" 
2          xml:id="manual.ext.debug_mode" xreflabel="Debug Mode">
3 <?dbhtml filename="debug_mode.html"?>
4
5 <info><title>Debug Mode</title>
6   <keywordset>
7     <keyword>
8       C++
9     </keyword>
10     <keyword>
11       library
12     </keyword>
13     <keyword>
14       debug
15     </keyword>
16   </keywordset>
17 </info>
18
19
20
21 <section xml:id="manual.ext.debug_mode.intro" xreflabel="Intro"><info><title>Intro</title></info>
22   
23   <para>
24     By default, libstdc++ is built with efficiency in mind, and
25     therefore performs little or no error checking that is not
26     required by the C++ standard. This means that programs that
27     incorrectly use the C++ standard library will exhibit behavior
28     that is not portable and may not even be predictable, because they
29     tread into implementation-specific or undefined behavior. To
30     detect some of these errors before they can become problematic,
31     libstdc++ offers a debug mode that provides additional checking of
32     library facilities, and will report errors in the use of libstdc++
33     as soon as they can be detected by emitting a description of the
34     problem to standard error and aborting the program.  This debug
35     mode is available with GCC 3.4.0 and later versions.
36   </para>
37
38   <para>
39     The libstdc++ debug mode performs checking for many areas of the
40     C++ standard, but the focus is on checking interactions among
41     standard iterators, containers, and algorithms, including:
42   </para>
43
44   <itemizedlist>
45     <listitem><para><emphasis>Safe iterators</emphasis>: Iterators keep track of the
46     container whose elements they reference, so errors such as
47     incrementing a past-the-end iterator or dereferencing an iterator
48     that points to a container that has been destructed are diagnosed
49     immediately.</para></listitem>
50
51     <listitem><para><emphasis>Algorithm preconditions</emphasis>: Algorithms attempt to
52     validate their input parameters to detect errors as early as
53     possible. For instance, the <code>set_intersection</code>
54     algorithm requires that its iterator
55     parameters <code>first1</code> and <code>last1</code> form a valid
56     iterator range, and that the sequence
57     [<code>first1</code>, <code>last1</code>) is sorted according to
58     the same predicate that was passed
59     to <code>set_intersection</code>; the libstdc++ debug mode will
60     detect an error if the sequence is not sorted or was sorted by a
61     different predicate.</para></listitem>
62   </itemizedlist>
63
64 </section>
65
66 <section xml:id="manual.ext.debug_mode.semantics" xreflabel="Semantics"><info><title>Semantics</title></info>
67   
68   <para>
69   </para>
70
71 <para>A program that uses the C++ standard library correctly
72   will maintain the same semantics under debug mode as it had with
73   the normal (release) library. All functional and exception-handling
74   guarantees made by the normal library also hold for the debug mode
75   library, with one exception: performance guarantees made by the
76   normal library may not hold in the debug mode library. For
77   instance, erasing an element in a <code>std::list</code> is a
78   constant-time operation in normal library, but in debug mode it is
79   linear in the number of iterators that reference that particular
80   list. So while your (correct) program won't change its results, it
81   is likely to execute more slowly.</para>
82
83 <para>libstdc++ includes many extensions to the C++ standard library. In
84   some cases the extensions are obvious, such as the hashed
85   associative containers, whereas other extensions give predictable
86   results to behavior that would otherwise be undefined, such as
87   throwing an exception when a <code>std::basic_string</code> is
88   constructed from a NULL character pointer. This latter category also
89   includes implementation-defined and unspecified semantics, such as
90   the growth rate of a vector. Use of these extensions is not
91   considered incorrect, so code that relies on them will not be
92   rejected by debug mode. However, use of these extensions may affect
93   the portability of code to other implementations of the C++ standard
94   library, and is therefore somewhat hazardous. For this reason, the
95   libstdc++ debug mode offers a "pedantic" mode (similar to
96   GCC's <code>-pedantic</code> compiler flag) that attempts to emulate
97   the semantics guaranteed by the C++ standard. For
98   instance, constructing a <code>std::basic_string</code> with a NULL
99   character pointer would result in an exception under normal mode or
100   non-pedantic debug mode (this is a libstdc++ extension), whereas
101   under pedantic debug mode libstdc++ would signal an error. To enable
102   the pedantic debug mode, compile your program with
103   both <code>-D_GLIBCXX_DEBUG</code>
104   and <code>-D_GLIBCXX_DEBUG_PEDANTIC</code> .
105   (N.B. In GCC 3.4.x and 4.0.0, due to a bug,
106   <code>-D_GLIBXX_DEBUG_PEDANTIC</code> was also needed. The problem has
107   been fixed in GCC 4.0.1 and later versions.) </para>
108
109 <para>The following library components provide extra debugging
110   capabilities in debug mode:</para>
111 <itemizedlist>
112   <listitem><para><code>std::basic_string</code> (no safe iterators and see note below)</para></listitem>
113   <listitem><para><code>std::bitset</code></para></listitem>
114   <listitem><para><code>std::deque</code></para></listitem>
115   <listitem><para><code>std::list</code></para></listitem>
116   <listitem><para><code>std::map</code></para></listitem>
117   <listitem><para><code>std::multimap</code></para></listitem>
118   <listitem><para><code>std::multiset</code></para></listitem>
119   <listitem><para><code>std::set</code></para></listitem>
120   <listitem><para><code>std::vector</code></para></listitem>
121   <listitem><para><code>std::unordered_map</code></para></listitem>
122   <listitem><para><code>std::unordered_multimap</code></para></listitem>
123   <listitem><para><code>std::unordered_set</code></para></listitem>
124   <listitem><para><code>std::unordered_multiset</code></para></listitem>
125 </itemizedlist>
126
127 <para>N.B. although there are precondition checks for some string operations,
128 e.g.  <code>operator[]</code>,
129 they will not always be run when using the <code>char</code> and
130 <code>wchar_t</code> specialisations (<code>std::string</code> and
131 <code>std::wstring</code>).  This is because libstdc++ uses GCC's
132 <code>extern template</code> extension to provide explicit instantiations
133 of <code>std::string</code> and <code>std::wstring</code>, and those
134 explicit instantiations don't include the debug-mode checks.  If the
135 containing functions are inlined then the checks will run, so compiling
136 with <code>-O1</code> might be enough to enable them.  Alternatively
137 <code>-D_GLIBCXX_EXTERN_TEMPLATE=0</code> will suppress the declarations
138 of the explicit instantiations and cause the functions to be instantiated
139 with the debug-mode checks included, but this is unsupported and not
140 guaranteed to work.  For full debug-mode support you can use the
141 <code>__gnu_debug::basic_string</code> debugging container directly,
142 which always works correctly.
143 </para>
144
145 </section>
146
147 <section xml:id="manual.ext.debug_mode.using" xreflabel="Using"><info><title>Using</title></info>
148   
149   <para>
150   </para>
151 <section xml:id="debug_mode.using.mode" xreflabel="Using Mode"><info><title>Using the Debug Mode</title></info>
152   
153
154 <para>To use the libstdc++ debug mode, compile your application with the
155   compiler flag <code>-D_GLIBCXX_DEBUG</code>. Note that this flag
156   changes the sizes and behavior of standard class templates such
157   as <code>std::vector</code>, and therefore you can only link code
158   compiled with debug mode and code compiled without debug mode if no
159   instantiation of a container is passed between the two translation
160   units.</para>
161
162 <para>By default, error messages are formatted to fit on lines of about
163   78 characters.  The environment variable
164   <code>GLIBCXX_DEBUG_MESSAGE_LENGTH</code> can be used to request a
165   different length.</para>
166
167 </section>
168
169 <section xml:id="debug_mode.using.specific" xreflabel="Using Specific"><info><title>Using a Specific Debug Container</title></info>
170   
171 <para>When it is not feasible to recompile your entire application, or
172   only specific containers need checking, debugging containers are
173   available as GNU extensions. These debugging containers are
174   functionally equivalent to the standard drop-in containers used in
175   debug mode, but they are available in a separate namespace as GNU
176   extensions and may be used in programs compiled with either release
177   mode or with debug mode. The
178   following table provides the names and headers of the debugging
179   containers:
180 </para>
181
182 <table frame="all">
183 <title>Debugging Containers</title>
184
185 <tgroup cols="4" align="left" colsep="1" rowsep="1">
186 <colspec colname="c1"/>
187 <colspec colname="c2"/>
188 <colspec colname="c3"/>
189 <colspec colname="c4"/>
190
191 <thead>
192   <row>
193     <entry>Container</entry>
194     <entry>Header</entry>
195     <entry>Debug container</entry>
196     <entry>Debug header</entry>
197   </row>
198 </thead>
199 <tbody>
200   <row>
201     <entry><classname>std::bitset</classname></entry>
202     <entry><filename class="headerfile">bitset</filename></entry>
203     <entry><classname>__gnu_debug::bitset</classname></entry>
204     <entry><filename class="headerfile">&lt;debug/bitset&gt;</filename></entry>
205   </row>
206   <row>
207     <entry><classname>std::deque</classname></entry>
208     <entry><filename class="headerfile">deque</filename></entry>
209     <entry><classname>__gnu_debug::deque</classname></entry>
210     <entry><filename class="headerfile">&lt;debug/deque&gt;</filename></entry>
211   </row>
212   <row>
213     <entry><classname>std::list</classname></entry>
214     <entry><filename class="headerfile">list</filename></entry>
215     <entry><classname>__gnu_debug::list</classname></entry>
216     <entry><filename class="headerfile">&lt;debug/list&gt;</filename></entry>
217   </row>
218   <row>
219     <entry><classname>std::map</classname></entry>
220     <entry><filename class="headerfile">map</filename></entry>
221     <entry><classname>__gnu_debug::map</classname></entry>
222     <entry><filename class="headerfile">&lt;debug/map&gt;</filename></entry>
223   </row>
224   <row>
225     <entry><classname>std::multimap</classname></entry>
226     <entry><filename class="headerfile">map</filename></entry>
227     <entry><classname>__gnu_debug::multimap</classname></entry>
228     <entry><filename class="headerfile">&lt;debug/map&gt;</filename></entry>
229   </row>
230   <row>
231     <entry><classname>std::multiset</classname></entry>
232     <entry><filename class="headerfile">set</filename></entry>
233     <entry><classname>__gnu_debug::multiset</classname></entry>
234     <entry><filename class="headerfile">&lt;debug/set&gt;</filename></entry>
235   </row>
236   <row>
237     <entry><classname>std::set</classname></entry>
238     <entry><filename class="headerfile">set</filename></entry>
239     <entry><classname>__gnu_debug::set</classname></entry>
240     <entry><filename class="headerfile">&lt;debug/set&gt;</filename></entry>
241   </row>
242   <row>
243     <entry><classname>std::string</classname></entry>
244     <entry><filename class="headerfile">string</filename></entry>
245     <entry><classname>__gnu_debug::string</classname></entry>
246     <entry><filename class="headerfile">&lt;debug/string&gt;</filename></entry>
247   </row>
248   <row>
249     <entry><classname>std::wstring</classname></entry>
250     <entry><filename class="headerfile">string</filename></entry>
251     <entry><classname>__gnu_debug::wstring</classname></entry>
252     <entry><filename class="headerfile">&lt;debug/string&gt;</filename></entry>
253   </row>
254   <row>
255     <entry><classname>std::basic_string</classname></entry>
256     <entry><filename class="headerfile">string</filename></entry>
257     <entry><classname>__gnu_debug::basic_string</classname></entry>
258     <entry><filename class="headerfile">&lt;debug/string&gt;</filename></entry>
259   </row>
260   <row>
261     <entry><classname>std::vector</classname></entry>
262     <entry><filename class="headerfile">vector</filename></entry>
263     <entry><classname>__gnu_debug::vector</classname></entry>
264     <entry><filename class="headerfile">&lt;debug/vector&gt;</filename></entry>
265   </row>
266 </tbody>
267 </tgroup>
268 </table>
269
270 <para>In addition, when compiling in C++11 mode, these additional
271 containers have additional debug capability.
272 </para>
273
274 <table frame="all">
275 <title>Debugging Containers C++11</title>
276
277 <tgroup cols="4" align="left" colsep="1" rowsep="1">
278 <colspec colname="c1"/>
279 <colspec colname="c2"/>
280 <colspec colname="c3"/>
281 <colspec colname="c4"/>
282
283 <thead>
284   <row>
285     <entry>Container</entry>
286     <entry>Header</entry>
287     <entry>Debug container</entry>
288     <entry>Debug header</entry>
289   </row>
290 </thead>
291 <tbody>
292     <row>
293     <entry><classname>std::unordered_map</classname></entry>
294     <entry><filename class="headerfile">unordered_map</filename></entry>
295     <entry><classname>__gnu_debug::unordered_map</classname></entry>
296     <entry><filename class="headerfile">&lt;debug/unordered_map&gt;</filename></entry>
297   </row>
298   <row>
299     <entry><classname>std::unordered_multimap</classname></entry>
300     <entry><filename class="headerfile">unordered_map</filename></entry>
301     <entry><classname>__gnu_debug::unordered_multimap</classname></entry>
302     <entry><filename class="headerfile">&lt;debug/unordered_map&gt;</filename></entry>
303   </row>
304   <row>
305     <entry><classname>std::unordered_set</classname></entry>
306     <entry><filename class="headerfile">unordered_set</filename></entry>
307     <entry><classname>__gnu_debug::unordered_set</classname></entry>
308     <entry><filename class="headerfile">&lt;debug/unordered_set&gt;</filename></entry>
309   </row>
310   <row>
311     <entry><classname>std::unordered_multiset</classname></entry>
312     <entry><filename class="headerfile">unordered_set</filename></entry>
313     <entry><classname>__gnu_debug::unordered_multiset</classname></entry>
314     <entry><filename class="headerfile">&lt;debug/unordered_set&gt;</filename></entry>
315   </row>
316 </tbody>
317 </tgroup>
318 </table>
319 </section>
320 </section>
321
322 <section xml:id="manual.ext.debug_mode.design" xreflabel="Design"><info><title>Design</title></info>
323   
324   <para>
325   </para>
326   <section xml:id="debug_mode.design.goals" xreflabel="Goals"><info><title>Goals</title></info>
327     
328     <para>
329     </para>
330 <para> The libstdc++ debug mode replaces unsafe (but efficient) standard
331   containers and iterators with semantically equivalent safe standard
332   containers and iterators to aid in debugging user programs. The
333   following goals directed the design of the libstdc++ debug mode:</para>
334
335   <itemizedlist>
336
337     <listitem><para><emphasis>Correctness</emphasis>: the libstdc++ debug mode must not change
338     the semantics of the standard library for all cases specified in
339     the ANSI/ISO C++ standard. The essence of this constraint is that
340     any valid C++ program should behave in the same manner regardless
341     of whether it is compiled with debug mode or release mode. In
342     particular, entities that are defined in namespace std in release
343     mode should remain defined in namespace std in debug mode, so that
344     legal specializations of namespace std entities will remain
345     valid. A program that is not valid C++ (e.g., invokes undefined
346     behavior) is not required to behave similarly, although the debug
347     mode will abort with a diagnostic when it detects undefined
348     behavior.</para></listitem>
349
350     <listitem><para><emphasis>Performance</emphasis>: the additional of the libstdc++ debug mode
351     must not affect the performance of the library when it is compiled
352     in release mode. Performance of the libstdc++ debug mode is
353     secondary (and, in fact, will be worse than the release
354     mode).</para></listitem>
355
356     <listitem><para><emphasis>Usability</emphasis>: the libstdc++ debug mode should be easy to
357     use. It should be easily incorporated into the user's development
358     environment (e.g., by requiring only a single new compiler switch)
359     and should produce reasonable diagnostics when it detects a
360     problem with the user program. Usability also involves detection
361     of errors when using the debug mode incorrectly, e.g., by linking
362     a release-compiled object against a debug-compiled object if in
363     fact the resulting program will not run correctly.</para></listitem>
364
365     <listitem><para><emphasis>Minimize recompilation</emphasis>: While it is expected that
366     users recompile at least part of their program to use debug
367     mode, the amount of recompilation affects the
368     detect-compile-debug turnaround time. This indirectly affects the
369     usefulness of the debug mode, because debugging some applications
370     may require rebuilding a large amount of code, which may not be
371     feasible when the suspect code may be very localized. There are
372     several levels of conformance to this requirement, each with its
373     own usability and implementation characteristics. In general, the
374     higher-numbered conformance levels are more usable (i.e., require
375     less recompilation) but are more complicated to implement than
376     the lower-numbered conformance levels.
377       <orderedlist inheritnum="ignore" continuation="restarts">
378         <listitem><para><emphasis>Full recompilation</emphasis>: The user must recompile his or
379         her entire application and all C++ libraries it depends on,
380         including the C++ standard library that ships with the
381         compiler. This must be done even if only a small part of the
382         program can use debugging features.</para></listitem>
383
384         <listitem><para><emphasis>Full user recompilation</emphasis>: The user must recompile
385         his or her entire application and all C++ libraries it depends
386         on, but not the C++ standard library itself. This must be done
387         even if only a small part of the program can use debugging
388         features. This can be achieved given a full recompilation
389         system by compiling two versions of the standard library when
390         the compiler is installed and linking against the appropriate
391         one, e.g., a multilibs approach.</para></listitem>
392
393         <listitem><para><emphasis>Partial recompilation</emphasis>: The user must recompile the
394         parts of his or her application and the C++ libraries it
395         depends on that will use the debugging facilities
396         directly. This means that any code that uses the debuggable
397         standard containers would need to be recompiled, but code
398         that does not use them (but may, for instance, use IOStreams)
399         would not have to be recompiled.</para></listitem>
400
401         <listitem><para><emphasis>Per-use recompilation</emphasis>: The user must recompile the
402         parts of his or her application and the C++ libraries it
403         depends on where debugging should occur, and any other code
404         that interacts with those containers. This means that a set of
405         translation units that accesses a particular standard
406         container instance may either be compiled in release mode (no
407         checking) or debug mode (full checking), but must all be
408         compiled in the same way; a translation unit that does not see
409         that standard container instance need not be recompiled. This
410         also means that a translation unit <emphasis>A</emphasis> that contains a
411         particular instantiation
412         (say, <code>std::vector&lt;int&gt;</code>) compiled in release
413         mode can be linked against a translation unit <emphasis>B</emphasis> that
414         contains the same instantiation compiled in debug mode (a
415         feature not present with partial recompilation). While this
416         behavior is technically a violation of the One Definition
417         Rule, this ability tends to be very important in
418         practice. The libstdc++ debug mode supports this level of
419         recompilation. </para></listitem>
420
421         <listitem><para><emphasis>Per-unit recompilation</emphasis>: The user must only
422         recompile the translation units where checking should occur,
423         regardless of where debuggable standard containers are
424         used. This has also been dubbed "<code>-g</code> mode",
425         because the <code>-g</code> compiler switch works in this way,
426         emitting debugging information at a per--translation-unit
427         granularity. We believe that this level of recompilation is in
428         fact not possible if we intend to supply safe iterators, leave
429         the program semantics unchanged, and not regress in
430         performance under release mode because we cannot associate
431         extra information with an iterator (to form a safe iterator)
432         without either reserving that space in release mode
433         (performance regression) or allocating extra memory associated
434         with each iterator with <code>new</code> (changes the program
435         semantics).</para></listitem>
436       </orderedlist>
437     </para></listitem>
438   </itemizedlist>
439   </section>
440
441   <section xml:id="debug_mode.design.methods" xreflabel="Methods"><info><title>Methods</title></info>
442     
443     <para>
444     </para>
445 <para>This section provides an overall view of the design of the
446   libstdc++ debug mode and details the relationship between design
447   decisions and the stated design goals.</para>
448
449   <section xml:id="debug_mode.design.methods.wrappers" xreflabel="Method Wrapper"><info><title>The Wrapper Model</title></info>
450     
451 <para>The libstdc++ debug mode uses a wrapper model where the
452   debugging versions of library components (e.g., iterators and
453   containers) form a layer on top of the release versions of the
454   library components. The debugging components first verify that the
455   operation is correct (aborting with a diagnostic if an error is
456   found) and will then forward to the underlying release-mode
457   container that will perform the actual work. This design decision
458   ensures that we cannot regress release-mode performance (because the
459   release-mode containers are left untouched) and partially
460   enables <link linkend="methods.coexistence.link">mixing debug and
461   release code</link> at link time, although that will not be
462   discussed at this time.</para>
463
464 <para>Two types of wrappers are used in the implementation of the debug
465   mode: container wrappers and iterator wrappers. The two types of
466   wrappers interact to maintain relationships between iterators and
467   their associated containers, which are necessary to detect certain
468   types of standard library usage errors such as dereferencing
469   past-the-end iterators or inserting into a container using an
470   iterator from a different container.</para>
471
472   <section xml:id="debug_mode.design.methods.safe_iter" xreflabel="Method Safe Iter"><info><title>Safe Iterators</title></info>
473     
474 <para>Iterator wrappers provide a debugging layer over any iterator that
475   is attached to a particular container, and will manage the
476   information detailing the iterator's state (singular,
477   dereferenceable, etc.) and tracking the container to which the
478   iterator is attached. Because iterators have a well-defined, common
479   interface the iterator wrapper is implemented with the iterator
480   adaptor class template <code>__gnu_debug::_Safe_iterator</code>,
481   which takes two template parameters:</para>
482
483 <itemizedlist>
484   <listitem><para><code>Iterator</code>: The underlying iterator type, which must
485     be either the <code>iterator</code> or <code>const_iterator</code>
486     typedef from the sequence type this iterator can reference.</para></listitem>
487
488   <listitem><para><code>Sequence</code>: The type of sequence that this iterator
489   references. This sequence must be a safe sequence (discussed below)
490   whose <code>iterator</code> or <code>const_iterator</code> typedef
491   is the type of the safe iterator.</para></listitem>
492 </itemizedlist>
493   </section>
494
495   <section xml:id="debug_mode.design.methods.safe_seq" xreflabel="Method Safe Seq"><info><title>Safe Sequences (Containers)</title></info>
496     
497
498 <para>Container wrappers provide a debugging layer over a particular
499   container type. Because containers vary greatly in the member
500   functions they support and the semantics of those member functions
501   (especially in the area of iterator invalidation), container
502   wrappers are tailored to the container they reference, e.g., the
503   debugging version of <code>std::list</code> duplicates the entire
504   interface of <code>std::list</code>, adding additional semantic
505   checks and then forwarding operations to the
506   real <code>std::list</code> (a public base class of the debugging
507   version) as appropriate. However, all safe containers inherit from
508   the class template <code>__gnu_debug::_Safe_sequence</code>,
509   instantiated with the type of the safe container itself (an instance
510   of the curiously recurring template pattern).</para>
511
512 <para>The iterators of a container wrapper will be
513   <link linkend="debug_mode.design.methods.safe_iter">safe
514   iterators</link> that reference sequences of this type and wrap the
515   iterators provided by the release-mode base class. The debugging
516   container will use only the safe iterators within its own interface
517   (therefore requiring the user to use safe iterators, although this
518   does not change correct user code) and will communicate with the
519   release-mode base class with only the underlying, unsafe,
520   release-mode iterators that the base class exports.</para>
521
522 <para> The debugging version of <code>std::list</code> will have the
523   following basic structure:</para>
524
525 <programlisting>
526 template&lt;typename _Tp, typename _Allocator = allocator&lt;_Tp&gt;
527   class debug-list :
528     public release-list&lt;_Tp, _Allocator&gt;,
529     public __gnu_debug::_Safe_sequence&lt;debug-list&lt;_Tp, _Allocator&gt; &gt;
530   {
531     typedef release-list&lt;_Tp, _Allocator&gt; _Base;
532     typedef debug-list&lt;_Tp, _Allocator&gt;   _Self;
533
534   public:
535     typedef __gnu_debug::_Safe_iterator&lt;typename _Base::iterator, _Self&gt;       iterator;
536     typedef __gnu_debug::_Safe_iterator&lt;typename _Base::const_iterator, _Self&gt; const_iterator;
537
538     // duplicate std::list interface with debugging semantics
539   };
540 </programlisting>
541   </section>
542   </section>
543
544   <section xml:id="debug_mode.design.methods.precond" xreflabel="Precondition check"><info><title>Precondition Checking</title></info>
545     
546 <para>The debug mode operates primarily by checking the preconditions of
547   all standard library operations that it supports. Preconditions that
548   are always checked (regardless of whether or not we are in debug
549   mode) are checked via the <code>__check_xxx</code> macros defined
550   and documented in the source
551   file <code>include/debug/debug.h</code>. Preconditions that may or
552   may not be checked, depending on the debug-mode
553   macro <code>_GLIBCXX_DEBUG</code>, are checked via
554   the <code>__requires_xxx</code> macros defined and documented in the
555   same source file. Preconditions are validated using any additional
556   information available at run-time, e.g., the containers that are
557   associated with a particular iterator, the position of the iterator
558   within those containers, the distance between two iterators that may
559   form a valid range, etc. In the absence of suitable information,
560   e.g., an input iterator that is not a safe iterator, these
561   precondition checks will silently succeed.</para>
562
563 <para>The majority of precondition checks use the aforementioned macros,
564   which have the secondary benefit of having prewritten debug
565   messages that use information about the current status of the
566   objects involved (e.g., whether an iterator is singular or what
567   sequence it is attached to) along with some static information
568   (e.g., the names of the function parameters corresponding to the
569   objects involved). When not using these macros, the debug mode uses
570   either the debug-mode assertion
571   macro <code>_GLIBCXX_DEBUG_ASSERT</code> , its pedantic
572   cousin <code>_GLIBCXX_DEBUG_PEDASSERT</code>, or the assertion
573   check macro that supports more advance formulation of error
574   messages, <code>_GLIBCXX_DEBUG_VERIFY</code>. These macros are
575   documented more thoroughly in the debug mode source code.</para>
576   </section>
577
578   <section xml:id="debug_mode.design.methods.coexistence" xreflabel="Coexistence"><info><title>Release- and debug-mode coexistence</title></info>
579     
580 <para>The libstdc++ debug mode is the first debug mode we know of that
581   is able to provide the "Per-use recompilation" (4) guarantee, that
582   allows release-compiled and debug-compiled code to be linked and
583   executed together without causing unpredictable behavior. This
584   guarantee minimizes the recompilation that users are required to
585   perform, shortening the detect-compile-debug bug hunting cycle
586   and making the debug mode easier to incorporate into development
587   environments by minimizing dependencies.</para>
588
589 <para>Achieving link- and run-time coexistence is not a trivial
590   implementation task. To achieve this goal we required a small
591   extension to the GNU C++ compiler (since incorporated into the C++11 language specification, described in the GCC Manual for the C++ language as
592   <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/onlinedocs/gcc/Namespace-Association.html#Namespace-Association">namespace
593   association</link>), and a complex organization of debug- and
594   release-modes. The end result is that we have achieved per-use
595   recompilation but have had to give up some checking of the
596   <code>std::basic_string</code> class template (namely, safe
597   iterators).
598 </para>
599
600  <section xml:id="methods.coexistence.compile" xreflabel="Compile"><info><title>Compile-time coexistence of release- and debug-mode components</title></info>
601    
602
603 <para>Both the release-mode components and the debug-mode
604   components need to exist within a single translation unit so that
605   the debug versions can wrap the release versions. However, only one
606   of these components should be user-visible at any particular
607   time with the standard name, e.g., <code>std::list</code>. </para>
608
609 <para>In release mode, we define only the release-mode version of the
610   component with its standard name and do not include the debugging
611   component at all. The release mode version is defined within the
612   namespace <code>std</code>. Minus the namespace associations, this
613   method leaves the behavior of release mode completely unchanged from
614   its behavior prior to the introduction of the libstdc++ debug
615   mode. Here's an example of what this ends up looking like, in
616   C++.</para>
617
618 <programlisting>
619 namespace std
620 {
621   template&lt;typename _Tp, typename _Alloc = allocator&lt;_Tp&gt; &gt;
622     class list
623     {
624       // ...
625      };
626 } // namespace std
627 </programlisting>
628
629 <para>In debug mode we include the release-mode container (which is now
630 defined in the namespace <code>__cxx1998</code>) and also the
631 debug-mode container. The debug-mode container is defined within the
632 namespace <code>__debug</code>, which is associated with namespace
633 <code>std</code> via the C++11 namespace association language feature.  This
634 method allows the debug and release versions of the same component to
635 coexist at compile-time and link-time without causing an unreasonable
636 maintenance burden, while minimizing confusion. Again, this boils down
637 to C++ code as follows:</para>
638
639 <programlisting>
640 namespace std
641 {
642   namespace __cxx1998
643   {
644     template&lt;typename _Tp, typename _Alloc = allocator&lt;_Tp&gt; &gt;
645       class list
646       {
647         // ...
648       };
649   } // namespace __gnu_norm
650
651   namespace __debug
652   {
653     template&lt;typename _Tp, typename _Alloc = allocator&lt;_Tp&gt; &gt;
654       class list
655       : public __cxx1998::list&lt;_Tp, _Alloc&gt;,
656         public __gnu_debug::_Safe_sequence&lt;list&lt;_Tp, _Alloc&gt; &gt;
657       {
658         // ...
659       };
660   } // namespace __cxx1998
661
662   // namespace __debug __attribute__ ((strong));
663   inline namespace __debug { }
664 }
665 </programlisting>
666  </section>
667
668  <section xml:id="methods.coexistence.link" xreflabel="Link"><info><title>Link- and run-time coexistence of release- and
669     debug-mode components</title></info>
670    
671
672 <para>Because each component has a distinct and separate release and
673 debug implementation, there is no issue with link-time
674 coexistence: the separate namespaces result in different mangled
675 names, and thus unique linkage.</para>
676
677 <para>However, components that are defined and used within the C++
678 standard library itself face additional constraints. For instance,
679 some of the member functions of <code> std::moneypunct</code> return
680 <code>std::basic_string</code>. Normally, this is not a problem, but
681 with a mixed mode standard library that could be using either
682 debug-mode or release-mode <code> basic_string</code> objects, things
683 get more complicated.  As the return value of a function is not
684 encoded into the mangled name, there is no way to specify a
685 release-mode or a debug-mode string. In practice, this results in
686 runtime errors. A simplified example of this problem is as follows.
687 </para>
688
689 <para> Take this translation unit, compiled in debug-mode: </para>
690 <programlisting>
691 // -D_GLIBCXX_DEBUG
692 #include &lt;string&gt;
693
694 std::string test02();
695
696 std::string test01()
697 {
698   return test02();
699 }
700
701 int main()
702 {
703   test01();
704   return 0;
705 }
706 </programlisting>
707
708 <para> ... and linked to this translation unit, compiled in release mode:</para>
709
710 <programlisting>
711 #include &lt;string&gt;
712
713 std::string
714 test02()
715 {
716   return std::string("toast");
717 }
718 </programlisting>
719
720 <para> For this reason we cannot easily provide safe iterators for
721   the <code>std::basic_string</code> class template, as it is present
722   throughout the C++ standard library. For instance, locale facets
723   define typedefs that include <code>basic_string</code>: in a mixed
724   debug/release program, should that typedef be based on the
725   debug-mode <code>basic_string</code> or the
726   release-mode <code>basic_string</code>? While the answer could be
727   "both", and the difference hidden via renaming a la the
728   debug/release containers, we must note two things about locale
729   facets:</para>
730
731 <orderedlist inheritnum="ignore" continuation="restarts">
732   <listitem><para>They exist as shared state: one can create a facet in one
733   translation unit and access the facet via the same type name in a
734   different translation unit. This means that we cannot have two
735   different versions of locale facets, because the types would not be
736   the same across debug/release-mode translation unit barriers.</para></listitem>
737
738   <listitem><para>They have virtual functions returning strings: these functions
739   mangle in the same way regardless of the mangling of their return
740   types (see above), and their precise signatures can be relied upon
741   by users because they may be overridden in derived classes.</para></listitem>
742 </orderedlist>
743
744 <para>With the design of libstdc++ debug mode, we cannot effectively hide
745   the differences between debug and release-mode strings from the
746   user. Failure to hide the differences may result in unpredictable
747   behavior, and for this reason we have opted to only
748   perform <code>basic_string</code> changes that do not require ABI
749   changes. The effect on users is expected to be minimal, as there are
750   simple alternatives (e.g., <code>__gnu_debug::basic_string</code>),
751   and the usability benefit we gain from the ability to mix debug- and
752   release-compiled translation units is enormous.</para>
753  </section>
754
755  <section xml:id="methods.coexistence.alt" xreflabel="Alternatives"><info><title>Alternatives for Coexistence</title></info>
756
757
758 <para>The coexistence scheme above was chosen over many alternatives,
759   including language-only solutions and solutions that also required
760   extensions to the C++ front end. The following is a partial list of
761   solutions, with justifications for our rejection of each.</para>
762
763 <itemizedlist>
764   <listitem><para><emphasis>Completely separate debug/release libraries</emphasis>: This is by
765   far the simplest implementation option, where we do not allow any
766   coexistence of debug- and release-compiled translation units in a
767   program. This solution has an extreme negative affect on usability,
768   because it is quite likely that some libraries an application
769   depends on cannot be recompiled easily. This would not meet
770   our <emphasis>usability</emphasis> or <emphasis>minimize recompilation</emphasis> criteria
771   well.</para></listitem>
772
773   <listitem><para><emphasis>Add a <code>Debug</code> boolean template parameter</emphasis>:
774   Partial specialization could be used to select the debug
775   implementation when <code>Debug == true</code>, and the state
776   of <code>_GLIBCXX_DEBUG</code> could decide whether the
777   default <code>Debug</code> argument is <code>true</code>
778   or <code>false</code>. This option would break conformance with the
779   C++ standard in both debug <emphasis>and</emphasis> release modes. This would
780   not meet our <emphasis>correctness</emphasis> criteria. </para></listitem>
781
782   <listitem><para><emphasis>Packaging a debug flag in the allocators</emphasis>: We could
783     reuse the <code>Allocator</code> template parameter of containers
784     by adding a sentinel wrapper <code>debug&lt;&gt;</code> that
785     signals the user's intention to use debugging, and pick up
786     the <code>debug&lt;&gt;</code> allocator wrapper in a partial
787     specialization. However, this has two drawbacks: first, there is a
788     conformance issue because the default allocator would not be the
789     standard-specified <code>std::allocator&lt;T&gt;</code>. Secondly
790     (and more importantly), users that specify allocators instead of
791     implicitly using the default allocator would not get debugging
792     containers. Thus this solution fails the <emphasis>correctness</emphasis>
793     criteria.</para></listitem>
794
795   <listitem><para><emphasis>Define debug containers in another namespace, and employ
796       a <code>using</code> declaration (or directive)</emphasis>: This is an
797       enticing option, because it would eliminate the need for
798       the <code>link_name</code> extension by aliasing the
799       templates. However, there is no true template aliasing mechanism
800       in C++, because both <code>using</code> directives and using
801       declarations disallow specialization. This method fails
802       the <emphasis>correctness</emphasis> criteria.</para></listitem>
803
804   <listitem><para><emphasis> Use implementation-specific properties of anonymous
805     namespaces. </emphasis>
806     See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2003-08/msg00004.html"> this post
807     </link>
808     This method fails the <emphasis>correctness</emphasis> criteria.</para></listitem>
809
810   <listitem><para><emphasis>Extension: allow reopening on namespaces</emphasis>: This would
811     allow the debug mode to effectively alias the
812     namespace <code>std</code> to an internal namespace, such
813     as <code>__gnu_std_debug</code>, so that it is completely
814     separate from the release-mode <code>std</code> namespace. While
815     this will solve some renaming problems and ensure that
816     debug- and release-compiled code cannot be mixed unsafely, it ensures that
817     debug- and release-compiled code cannot be mixed at all. For
818     instance, the program would have two <code>std::cout</code>
819     objects! This solution would fails the <emphasis>minimize
820     recompilation</emphasis> requirement, because we would only be able to
821     support option (1) or (2).</para></listitem>
822
823   <listitem><para><emphasis>Extension: use link name</emphasis>: This option involves
824     complicated re-naming between debug-mode and release-mode
825     components at compile time, and then a g++ extension called <emphasis>
826     link name </emphasis> to recover the original names at link time. There
827     are two drawbacks to this approach. One, it's very verbose,
828     relying on macro renaming at compile time and several levels of
829     include ordering. Two, ODR issues remained with container member
830     functions taking no arguments in mixed-mode settings resulting in
831     equivalent link names, <code> vector::push_back() </code> being
832     one example.
833     See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2003-08/msg00177.html">link
834     name</link> </para></listitem>
835 </itemizedlist>
836
837 <para>Other options may exist for implementing the debug mode, many of
838   which have probably been considered and others that may still be
839   lurking. This list may be expanded over time to include other
840   options that we could have implemented, but in all cases the full
841   ramifications of the approach (as measured against the design goals
842   for a libstdc++ debug mode) should be considered first. The DejaGNU
843   testsuite includes some testcases that check for known problems with
844   some solutions (e.g., the <code>using</code> declaration solution
845   that breaks user specialization), and additional testcases will be
846   added as we are able to identify other typical problem cases. These
847   test cases will serve as a benchmark by which we can compare debug
848   mode implementations.</para>
849  </section>
850   </section>
851   </section>
852
853   <section xml:id="debug_mode.design.other" xreflabel="Other"><info><title>Other Implementations</title></info>
854     
855     <para>
856     </para>
857 <para> There are several existing implementations of debug modes for C++
858   standard library implementations, although none of them directly
859   supports debugging for programs using libstdc++. The existing
860   implementations include:</para>
861 <itemizedlist>
862   <listitem><para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.mathcs.sjsu.edu/faculty/horstman/safestl.html">SafeSTL</link>:
863   SafeSTL was the original debugging version of the Standard Template
864   Library (STL), implemented by Cay S. Horstmann on top of the
865   Hewlett-Packard STL. Though it inspired much work in this area, it
866   has not been kept up-to-date for use with modern compilers or C++
867   standard library implementations.</para></listitem>
868
869   <listitem><para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.stlport.org/">STLport</link>: STLport is a free
870   implementation of the C++ standard library derived from the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.sgi.com/tech/stl/">SGI implementation</link>, and
871   ported to many other platforms. It includes a debug mode that uses a
872   wrapper model (that in some ways inspired the libstdc++ debug mode
873   design), although at the time of this writing the debug mode is
874   somewhat incomplete and meets only the "Full user recompilation" (2)
875   recompilation guarantee by requiring the user to link against a
876   different library in debug mode vs. release mode.</para></listitem>
877
878   <listitem><para>Metrowerks CodeWarrior: The C++ standard library
879   that ships with Metrowerks CodeWarrior includes a debug mode. It is
880   a full debug-mode implementation (including debugging for
881   CodeWarrior extensions) and is easy to use, although it meets only
882   the "Full recompilation" (1) recompilation
883   guarantee.</para></listitem>
884 </itemizedlist>
885
886   </section>
887 </section>
888
889 </chapter>