diff mbox series

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

Message ID 20241002105926.3172639-1-jwakely@redhat.com
State New
Headers show
Series libstdc++: Enable _GLIBCXX_ASSERTIONS by default for -O0 [PR112808] | expand

Commit Message

Jonathan Wakely Oct. 2, 2024, 10:58 a.m. UTC
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.
---
 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(-)

Comments

Patrick Palka Oct. 2, 2024, 5:38 p.m. UTC | #1
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
> 
>
Arsen Arsenović Oct. 2, 2024, 6:40 p.m. UTC | #2
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 mbox series

Patch

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.