diff --git a/ChangeLog b/ChangeLog index 01f123c3f4..6d41756dda 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2017-02-25 Zack Weinberg + + * 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 * math/libm-test-support.c (check_ulp): Use LIT() around literal diff --git a/debug/Makefile b/debug/Makefile index 3d268f0422..cd4975c35b 100644 --- a/debug/Makefile +++ b/debug/Makefile @@ -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++ diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c index 164d0ae63e..60c8e1e1d0 100644 --- a/debug/tst-chk1.c +++ b/debug/tst-chk1.c @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +/* This file tests gets. Force it to be declared. */ +#include +#undef __GLIBC_USE_DEPRECATED_GETS +#define __GLIBC_USE_DEPRECATED_GETS 1 + #include #include #include diff --git a/include/features.h b/include/features.h index dc8ae794a5..7de4089ed3 100644 --- a/include/features.h +++ b/include/features.h @@ -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 , 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 diff --git a/include/stdio.h b/include/stdio.h index 30e737efc2..17b5a05076 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -181,24 +181,6 @@ libc_hidden_proto (__vasprintf_chk) libc_hidden_proto (__vdprintf_chk) libc_hidden_proto (__obstack_vprintf_chk) -/* The 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) diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h index e31386dbd7..e9f9d6952b 100644 --- a/libio/bits/stdio2.h +++ b/libio/bits/stdio2.h @@ -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 " diff --git a/libio/stdio.h b/libio/stdio.h index a589e367a2..c4f734cb3c 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -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. */ diff --git a/stdio-common/Makefile b/stdio-common/Makefile index f693fa001f..01a6dd0eda 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -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 diff --git a/stdio-common/tst-gets.c b/stdio-common/tst-gets.c index 102f235e53..9340c76f8a 100644 --- a/stdio-common/tst-gets.c +++ b/stdio-common/tst-gets.c @@ -17,6 +17,11 @@ License along with the GNU C Library; if not, see . */ +/* This file tests gets. Force it to be declared. */ +#include +#undef __GLIBC_USE_DEPRECATED_GETS +#define __GLIBC_USE_DEPRECATED_GETS 1 + #include #include