Message ID | 20241002105926.3172639-1-jwakely@redhat.com |
---|---|
State | New |
Headers | show |
Series | libstdc++: Enable _GLIBCXX_ASSERTIONS by default for -O0 [PR112808] | expand |
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 > >
Patrick Palka <ppalka@redhat.com> writes: > 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. On that note, maybe we could add a __OPTIMIZE_DEBUG__ or similar so that we can do a similar thing for -Og (which some use for their development cycle).
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.