diff options
-rw-r--r-- | csu/libc-start.c | 10 | ||||
-rw-r--r-- | nptl/pthread_create.c | 10 | ||||
-rw-r--r-- | nptl/unwind.c | 10 |
3 files changed, 30 insertions, 0 deletions
diff --git a/csu/libc-start.c b/csu/libc-start.c index 4005caf84a..2d4d2ed1f9 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -21,6 +21,7 @@ #include <unistd.h> #include <ldsodefs.h> #include <exit-thread.h> +#include <libc-diag.h> #include <libc-internal.h> #include <elf/libc-early-init.h> #include <stdbool.h> @@ -298,7 +299,16 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), struct pthread_unwind_buf unwind_buf; int not_first_call; + DIAG_PUSH_NEEDS_COMMENT; +#if __GNUC_PREREQ (7, 0) + /* This call results in a -Wstringop-overflow warning because struct + pthread_unwind_buf is smaller than jmp_buf. setjmp and longjmp + do not use anything beyond the common prefix (they never access + the saved signal mask), so that is a false positive. */ + DIAG_IGNORE_NEEDS_COMMENT (11, "-Wstringop-overflow="); +#endif not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf); + DIAG_POP_NEEDS_COMMENT; if (__glibc_likely (! not_first_call)) { struct pthread *self = THREAD_SELF; diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 2cba3da38c..447f005ece 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -26,6 +26,7 @@ #include <hp-timing.h> #include <ldsodefs.h> #include <atomic.h> +#include <libc-diag.h> #include <libc-internal.h> #include <resolv.h> #include <kernel-features.h> @@ -400,7 +401,16 @@ START_THREAD_DEFN struct pthread_unwind_buf unwind_buf; int not_first_call; + DIAG_PUSH_NEEDS_COMMENT; +#if __GNUC_PREREQ (7, 0) + /* This call results in a -Wstringop-overflow warning because struct + pthread_unwind_buf is smaller than jmp_buf. setjmp and longjmp + do not use anything beyond the common prefix (they never access + the saved signal mask), so that is a false positive. */ + DIAG_IGNORE_NEEDS_COMMENT (11, "-Wstringop-overflow="); +#endif not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf); + DIAG_POP_NEEDS_COMMENT; /* No previous handlers. NB: This must be done after setjmp since the private space in the unwind jump buffer may overlap space used by diff --git a/nptl/unwind.c b/nptl/unwind.c index 35ed2a7b10..8f157e49f4 100644 --- a/nptl/unwind.c +++ b/nptl/unwind.c @@ -23,6 +23,7 @@ #include <string.h> #include <unistd.h> #include "pthreadP.h" +#include <libc-diag.h> #include <jmpbuf-unwind.h> #ifdef _STACK_GROWS_DOWN @@ -90,8 +91,17 @@ unwind_stop (int version, _Unwind_Action actions, } } + DIAG_PUSH_NEEDS_COMMENT; +#if __GNUC_PREREQ (7, 0) + /* This call results in a -Wstringop-overflow warning because struct + pthread_unwind_buf is smaller than jmp_buf. setjmp and longjmp + do not use anything beyond the common prefix (they never access + the saved signal mask), so that is a false positive. */ + DIAG_IGNORE_NEEDS_COMMENT (11, "-Wstringop-overflow="); +#endif if (do_longjump) __libc_unwind_longjmp ((struct __jmp_buf_tag *) buf->cancel_jmp_buf, 1); + DIAG_POP_NEEDS_COMMENT; return _URC_NO_REASON; } |