From af39b1c216ffb11e6ca8e8607b00749e0fc1ab41 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 5 Sep 2018 21:21:51 -0600 Subject: [PATCH] Disable -Wformat-nonliteral in parts of printcmd.c commit 3322c5d9a1 ("Remove unneeded explicit .o targets") broke the build with clang, because -Wno-format-nonliteral was in fact needed. This patch fixes the problem by introducing DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL and using it in printcmd.c. This seems preferable to reverting the patch because now the warning suppression is more targeted. gdb/ChangeLog 2018-09-05 Simon Marchi * printcmd.c (printf_c_string): Use DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL. (printf_wide_c_string, printf_pointer, ui_printf): Likewise. include/ChangeLog 2018-09-05 Simon Marchi * diagnostics.h (DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL): New macro. --- gdb/ChangeLog | 6 ++++++ gdb/printcmd.c | 33 +++++++++++++++++++++++++++++++++ include/ChangeLog | 4 ++++ include/diagnostics.h | 12 ++++++++++++ 4 files changed, 55 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 084765d..d8ca6d3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2018-09-05 Simon Marchi + + * printcmd.c (printf_c_string): Use + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL. + (printf_wide_c_string, printf_pointer, ui_printf): Likewise. + 2018-09-05 Tom Tromey * cli/cli-cmds.c (shell_escape, edit_command): Remove cast. diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 1a3d972..8c99918 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -2200,7 +2200,10 @@ printf_c_string (struct ui_file *stream, const char *format, tem = value_as_address (value); if (tem == 0) { + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, format, "(null)"); + DIAGNOSTIC_POP return; } @@ -2221,7 +2224,10 @@ printf_c_string (struct ui_file *stream, const char *format, read_memory (tem, str, j); str[j] = 0; + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, format, (char *) str); + DIAGNOSTIC_POP } /* Subroutine of ui_printf to simplify it. @@ -2245,7 +2251,10 @@ printf_wide_c_string (struct ui_file *stream, const char *format, tem = value_as_address (value); if (tem == 0) { + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, format, "(null)"); + DIAGNOSTIC_POP return; } @@ -2272,7 +2281,10 @@ printf_wide_c_string (struct ui_file *stream, const char *format, &output, translit_char); obstack_grow_str0 (&output, ""); + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, format, obstack_base (&output)); + DIAGNOSTIC_POP } /* Subroutine of ui_printf to simplify it. @@ -2400,13 +2412,19 @@ printf_pointer (struct ui_file *stream, const char *format, *fmt_p++ = 'l'; *fmt_p++ = 'x'; *fmt_p++ = '\0'; + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, fmt, val); + DIAGNOSTIC_POP } else { *fmt_p++ = 's'; *fmt_p++ = '\0'; + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, fmt, "(nil)"); + DIAGNOSTIC_POP } } @@ -2507,8 +2525,11 @@ ui_printf (const char *arg, struct ui_file *stream) &output, translit_char); obstack_grow_str0 (&output, ""); + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, current_substring, obstack_base (&output)); + DIAGNOSTIC_POP } break; case long_long_arg: @@ -2516,7 +2537,10 @@ ui_printf (const char *arg, struct ui_file *stream) { long long val = value_as_long (val_args[i]); + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, current_substring, val); + DIAGNOSTIC_POP break; } #else @@ -2526,14 +2550,20 @@ ui_printf (const char *arg, struct ui_file *stream) { int val = value_as_long (val_args[i]); + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, current_substring, val); + DIAGNOSTIC_POP break; } case long_arg: { long val = value_as_long (val_args[i]); + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, current_substring, val); + DIAGNOSTIC_POP break; } /* Handles floating-point values. */ @@ -2557,7 +2587,10 @@ ui_printf (const char *arg, struct ui_file *stream) have modified GCC to include -Wformat-security by default, which will warn here if there is no argument. */ + DIAGNOSTIC_PUSH + DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL fprintf_filtered (stream, current_substring, 0); + DIAGNOSTIC_POP break; default: internal_error (__FILE__, __LINE__, diff --git a/include/ChangeLog b/include/ChangeLog index 63fdde6..c23c743 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2018-09-05 Simon Marchi + + * diagnostics.h (DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL): New macro. + 2018-08-31 Alan Modra * elf/ppc64.h (R_PPC64_REL16_HIGH, R_PPC64_REL16_HIGHA), diff --git a/include/diagnostics.h b/include/diagnostics.h index 9e9d1a8..79e6779 100644 --- a/include/diagnostics.h +++ b/include/diagnostics.h @@ -59,6 +59,10 @@ # define DIAGNOSTIC_IGNORE_SWITCH_DIFFERENT_ENUM_TYPES \ DIAGNOSTIC_IGNORE ("-Wenum-compare-switch") # endif + +# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \ + DIAGNOSTIC_IGNORE ("-Wformat-nonliteral") + #elif defined (__GNUC__) /* GCC */ # define DIAGNOSTIC_IGNORE_UNUSED_FUNCTION \ @@ -66,6 +70,10 @@ # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION \ DIAGNOSTIC_IGNORE ("-Wstringop-truncation") + +# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \ + DIAGNOSTIC_IGNORE ("-Wformat-nonliteral") + #endif #ifndef DIAGNOSTIC_IGNORE_SELF_MOVE @@ -92,4 +100,8 @@ # define DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION #endif +#ifndef DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL +# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL +#endif + #endif /* DIAGNOSTICS_H */ -- 2.7.4