Module Name:    src
Committed By:   rin
Date:           Thu Aug 17 06:38:08 UTC 2023

Modified Files:
        src/external/gpl3/gdb/dist/gdbsupport: common-defs.h

Log Message:
gdb: Clean up duplicate ATTRIBUTE_NONNULL. No binary changes.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/external/gpl3/gdb/dist/gdbsupport/common-defs.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl3/gdb/dist/gdbsupport/common-defs.h
diff -u src/external/gpl3/gdb/dist/gdbsupport/common-defs.h:1.3 src/external/gpl3/gdb/dist/gdbsupport/common-defs.h:1.4
--- src/external/gpl3/gdb/dist/gdbsupport/common-defs.h:1.3	Mon Jul 31 17:00:52 2023
+++ src/external/gpl3/gdb/dist/gdbsupport/common-defs.h	Thu Aug 17 06:38:08 2023
@@ -187,81 +187,6 @@
 #undef ATTRIBUTE_NONNULL
 #define ATTRIBUTE_NONNULL(m)
 
-/* This is defined by ansidecl.h, but we disable the attribute.
-
-   Say a developer starts out with:
-   ...
-   extern void foo (void *ptr) __atttribute__((nonnull (1)));
-   void foo (void *ptr) {}
-   ...
-   with the idea in mind to catch:
-   ...
-   foo (nullptr);
-   ...
-   at compile time with -Werror=nonnull, and then adds:
-   ...
-    void foo (void *ptr) {
-   +  gdb_assert (ptr != nullptr);
-    }
-   ...
-   to catch:
-   ...
-   foo (variable_with_nullptr_value);
-   ...
-   at runtime as well.
-
-   Said developer then verifies that the assert works (using -O0), and commits
-   the code.
-
-   Some other developer then checks out the code and accidentally writes some
-   variant of:
-   ...
-   foo (variable_with_nullptr_value);
-   ...
-   and builds with -O2, and ... the assert doesn't trigger, because it's
-   optimized away by gcc.
-
-   There's no suppported recipe to prevent the assertion from being optimized
-   away (other than: build with -O0, or remove the nonnull attribute).  Note
-   that -fno-delete-null-pointer-checks does not help.  A patch was submitted
-   to improve gcc documentation to point this out more clearly (
-   https://gcc.gnu.org/pipermail/gcc-patches/2021-July/576218.html ).  The
-   patch also mentions a possible workaround that obfuscates the pointer
-   using:
-   ...
-    void foo (void *ptr) {
-   +  asm ("" : "+r"(ptr));
-      gdb_assert (ptr != nullptr);
-    }
-   ...
-   but that still requires the developer to manually add this in all cases
-   where that's necessary.
-
-   A warning was added to detect the situation: -Wnonnull-compare, which does
-   help in detecting those cases, but each new gcc release may indicate a new
-   batch of locations that needs fixing, which means we've added a maintenance
-   burden.
-
-   We could try to deal with the problem more proactively by introducing a
-   gdb_assert variant like:
-   ...
-   void gdb_assert_non_null (void *ptr) {
-      asm ("" : "+r"(ptr));
-      gdb_assert (ptr != nullptr);
-    }
-    void foo (void *ptr) {
-      gdb_assert_nonnull (ptr);
-    }
-   ...
-   and make it a coding style to use it everywhere, but again, maintenance
-   burden.
-
-   With all these things considered, for now we go with the solution with the
-   least maintenance burden: disable the attribute, such that we reliably deal
-   with it everywhere.  */
-#undef ATTRIBUTE_NONNULL
-#define ATTRIBUTE_NONNULL(m)
-
 #if GCC_VERSION >= 3004
 #define ATTRIBUTE_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
 #else

Reply via email to