Commit 3f0177e7 by Martin Sebor Committed by Martin Sebor

PR c/77520 - wrong value for extended ASCII characters in -Wformat message

PR c/77520 - wrong value for extended ASCII characters in -Wformat message
PR c/77521 - %qc format directive should quote non-printable characters

gcc/c-family/ChangeLog:

	PR c/77520
	PR c/77521
	* c-format.c (argument_parser::find_format_char_info): Use %qc
	format directive unconditionally.

gcc/ChangeLog:

	PR c/77520
	PR c/77521
	* pretty-print.c (pp_quoted_string): New function.
	(pp_format): Call it for %c and %s directives.

gcc/testsuite/ChangeLog:

	PR c/77520
	PR c/77521
	* gcc.dg/pr77520.c: New test.
	* gcc.dg/pr77521.c: New test.

From-SVN: r240059
parent 53680238
2016-09-09 Martin Sebor <msebor@redhat.com>
PR c/77520
PR c/77521
* pretty-print.c (pp_quoted_string): New function.
(pp_format): Call it for %c and %s directives.
2016-09-10 Bernd Edlinger <bernd.edlinger@hotmail.de> 2016-09-10 Bernd Edlinger <bernd.edlinger@hotmail.de>
* doc/tm.texi.in (INITIAL_FRAME_POINTER_OFFSET): Remove. * doc/tm.texi.in (INITIAL_FRAME_POINTER_OFFSET): Remove.
......
2016-09-09 Martin Sebor <msebor@redhat.com>
PR c/77520
PR c/77521
* c-format.c (argument_parser::find_format_char_info): Use %qc
format directive unconditionally.
2016-09-09 Jason Merrill <jason@redhat.com> 2016-09-09 Jason Merrill <jason@redhat.com>
Implement C++17 new of over-aligned types. Implement C++17 new of over-aligned types.
......
...@@ -2355,20 +2355,12 @@ argument_parser::find_format_char_info (char format_char) ...@@ -2355,20 +2355,12 @@ argument_parser::find_format_char_info (char format_char)
++fci; ++fci;
if (fci->format_chars == 0) if (fci->format_chars == 0)
{ {
if (ISGRAPH (format_char)) format_warning_at_char (format_string_loc, format_string_cst,
format_warning_at_char (format_string_loc, format_string_cst, format_chars - orig_format_chars,
format_chars - orig_format_chars, OPT_Wformat_,
OPT_Wformat_, "unknown conversion type character"
"unknown conversion type character" " %qc in format",
" %qc in format", format_char);
format_char);
else
format_warning_at_char (format_string_loc, format_string_cst,
format_chars - orig_format_chars,
OPT_Wformat_,
"unknown conversion type character"
" 0x%x in format",
format_char);
return NULL; return NULL;
} }
......
...@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3. If not see
#include <iconv.h> #include <iconv.h>
#endif #endif
static void pp_quoted_string (pretty_printer *, const char *, size_t = -1);
/* Overwrite the given location/range within this text_info's rich_location. /* Overwrite the given location/range within this text_info's rich_location.
For use e.g. when implementing "+" in client format decoders. */ For use e.g. when implementing "+" in client format decoders. */
...@@ -555,8 +557,20 @@ pp_format (pretty_printer *pp, text_info *text) ...@@ -555,8 +557,20 @@ pp_format (pretty_printer *pp, text_info *text)
break; break;
case 'c': case 'c':
pp_character (pp, va_arg (*text->args_ptr, int)); {
break; /* When quoting, print alphanumeric, punctuation, and the space
character unchanged, and all others in hexadecimal with the
"\x" prefix. Otherwise print them all unchanged. */
int chr = va_arg (*text->args_ptr, int);
if (ISPRINT (chr) || !quote)
pp_character (pp, chr);
else
{
const char str [2] = { chr, '\0' };
pp_quoted_string (pp, str, 1);
}
break;
}
case 'd': case 'd':
case 'i': case 'i':
...@@ -577,7 +591,10 @@ pp_format (pretty_printer *pp, text_info *text) ...@@ -577,7 +591,10 @@ pp_format (pretty_printer *pp, text_info *text)
break; break;
case 's': case 's':
pp_string (pp, va_arg (*text->args_ptr, const char *)); if (quote)
pp_quoted_string (pp, va_arg (*text->args_ptr, const char *));
else
pp_string (pp, va_arg (*text->args_ptr, const char *));
break; break;
case 'p': case 'p':
...@@ -939,6 +956,41 @@ pp_string (pretty_printer *pp, const char *str) ...@@ -939,6 +956,41 @@ pp_string (pretty_printer *pp, const char *str)
pp_maybe_wrap_text (pp, str, str + strlen (str)); pp_maybe_wrap_text (pp, str, str + strlen (str));
} }
/* Append the leading N characters of STRING to the output area of
PRETTY-PRINTER, quoting in hexadecimal non-printable characters.
Setting N = -1 is as if N were set to strlen (STRING). The STRING
may be line-wrapped if in appropriate mode. */
static void
pp_quoted_string (pretty_printer *pp, const char *str, size_t n /* = -1 */)
{
gcc_checking_assert (str);
const char *last = str;
const char *ps;
/* Compute the length if not specified. */
if (n == (size_t) -1)
n = strlen (str);
for (ps = str; n; ++ps, --n)
{
if (ISPRINT (*ps))
continue;
if (last < ps)
pp_maybe_wrap_text (pp, last, ps - 1);
/* Append the hexadecimal value of the character. Allocate a buffer
that's large enough for a 32-bit char plus the hex prefix. */
char buf [11];
int n = sprintf (buf, "\\x%02x", (unsigned char)*ps);
pp_maybe_wrap_text (pp, buf, buf + n);
last = ps + 1;
}
pp_maybe_wrap_text (pp, last, ps);
}
/* Maybe print out a whitespace if needed. */ /* Maybe print out a whitespace if needed. */
void void
......
2016-09-09 Martin Sebor <msebor@redhat.com>
PR c/77520
PR c/77521
* gcc.dg/pr77520.c: New test.
* gcc.dg/pr77521.c: New test.
2016-09-09 Steven G. Kargl <kargl@gcc.gnu.org> 2016-09-09 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/77506 PR fortran/77506
......
/* PR c/77520 - wrong value for extended ASCII characters in -Wformat message
Verify that characters in the extended ASCII range are quoted and not
allowed to be printed raw. */
/* { dg-do compile } */
/* { dg-options "-Wformat" } */
void f (void)
{
__builtin_printf ("%\x80"); /* { dg-warning "unknown conversion type character .\\\\x80. in format" } */
}
/* PR c/77521 - %qc format directive should quote non-printable characters.
Verify that non-printable characters in assembly constraints are quoted
and not allowed to be printed raw. */
void f (int a, int b)
{
__asm__ ("combine %2, %0" : "=r" (a) : "0" (a), "\n" (b)); /* { dg-error "invalid punctuation .\\\\x0a. in constraint" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment