diff options
43 files changed, 682 insertions, 103 deletions
@@ -1,3 +1,68 @@ +2019-01-03 Zack Weinberg <zackw@panix.com> + + * include/features.h (__GLIBC_USE_DEPRECATED_SCANF): New __GLIBC_USE + parameter. Only use deprecated scanf when __USE_GNU is defined + and __STDC_VERSION__ is less than 199901L or __cplusplus is less + than 201103L, whichever is relevant for the language being compiled. + + * libio/stdio.h, libio/bits/stdio-ldbl.h: Decide whether to redirect + scanf, fscanf, sscanf, vscanf, vfscanf, and vsscanf to their + __isoc99_ variants based only on __GLIBC_USE (DEPRECATED_SCANF). + * wcsmbs/wchar.h: wcsmbs/bits/wchar-ldbl.h: Likewise for + wscanf, fwscanf, swscanf, vwscanf, vfwscanf, and vswscanf. + + * libio/iovsscanf.c + * libio/fwscanf.c + * libio/iovswscanf.c + * libio/swscanf.c + * libio/vscanf.c + * libio/vwscanf.c + * libio/wscanf.c + * stdio-common/fscanf.c + * stdio-common/scanf.c + * stdio-common/vfscanf.c + * stdio-common/vfwscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-compat.c + * sysdeps/ieee754/ldbl-opt/nldbl-fscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-fwscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-iovfscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-scanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-sscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-swscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-vfscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-vfwscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-vscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-vsscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-vswscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-vwscanf.c + * sysdeps/ieee754/ldbl-opt/nldbl-wscanf.c: + Override __GLIBC_USE_DEPRECATED_SCANF to 1. + + * stdio-common/sscanf.c: Likewise. Remove ldbl_hidden_def for __sscanf. + * stdio-common/isoc99_sscanf.c: Add libc_hidden_def for __isoc99_sscanf. + * include/stdio.h: Provide libc_hidden_proto for __isoc99_sscanf, + not sscanf. + [!__GLIBC_USE (DEPRECATED_SCANF)]: Define sscanf as __isoc99_scanf + with a preprocessor macro. + + * stdio-common/bug21.c, stdio-common/scanf14.c: + Use %ms instead of %as, %mS instead of %aS, %m[] instead of %a[]; + remove DIAG_IGNORE_NEEDS_COMMENT for -Wformat. + * stdio-common/scanf16.c: Likewise. Add __attribute__ ((format (scanf))) + to xscanf, xfscanf, xsscanf. + + * stdio-common/scanf14a.c: New copy of scanf14.c which still uses + %as, %aS, %a[]. Remove DIAG_IGNORE_NEEDS_COMMENT for -Wformat. + * stdio-common/scanf16a.c: New copy of scanf16.c which still uses + %as, %aS, %a[]. Add __attribute__ ((format (scanf))) to xscanf, + xfscanf, xsscanf. + * stdio-common/scanf15.c, stdio-common/scanf17.c: No need to + override feature selection macros or provide definitions of u_char etc. + * stdio-common/Makefile (tests): Add scanf14a and scanf16a. + (CFLAGS-scanf15.c, CFLAGS-scanf17.c): Remove. + (CFLAGS-scanf14a.c, CFLAGS-scanf16a.c): New. Compile these files + with -std=gnu89. + 2019-01-03 Adhemerval Zanella <adhemerval.zanella@linaro.org> * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add @@ -68,6 +68,23 @@ Deprecated and removed features, and other changes affecting compatibility: used by the Linux kernel. This affects the size and layout of those structures. +* An archaic GNU extension to scanf, under which '%as', '%aS', and '%a[...]' + meant to scan a string and allocate space for it with malloc, is now + restricted to programs compiled in C89 or C++98 mode with _GNU_SOURCE + defined. This extension conflicts with C99's use of '%a' to scan a + hexadecimal floating-point number, which is now available to programs + compiled as C99 or C++11 or higher, regardless of _GNU_SOURCE. + + POSIX.1-2008 includes the feature of allocating a buffer for string input + with malloc, using the modifier letter 'm' instead. Programs using + '%as', '%aS', or '%a[...]' with the old GNU meaning should change to + '%ms', '%mS', or '%m[...]' respectively. Programs that wish to use the + C99 '%a' no longer need to avoid _GNU_SOURCE. + + GCC's -Wformat warnings can detect most uses of this extension, as long + as all functions that call vscanf, vfscanf, or vsscanf are annotated with + __attribute__ ((format (scanf, ...))). + Changes to build and runtime requirements: * Python 3.4 or later is required to build the GNU C Library. diff --git a/include/features.h b/include/features.h index dc9f8fa9ac..c9bc534e27 100644 --- a/include/features.h +++ b/include/features.h @@ -140,6 +140,7 @@ #undef __USE_FORTIFY_LEVEL #undef __KERNEL_STRICT_NAMES #undef __GLIBC_USE_DEPRECATED_GETS +#undef __GLIBC_USE_DEPRECATED_SCANF /* Suppress kernel-name space pollution unless user expressedly asks for it. */ @@ -401,6 +402,27 @@ # define __GLIBC_USE_DEPRECATED_GETS 1 #endif +/* GNU formerly extended the scanf functions with modified format + specifiers %as, %aS, and %a[...] that allocate a buffer for the + input using malloc. This extension conflicts with ISO C99, which + defines %a as a standalone format specifier that reads a floating- + point number; moreover, POSIX.1-2008 provides the same feature + using the modifier letter 'm' instead (%ms, %mS, %m[...]). + + We now follow C99 unless GNU extensions are active and the compiler + is specifically in C89 or C++98 mode (strict or not). For + instance, with GCC, -std=gnu11 will have C99-compliant scanf with + or without -D_GNU_SOURCE, but -std=c89 -D_GNU_SOURCE will have the + old extension. */ +#if defined __USE_GNU && \ + (defined __cplusplus \ + ? (__cplusplus < 201103L && !defined __GXX_EXPERIMENTAL_CXX0X__) \ + : (!defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L)) +# define __GLIBC_USE_DEPRECATED_SCANF 1 +#else +# define __GLIBC_USE_DEPRECATED_SCANF 0 +#endif + /* Get definitions of __STDC_* predefined macros, if the compiler has not preincluded this header automatically. */ #include <stdc-predef.h> diff --git a/include/stdio.h b/include/stdio.h index 1b7da0f74d..65ccabbb05 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -64,9 +64,19 @@ extern int __isoc99_vscanf (const char *__restrict __format, extern int __isoc99_vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __THROW; +libc_hidden_proto (__isoc99_sscanf) libc_hidden_proto (__isoc99_vsscanf) libc_hidden_proto (__isoc99_vfscanf) +/* Internal uses of sscanf should call the C99-compliant version. + Unfortunately, symbol redirection is not transitive, so the + __REDIRECT in the public header does not link up with the above + libc_hidden_proto. Bridge the gap with a macro. */ +# if !__GLIBC_USE (DEPRECATED_SCANF) +# undef sscanf +# define sscanf __isoc99_sscanf +# endif + /* Prototypes for compatibility functions. */ extern FILE *__new_tmpfile (void); extern FILE *__old_tmpfile (void); @@ -171,7 +181,6 @@ libc_hidden_proto (__dprintf) libc_hidden_proto (fprintf) libc_hidden_proto (vfprintf) libc_hidden_proto (sprintf) -libc_hidden_proto (sscanf) libc_hidden_proto (fwrite) libc_hidden_proto (perror) libc_hidden_proto (remove) diff --git a/libio/bits/stdio-ldbl.h b/libio/bits/stdio-ldbl.h index 18289e6b86..97ad168a04 100644 --- a/libio/bits/stdio-ldbl.h +++ b/libio/bits/stdio-ldbl.h @@ -26,9 +26,7 @@ __LDBL_REDIR_DECL (sprintf) __LDBL_REDIR_DECL (vfprintf) __LDBL_REDIR_DECL (vprintf) __LDBL_REDIR_DECL (vsprintf) -#if defined __USE_ISOC99 && !defined __USE_GNU \ - && !defined __REDIRECT \ - && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K) +#if !__GLIBC_USE (DEPRECATED_SCANF) __LDBL_REDIR1_DECL (fscanf, __nldbl___isoc99_fscanf) __LDBL_REDIR1_DECL (scanf, __nldbl___isoc99_scanf) __LDBL_REDIR1_DECL (sscanf, __nldbl___isoc99_sscanf) @@ -44,8 +42,7 @@ __LDBL_REDIR_DECL (vsnprintf) #endif #ifdef __USE_ISOC99 -# if !defined __USE_GNU && !defined __REDIRECT \ - && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K) +# if !__GLIBC_USE (DEPRECATED_SCANF) __LDBL_REDIR1_DECL (vfscanf, __nldbl___isoc99_vfscanf) __LDBL_REDIR1_DECL (vscanf, __nldbl___isoc99_vscanf) __LDBL_REDIR1_DECL (vsscanf, __nldbl___isoc99_vsscanf) diff --git a/libio/fwscanf.c b/libio/fwscanf.c index c316ef961d..24872f46ff 100644 --- a/libio/fwscanf.c +++ b/libio/fwscanf.c @@ -15,6 +15,11 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include <libioP.h> #include <stdarg.h> #include <stdio.h> diff --git a/libio/iovsscanf.c b/libio/iovsscanf.c index 752eed96e3..a561eab87e 100644 --- a/libio/iovsscanf.c +++ b/libio/iovsscanf.c @@ -24,6 +24,11 @@ This exception applies to code released by its copyright holders in files containing the exception. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include "strfile.h" int diff --git a/libio/iovswscanf.c b/libio/iovswscanf.c index f584c963fa..669fdc12b6 100644 --- a/libio/iovswscanf.c +++ b/libio/iovswscanf.c @@ -24,6 +24,11 @@ This exception applies to code released by its copyright holders in files containing the exception. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include <wchar.h> #include "strfile.h" diff --git a/libio/stdio.h b/libio/stdio.h index 4cc5b24a31..b63ee88a77 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -399,13 +399,11 @@ extern int scanf (const char *__restrict __format, ...) __wur; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) __THROW; -#if defined __USE_ISOC99 && !defined __USE_GNU \ - && (!defined __LDBL_COMPAT || !defined __REDIRECT) \ - && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K) +/* For historical reasons, the C99-compliant versions of the scanf + functions are at alternative names. When __LDBL_COMPAT is in + effect, this is handled in bits/stdio-ldbl.h. */ +#if !__GLIBC_USE (DEPRECATED_SCANF) && !defined __LDBL_COMPAT # ifdef __REDIRECT -/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[ - GNU extension which conflicts with valid %a followed by letter - s, S or [. */ extern int __REDIRECT (fscanf, (FILE *__restrict __stream, const char *__restrict __format, ...), __isoc99_fscanf) __wur; @@ -447,13 +445,9 @@ extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __THROW __attribute__ ((__format__ (__scanf__, 2, 0))); -# if !defined __USE_GNU \ - && (!defined __LDBL_COMPAT || !defined __REDIRECT) \ - && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K) -# ifdef __REDIRECT -/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[ - GNU extension which conflicts with valid %a followed by letter - s, S or [. */ +/* Same redirection as above for the v*scanf family. */ +# if !__GLIBC_USE (DEPRECATED_SCANF) +# if defined __REDIRECT && !defined __LDBL_COMPAT extern int __REDIRECT (vfscanf, (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg), @@ -467,7 +461,7 @@ extern int __REDIRECT_NTH (vsscanf, const char *__restrict __format, __gnuc_va_list __arg), __isoc99_vsscanf) __attribute__ ((__format__ (__scanf__, 2, 0))); -# else +# elif !defined __REDIRECT extern int __isoc99_vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __wur; diff --git a/libio/swscanf.c b/libio/swscanf.c index e38b938b0b..5f529ef630 100644 --- a/libio/swscanf.c +++ b/libio/swscanf.c @@ -15,6 +15,11 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include <stdarg.h> #include "strfile.h" diff --git a/libio/vscanf.c b/libio/vscanf.c index 936a2fdef8..342dc3effc 100644 --- a/libio/vscanf.c +++ b/libio/vscanf.c @@ -24,6 +24,11 @@ This exception applies to code released by its copyright holders in files containing the exception. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include "libioP.h" #include "stdio.h" diff --git a/libio/vwscanf.c b/libio/vwscanf.c index 0804175a81..696e4c5c99 100644 --- a/libio/vwscanf.c +++ b/libio/vwscanf.c @@ -24,6 +24,11 @@ This exception applies to code released by its copyright holders in files containing the exception. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include "libioP.h" #include <wchar.h> diff --git a/libio/wscanf.c b/libio/wscanf.c index ce8d3ed6b4..d4c7753e8e 100644 --- a/libio/wscanf.c +++ b/libio/wscanf.c @@ -15,6 +15,11 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +/* This file defines one of the deprecated scanf variants. */ +#include <features.h> +#undef __GLIBC_USE_DEPRECATED_SCANF +#define __GLIBC_USE_DEPRECATED_SCANF 1 + #include <libioP.h> #include <stdarg.h> #include <stdio.h> diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 11556f2177..c38299c864 100644 --- a/stdio-common/Makefile< |
