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