diff options
author | Martin Sebor <msebor@redhat.com> | 2021-04-27 13:01:55 -0600 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2021-04-27 13:01:55 -0600 |
commit | a1561c3bbe8e72c6e44280d1eb5e529d2da4ecd0 (patch) | |
tree | e3313210ed99c03771560866bc346355ac308e0e /nptl/tst-thread-setspecific.c | |
parent | 876cdfd154f93a913202fa77ed98e97e66aff9c9 (diff) | |
download | glibc-a1561c3bbe8e72c6e44280d1eb5e529d2da4ecd0.tar.gz glibc-a1561c3bbe8e72c6e44280d1eb5e529d2da4ecd0.tar.xz glibc-a1561c3bbe8e72c6e44280d1eb5e529d2da4ecd0.zip |
Add __attribute_access_none to disable GCC warnings [BZ #27714]
GCC 11 warns when a pointer to an uninitialized object is passed to a function that takes a const-qualified argument. This is done on the assumption that most such functions read from the object. For the rare case of a function that doesn't, GCC 11 extends attribute access to add a new mode called none. POSIX pthread_setspecific() is one such rare function that takes a const void* argument but that doesn't read from the object it points to. To suppress the -Wmaybe-uninitialized issued by GCC 11 when the address of an uninitialized object is passed to it (e.g., the result of malloc()), this change #defines __attr_access_none in cdefs.h and uses the macro on the function in sysdeps/htl/pthread.h and sysdeps/nptl/pthread.h.
Diffstat (limited to 'nptl/tst-thread-setspecific.c')
-rw-r--r-- | nptl/tst-thread-setspecific.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/nptl/tst-thread-setspecific.c b/nptl/tst-thread-setspecific.c new file mode 100644 index 0000000000..bda61c6333 --- /dev/null +++ b/nptl/tst-thread-setspecific.c @@ -0,0 +1,43 @@ +/* Test to verify that passing a pointer to an uninitialized object + to pthread_setspecific doesn't trigger bogus uninitialized warnings. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <pthread.h> +#include <stdlib.h> + +/* Turn uninitialized warnings into errors to detect the problem. + See BZ #27714. */ + +#pragma GCC diagnostic push +#pragma GCC diagnostic error "-Wmaybe-uninitialized" +#pragma GCC diagnostic error "-Wuninitialized" + +int do_test (void) +{ + void *p = malloc (1); /* Deliberately uninitialized. */ + pthread_setspecific (pthread_self (), p); + + void *q = pthread_getspecific (pthread_self ()); + + return p == q; +} + +#pragma GCC diagnostic pop + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |