libstdc++: Enable _GLIBCXX_ASSERTIONS by default for -O0 [PR112808]

Too many users don't know about -D_GLIBCXX_ASSERTIONS and so are missing
valuable checks for C++ standard library preconditions. This change
enables libstdc++ assertions by default when compiling with -O0 so that
we diagnose more bugs by default.

When users enable optimization we don't add the assertions by default
(because they have non-zero overhead) so they still need to enable them
manually.

For users who really don't want the assertions even in unoptimized
builds, defining _GLIBCXX_NO_ASSERTIONS will prevent them from being
enabled automatically.

libstdc++-v3/ChangeLog:

	PR libstdc++/112808
	* doc/xml/manual/using.xml (_GLIBCXX_ASSERTIONS): Document
	implicit definition for -O0 compilation.
	(_GLIBCXX_NO_ASSERTIONS): Document.
	* doc/html/manual/using_macros.html: Regenerate.
	* include/bits/c++config [!__OPTIMIZE__] (_GLIBCXX_ASSERTIONS):
	Define for unoptimized builds.
This commit is contained in:
Jonathan Wakely 2024-09-26 16:55:07 +01:00 committed by Jonathan Wakely
parent 6ce1df379a
commit 361d230fd7
No known key found for this signature in database
3 changed files with 29 additions and 8 deletions

View File

@ -82,9 +82,15 @@
This is described in more detail in
<a class="link" href="ext_compile_checks.html" title="Chapter 16. Compile Time Checks">Compile Time Checks</a>.
</p></dd><dt><span class="term"><code class="code">_GLIBCXX_ASSERTIONS</code></span></dt><dd><p>
Undefined by default. When defined, enables extra error checking in
the form of precondition assertions, such as bounds checking in
strings and null pointer checks when dereferencing smart pointers.
Defined by default when compiling with no optimization, undefined
by default when compiling with optimization.
When defined, enables extra error checking in the form of
precondition assertions, such as bounds checking in strings
and null pointer checks when dereferencing smart pointers.
</p></dd><dt><span class="term"><code class="code">_GLIBCXX_NO_ASSERTIONS</code></span></dt><dd><p>
Undefined by default. When defined, prevents the implicit
definition of <code class="code">_GLIBCXX_ASSERTIONS</code> when compiling
with no optimization.
</p></dd><dt><span class="term"><code class="code">_GLIBCXX_DEBUG</code></span></dt><dd><p>
Undefined by default. When defined, compiles user code using
the <a class="link" href="debug_mode.html" title="Chapter 17. Debug Mode">debug mode</a>.

View File

@ -1247,9 +1247,19 @@ g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe
<varlistentry><term><code>_GLIBCXX_ASSERTIONS</code></term>
<listitem>
<para>
Undefined by default. When defined, enables extra error checking in
the form of precondition assertions, such as bounds checking in
strings and null pointer checks when dereferencing smart pointers.
Defined by default when compiling with no optimization, undefined
by default when compiling with optimization.
When defined, enables extra error checking in the form of
precondition assertions, such as bounds checking in strings
and null pointer checks when dereferencing smart pointers.
</para>
</listitem></varlistentry>
<varlistentry><term><code>_GLIBCXX_NO_ASSERTIONS</code></term>
<listitem>
<para>
Undefined by default. When defined, prevents the implicit
definition of <code>_GLIBCXX_ASSERTIONS</code> when compiling
with no optimization.
</para>
</listitem></varlistentry>
<varlistentry><term><code>_GLIBCXX_DEBUG</code></term>

View File

@ -586,9 +586,14 @@ namespace std
#pragma GCC visibility pop
}
#ifndef _GLIBCXX_ASSERTIONS
# if defined(_GLIBCXX_DEBUG)
// Debug Mode implies checking assertions.
#if defined(_GLIBCXX_DEBUG) && !defined(_GLIBCXX_ASSERTIONS)
# define _GLIBCXX_ASSERTIONS 1
# define _GLIBCXX_ASSERTIONS 1
# elif ! defined(__OPTIMIZE__) && ! defined(_GLIBCXX_NO_ASSERTIONS)
// Enable assertions for unoptimized builds.
# define _GLIBCXX_ASSERTIONS 1
# endif
#endif
// Disable std::string explicit instantiation declarations in order to assert.