On Wed, 2 Oct 2024, Jonathan Wakely wrote: > I think we should do this. > > Tested x86_64-linux. > > -- >8 -- > > 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.
LGTM. At -O0 the additional overhead of the assertions would be relatively small compared to the overhead of -O0 itself. > --- > libstdc++-v3/doc/html/manual/using_macros.html | 12 +++++++++--- > libstdc++-v3/doc/xml/manual/using.xml | 16 +++++++++++++--- > libstdc++-v3/include/bits/c++config | 9 +++++++-- > 3 files changed, 29 insertions(+), 8 deletions(-) > > diff --git a/libstdc++-v3/doc/html/manual/using_macros.html > b/libstdc++-v3/doc/html/manual/using_macros.html > index 67623b5e2af..c1406ec76f7 100644 > --- a/libstdc++-v3/doc/html/manual/using_macros.html > +++ b/libstdc++-v3/doc/html/manual/using_macros.html > @@ -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>. > diff --git a/libstdc++-v3/doc/xml/manual/using.xml > b/libstdc++-v3/doc/xml/manual/using.xml > index 89119f6fb2d..7ca3a3f4b4c 100644 > --- a/libstdc++-v3/doc/xml/manual/using.xml > +++ b/libstdc++-v3/doc/xml/manual/using.xml > @@ -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> > diff --git a/libstdc++-v3/include/bits/c++config > b/libstdc++-v3/include/bits/c++config > index 29d795f687c..b87a3527f24 100644 > --- a/libstdc++-v3/include/bits/c++config > +++ b/libstdc++-v3/include/bits/c++config > @@ -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. > -- > 2.46.1 > >