From 1c4053db63e2a3470ed8ace2ddd9636f9a6e135c Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 11 Dec 2014 13:46:21 -0800 Subject: [PATCH] Eliminate -Wno-format from printf/scanf tests. --- ChangeLog | 22 ++++++++++++++++++++++ stdio-common/Makefile | 8 -------- stdio-common/scanf4.c | 8 ++++++++ stdio-common/scanf7.c | 10 ++++++++++ stdio-common/test-vfprintf.c | 6 ++++++ stdio-common/tst-printf.c | 5 +++++ stdio-common/tst-printfsz.c | 4 ++++ stdio-common/tst-sprintf.c | 21 ++++++++++++++++----- stdio-common/tstdiomisc.c | 9 +++++++++ 9 files changed, 80 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9eed7ca2d..ad8fe210aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2014-12-11 Roland McGrath + + * stdio-common/tstdiomisc.c (t2): Ignore -Wformat and + -Wformat-extra-args warnings for scanf formats. + * stdio-common/scanf4.c (main): Ignore -Wformat-zero-length around + test of zero-length format (duh). + * stdio-common/scanf7.c (main): Ignore -Wformat warnings for + corner-case scanf format test. + * stdio-common/test-vfprintf.c (do_test): Ignore -Wformat-security for + generated fprintf format string. + * stdio-common/tst-sprintf.c (do_test): Ignore -Wformat warnings for + corner-case sprintf format tests. + * stdio-common/tst-printf.c: Ignore -Wformat throughout. + * stdio-common/tst-printfsz.c (main): Ignore -Wformat and + -Wformat-extra-args warnings throughout. + * stdio-common/Makefile (CFLAGS-tstdiomisc.c): Variable removed. + (CFLAGS-scanf4.c): Likewise. + (CFLAGS-scanf7.c): Likewise. + (CFLAGS-tst-sprintf.c): Likewise. + (CFLAGS-tst-printf.c): Likewise. + (CFLAGS-tst-printfsz.c): Likewise. + 2014-12-11 Joseph Myers * include/cpio.h: New file. diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 5f8e5341a5..f76365774a 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -80,11 +80,6 @@ endif CFLAGS-vfprintf.c = -Wno-uninitialized CFLAGS-vfwprintf.c = -Wno-uninitialized -CFLAGS-tst-printf.c = -Wno-format -CFLAGS-tstdiomisc.c = -Wno-format -CFLAGS-scanf4.c = -Wno-format -CFLAGS-scanf7.c = -Wno-format -CFLAGS-tst-printfsz.c = -Wno-format CFLAGS-tmpfile.c = -fexceptions CFLAGS-tmpfile64.c = -fexceptions @@ -116,9 +111,6 @@ 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 -# We know the test has a format string problem. -CFLAGS-tst-sprintf.c = -Wno-format - CPPFLAGS += $(libio-mtsafe) $(objpfx)tst-setvbuf1.out: /dev/null $(objpfx)tst-setvbuf1 diff --git a/stdio-common/scanf4.c b/stdio-common/scanf4.c index f9a9134745..9bb14bb16b 100644 --- a/stdio-common/scanf4.c +++ b/stdio-common/scanf4.c @@ -1,5 +1,6 @@ #include #include +#include int main(int arc, char *argv[]) @@ -15,7 +16,14 @@ main(int arc, char *argv[]) printf("Result of fscanf %%n = %d\n", res); printf("Scanned format = %d\n", val); + /* We're testing exactly the case the warning is for. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-zero-length"); + res = fscanf(fp, ""); + + DIAG_POP_NEEDS_COMMENT; + printf("Result of fscanf \"\" = %d\n", res); if (res != 0) abort (); diff --git a/stdio-common/scanf7.c b/stdio-common/scanf7.c index c746e47666..53ddf4cb09 100644 --- a/stdio-common/scanf7.c +++ b/stdio-common/scanf7.c @@ -1,5 +1,6 @@ #include #include +#include int main (int argc, char *argv[]) @@ -14,7 +15,16 @@ main (int argc, char *argv[]) abort (); n = -2; + + /* We are testing a corner case of the scanf format string here. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args"); + ret = sscanf ("1000", "%llld", &n); + + DIAG_POP_NEEDS_COMMENT; + printf ("%%llld: ret: %d, n: %Ld\n", ret, n); if (ret > 0 || n >= 0L) abort (); diff --git a/stdio-common/test-vfprintf.c b/stdio-common/test-vfprintf.c index 9cc56d7dcb..8483d8d885 100644 --- a/stdio-common/test-vfprintf.c +++ b/stdio-common/test-vfprintf.c @@ -92,7 +92,13 @@ do_test (void) fprintf (fp, "%s", large); fprintf (fp, "%.*s", 30000, large); large[20000] = '\0'; + /* We're testing a large format string here and need to generate it + to avoid this source file being ridiculous. So disable the warning + about a generated format string. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-security"); fprintf (fp, large); + DIAG_POP_NEEDS_COMMENT; fprintf (fp, "%-1.300000000s", "hello"); if (fflush (fp) != 0 || ferror (fp) != 0 || fclose (fp) != 0) diff --git a/stdio-common/tst-printf.c b/stdio-common/tst-printf.c index 10673ce77d..d52dc1deb1 100644 --- a/stdio-common/tst-printf.c +++ b/stdio-common/tst-printf.c @@ -26,6 +26,11 @@ #endif #include +#include + +/* This whole file is picayune tests of corner cases of printf format strings. + The compiler warnings are not useful here. */ +DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); static void rfg1 (void); static void rfg2 (void); diff --git a/stdio-common/tst-printfsz.c b/stdio-common/tst-printfsz.c index 74d67d2f69..902b2ac27b 100644 --- a/stdio-common/tst-printfsz.c +++ b/stdio-common/tst-printfsz.c @@ -23,6 +23,10 @@ main (int argc, char *argv[]) register_printf_function ('B', printf_size, printf_size_info); DIAG_POP_NEEDS_COMMENT; + /* All of the formats here use the nonstandard extension specifier + just registered, so compiler checking will never grok them. */ + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args"); sprintf (buf, "%g %b %B %.0b %.0B %.1b %.1B %8.0b %08.0B", V, 1025., V, V, V, V, V, V, V, V); diff --git a/stdio-common/tst-sprintf.c b/stdio-common/tst-sprintf.c index 2fe373f350..ea3008b68b 100644 --- a/stdio-common/tst-sprintf.c +++ b/stdio-common/tst-sprintf.c @@ -45,15 +45,26 @@ do_test (void) result = 1; } - if (sprintf (buf, "%67108863.16\"%d", 7) != 14 - || strcmp (buf, "%67108863.16\"7") != 0) + /* We are testing a corner case of the sprintf format string here. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); + int n = sprintf (buf, "%67108863.16\"%d", 7); + DIAG_POP_NEEDS_COMMENT; + + if (n != 14 || strcmp (buf, "%67108863.16\"7") != 0) { - printf ("sprintf (buf, \"%%67108863.16\\\"%%d\", 7) produced `%s' output", buf); + printf ("sprintf (buf, \"%%67108863.16\\\"%%d\", 7) produced `%s' output", + buf); result = 1; } - if (sprintf (buf, "%*\"%d", 0x3ffffff, 7) != 11 - || strcmp (buf, "%67108863\"7") != 0) + /* We are testing a corner case of the sprintf format string here. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); + n = sprintf (buf, "%*\"%d", 0x3ffffff, 7); + DIAG_POP_NEEDS_COMMENT; + + if (n != 11 || strcmp (buf, "%67108863\"7") != 0) { printf ("sprintf (buf, \"%%*\\\"%%d\", 0x3ffffff, 7) produced `%s' output", buf); result = 1; diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c index 2e0663a5e5..5548a71e52 100644 --- a/stdio-common/tstdiomisc.c +++ b/stdio-common/tstdiomisc.c @@ -3,6 +3,7 @@ #include #include #include +#include static int t1 (void) @@ -28,6 +29,12 @@ t2 (void) INPUT, FORMAT, retval, (long int) VAR); \ result |= retval != EXP_RES || VAR != EXP_VAL + /* This function is testing corner cases of the scanf format string, + so they do not all conform to -Wformat's expectations. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); + DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args"); + SCAN ("12345", "%ld", N, 1, 12345); SCAN ("12345", "%llllld", N, 0, -1); SCAN ("12345", "%LLLLLd", N, 0, -1); @@ -43,6 +50,8 @@ t2 (void) retval, n, N); \ result |= retval != 1 || n != 1 || N != -1; + DIAG_POP_NEEDS_COMMENT; + return result; }