mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 09:43:32 +08:00
Disable spurious -Wstringop-overflow for setjmp/longjmp (bug 26647)
Building glibc with GCC 11 fails with (among other warnings) spurious -Wstringop-overflow warnings from calls to setjmp and longjmp with a pointer to a pthread_unwind_buf that is smaller than jmp_buf. As discussed in bug 26647, the warning in libc-start.c is a false positive, because setjmp and longjmp do not access anything (the signal mask) beyond the common prefix of the two structures, so this patch disables the warning for that call to setjmp, as well as for two calls in NPTL code that produce the same warning and look like false positives for the same reason. Tested with build-many-glibcs.py for arm-linux-gnueabi, where this allows the build to get further. Reviewed-by: DJ Delorie <dj@redhat.com>
This commit is contained in:
parent
961d12d947
commit
2098d4034d
@ -21,6 +21,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <ldsodefs.h>
|
#include <ldsodefs.h>
|
||||||
#include <exit-thread.h>
|
#include <exit-thread.h>
|
||||||
|
#include <libc-diag.h>
|
||||||
#include <libc-internal.h>
|
#include <libc-internal.h>
|
||||||
#include <elf/libc-early-init.h>
|
#include <elf/libc-early-init.h>
|
||||||
#include <stdbool.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;
|
struct pthread_unwind_buf unwind_buf;
|
||||||
|
|
||||||
int not_first_call;
|
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);
|
not_first_call = setjmp ((struct __jmp_buf_tag *) unwind_buf.cancel_jmp_buf);
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
if (__glibc_likely (! not_first_call))
|
if (__glibc_likely (! not_first_call))
|
||||||
{
|
{
|
||||||
struct pthread *self = THREAD_SELF;
|
struct pthread *self = THREAD_SELF;
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <hp-timing.h>
|
#include <hp-timing.h>
|
||||||
#include <ldsodefs.h>
|
#include <ldsodefs.h>
|
||||||
#include <atomic.h>
|
#include <atomic.h>
|
||||||
|
#include <libc-diag.h>
|
||||||
#include <libc-internal.h>
|
#include <libc-internal.h>
|
||||||
#include <resolv.h>
|
#include <resolv.h>
|
||||||
#include <kernel-features.h>
|
#include <kernel-features.h>
|
||||||
@ -400,7 +401,16 @@ START_THREAD_DEFN
|
|||||||
struct pthread_unwind_buf unwind_buf;
|
struct pthread_unwind_buf unwind_buf;
|
||||||
|
|
||||||
int not_first_call;
|
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);
|
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
|
/* No previous handlers. NB: This must be done after setjmp since the
|
||||||
private space in the unwind jump buffer may overlap space used by
|
private space in the unwind jump buffer may overlap space used by
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "pthreadP.h"
|
#include "pthreadP.h"
|
||||||
|
#include <libc-diag.h>
|
||||||
#include <jmpbuf-unwind.h>
|
#include <jmpbuf-unwind.h>
|
||||||
|
|
||||||
#ifdef _STACK_GROWS_DOWN
|
#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)
|
if (do_longjump)
|
||||||
__libc_unwind_longjmp ((struct __jmp_buf_tag *) buf->cancel_jmp_buf, 1);
|
__libc_unwind_longjmp ((struct __jmp_buf_tag *) buf->cancel_jmp_buf, 1);
|
||||||
|
DIAG_POP_NEEDS_COMMENT;
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
return _URC_NO_REASON;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user