Clean up conditionals for declaration of gets.

gets has the dubious honor of being the only C89 library feature that
has been completely removed from the current C and C++ standards.
glibc follows suit by not declaring it in _GNU_SOURCE mode either,
but it remains present in older compatibility modes.  Internally,
two test cases need to see stdio.h make the declaration, but all our
internal code is of course compiled under _GNU_SOURCE.  This is currently
kludged by duplicating the gets declaration, fortify wrapper and all,
in include/stdio.h.  Also, the conditional in the public headers for
deciding when to declare gets is complicated and repeated in two places.

This patch adds a new macro to features.h that encapsulates the
complicated rule for when to declare gets.  stdio.h and bits/stdio2.h
then simply test __GLIBC_USE (DEPRECATED_GETS), and instead of having
a duplicate gets declaration in include/stdio.h, debug/tst-chk1.c and
stdio-common/tst-gets.c can force gets to be declared.

        * include/features.h (__GLIBC_USE_DEPRECATED_GETS): New macro.
        * libio/stdio.h, libio/bits/stdio2.h: Condition gets on
        __GLIBC_USE (DEPRECATED_GETS).  Update comments to indicate
        gets was removed from C++ in C++14.
        * include/stdio.h: Remove redundant declaration of gets.
        * debug/tst-chk1.c, stdio-common/tst-gets.c: Force gets to
        be declared, since we are testing it.
        * stdio-common/Makefile (tst-gets.c): Compile with
        -Wno-deprecated-declarations.
	* debug/Makefile (tst-chk1.c, tst-chk2.c, tst-chk3.c, tst-chk4.cc)
	(tst-chk5.cc, tst-chk6.cc, tst-lfschk1.c, tst-lfschk2.c)
	(tst-lfschk3.c, tst-lfschk4.cc, tst-lfschk5.cc, tst-lfschk6.cc):
	Compile with -Wno-deprecated-declarations.
This commit is contained in:
Zack Weinberg 2016-11-21 08:16:27 -05:00
parent 4f5a9afffb
commit 7caa5054af
9 changed files with 62 additions and 43 deletions

View File

@ -1,3 +1,19 @@
2017-02-25 Zack Weinberg <zackw@panix.com>
* include/features.h (__GLIBC_USE_DEPRECATED_GETS): New macro.
* libio/stdio.h, libio/bits/stdio2.h: Condition gets on
__GLIBC_USE (DEPRECATED_GETS). Update comments to indicate
gets was removed from C++ in C++14.
* include/stdio.h: Remove redundant declaration of gets.
* debug/tst-chk1.c, stdio-common/tst-gets.c: Force gets to
be declared, since we are testing it.
* stdio-common/Makefile (tst-gets.c): Compile with
-Wno-deprecated-declarations.
* debug/Makefile (tst-chk1.c, tst-chk2.c, tst-chk3.c, tst-chk4.cc)
(tst-chk5.cc, tst-chk6.cc, tst-lfschk1.c, tst-lfschk2.c)
(tst-lfschk3.c, tst-lfschk4.cc, tst-lfschk5.cc, tst-lfschk6.cc):
Compile with -Wno-deprecated-declarations.
2017-02-24 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
* math/libm-test-support.c (check_ulp): Use LIT() around literal

View File

@ -103,21 +103,22 @@ CFLAGS-tst-longjmp_chk3.c = -fexceptions -fasynchronous-unwind-tables
CPPFLAGS-tst-longjmp_chk3.c = -D_FORTIFY_SOURCE=1
# We know these tests have problems with format strings, this is what
# we are testing. Disable that warning. They also generate warnings
# from warning attributes, which cannot be disabled via pragmas, so
# require -Wno-error to be used.
CFLAGS-tst-chk1.c = -Wno-format -Wno-error
CFLAGS-tst-chk2.c = -Wno-format -Wno-error
CFLAGS-tst-chk3.c = -Wno-format -Wno-error
CFLAGS-tst-chk4.cc = -Wno-format -Wno-error
CFLAGS-tst-chk5.cc = -Wno-format -Wno-error
CFLAGS-tst-chk6.cc = -Wno-format -Wno-error
CFLAGS-tst-lfschk1.c = -Wno-format -Wno-error
CFLAGS-tst-lfschk2.c = -Wno-format -Wno-error
CFLAGS-tst-lfschk3.c = -Wno-format -Wno-error
CFLAGS-tst-lfschk4.cc = -Wno-format -Wno-error
CFLAGS-tst-lfschk5.cc = -Wno-format -Wno-error
CFLAGS-tst-lfschk6.cc = -Wno-format -Wno-error
# we are testing. Disable that warning. They are also testing
# deprecated functions (notably gets) so disable that warning as well.
# And they also generate warnings from warning attributes, which
# cannot be disabled via pragmas, so require -Wno-error to be used.
CFLAGS-tst-chk1.c = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-chk2.c = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-chk3.c = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-chk4.cc = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-chk5.cc = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-chk6.cc = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-lfschk1.c = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-lfschk2.c = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-lfschk3.c = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-lfschk4.cc = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-lfschk5.cc = -Wno-format -Wno-deprecated-declarations -Wno-error
CFLAGS-tst-lfschk6.cc = -Wno-format -Wno-deprecated-declarations -Wno-error
LDLIBS-tst-chk4 = -lstdc++
LDLIBS-tst-chk5 = -lstdc++
LDLIBS-tst-chk6 = -lstdc++

View File

@ -16,6 +16,11 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* This file tests gets. Force it to be declared. */
#include <features.h>
#undef __GLIBC_USE_DEPRECATED_GETS
#define __GLIBC_USE_DEPRECATED_GETS 1
#include <assert.h>
#include <fcntl.h>
#include <locale.h>

View File

@ -136,6 +136,7 @@
#undef __USE_GNU
#undef __USE_FORTIFY_LEVEL
#undef __KERNEL_STRICT_NAMES
#undef __GLIBC_USE_DEPRECATED_GETS
/* Suppress kernel-name space pollution unless user expressedly asks
for it. */
@ -383,6 +384,16 @@
# define __USE_FORTIFY_LEVEL 0
#endif
/* The function 'gets' existed in C89, but is impossible to use
safely. It has been removed from ISO C11 and ISO C++14. Note: for
compatibility with various implementations of <cstdio>, this test
must consider only the value of __cplusplus when compiling C++. */
#if defined __cplusplus ? __cplusplus >= 201402L : defined __USE_ISOC11
# define __GLIBC_USE_DEPRECATED_GETS 0
#else
# define __GLIBC_USE_DEPRECATED_GETS 1
#endif
/* Get definitions of __STDC_* predefined macros, if the compiler has
not preincluded this header automatically. */
#include <stdc-predef.h>

View File

@ -181,24 +181,6 @@ libc_hidden_proto (__vasprintf_chk)
libc_hidden_proto (__vdprintf_chk)
libc_hidden_proto (__obstack_vprintf_chk)
/* The <stdio.h> header does not include the declaration for gets
anymore when compiling with _GNU_SOURCE. Provide a copy here. */
extern char *gets (char *__s);
# if __USE_FORTIFY_LEVEL > 0
extern char *__gets_chk (char *__str, size_t) __wur;
extern char *__REDIRECT (__gets_warn, (char *__str), gets)
__wur __warnattr ("please use fgets or getline instead, gets can't "
"specify buffer size");
__fortify_function __wur char *
gets (char *__str)
{
if (__bos (__str) != (size_t) -1)
return __gets_chk (__str, __bos (__str));
return __gets_warn (__str);
}
# endif
extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
libc_hidden_proto (__fmemopen)

View File

@ -222,8 +222,7 @@ __NTH (obstack_vprintf (struct obstack *__restrict __obstack,
#endif
#if !defined __USE_ISOC11 \
|| (defined __cplusplus && __cplusplus <= 201103L && !defined __USE_GNU)
#if __GLIBC_USE (DEPRECATED_GETS)
extern char *__gets_chk (char *__str, size_t) __wur;
extern char *__REDIRECT (__gets_warn, (char *__str), gets)
__wur __warnattr ("please use fgets or getline instead, gets can't "

View File

@ -625,16 +625,13 @@ __BEGIN_NAMESPACE_STD
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
__wur;
#if !defined __USE_ISOC11 \
|| (defined __cplusplus && __cplusplus <= 201103L)
#if __GLIBC_USE (DEPRECATED_GETS)
/* Get a newline-terminated string from stdin, removing the newline.
DO NOT USE THIS FUNCTION!! There is no limit on how much it will read.
The function has been officially removed in ISO C11. This opportunity
is used to also remove it from the GNU feature list. It is now only
available when explicitly using an old ISO C, Unix, or POSIX standard.
GCC defines _GNU_SOURCE when building C++ code and the function is still
in C++11, so it is also available for C++.
This function is impossible to use safely. It has been officially
removed from ISO C11 and ISO C++14, and we have also removed it
from the _GNU_SOURCE feature list. It remains available when
explicitly using an old ISO C, Unix, or POSIX standard.
This function is a possible cancellation point and therefore not
marked with __THROW. */

View File

@ -141,6 +141,9 @@ CFLAGS-scanf15.c = -I../libio -I../stdlib -I../wcsmbs -I../time -I../string \
CFLAGS-scanf17.c = -I../libio -I../stdlib -I../wcsmbs -I../time -I../string \
-I../wctype
# tst-gets.c tests a deprecated function.
CFLAGS-tst-gets.c += -Wno-deprecated-declarations
CPPFLAGS += $(libio-mtsafe)
$(objpfx)tst-setvbuf1.out: /dev/null $(objpfx)tst-setvbuf1

View File

@ -17,6 +17,11 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* This file tests gets. Force it to be declared. */
#include <features.h>
#undef __GLIBC_USE_DEPRECATED_GETS
#define __GLIBC_USE_DEPRECATED_GETS 1
#include <stdio.h>
#include <string.h>