diff options
author | Tom Tromey <tom@tromey.com> | 2022-02-12 18:41:34 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2022-10-10 10:43:34 -0600 |
commit | 3041b9313e360af215e235e4d07f9557a22ffd13 (patch) | |
tree | b8a842cd7c50117846a12342515d24499b339c75 /gdb/valprint.c | |
parent | 05328f9105ed738cc4fe96429abd33466e891699 (diff) | |
download | gdb-3041b9313e360af215e235e4d07f9557a22ffd13.zip gdb-3041b9313e360af215e235e4d07f9557a22ffd13.tar.gz gdb-3041b9313e360af215e235e4d07f9557a22ffd13.tar.bz2 |
Fix a latent bug in print_wchar
print_wchar keeps track of when escape sequences are emitted, to force
an escape sequence if needed by a subsequent character. For example
for the string concatenation "\0" "1", gdb will print "\000\061" --
because printing "\0001" might be confusing.
However, this code has two errors. First, this logic is not needed
for octal escapes, because there is a length limit of 3 for octal
escapes, and gdb always prints these with "%.3o". Second, though,
this *is* needed for hex escapes, because those do not have a length
limit.
This patch fixes these problems and adds the appropriate tests.
Diffstat (limited to 'gdb/valprint.c')
-rw-r--r-- | gdb/valprint.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/gdb/valprint.c b/gdb/valprint.c index 5a2f4df..f079f31 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -2108,9 +2108,7 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, break; default: { - if (gdb_iswprint (w) && (!need_escape || (!gdb_iswdigit (w) - && w != LCST ('8') - && w != LCST ('9')))) + if (gdb_iswprint (w) && !(need_escape && gdb_iswxdigit (w))) { gdb_wchar_t wchar = w; @@ -2132,10 +2130,19 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, /* If the value fits in 3 octal digits, print it that way. Otherwise, print it as a hex escape. */ if (value <= 0777) - xsnprintf (octal, sizeof (octal), "\\%.3o", - (int) (value & 0777)); + { + xsnprintf (octal, sizeof (octal), "\\%.3o", + (int) (value & 0777)); + *need_escapep = false; + } else - xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value); + { + xsnprintf (octal, sizeof (octal), "\\x%lx", (long) value); + /* A hex escape might require the next character + to be escaped, because, unlike with octal, + hex escapes have no length limit. */ + *need_escapep = true; + } append_string_as_wide (octal, output); } /* If we somehow have extra bytes, print them now. */ @@ -2144,11 +2151,10 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, char octal[5]; xsnprintf (octal, sizeof (octal), "\\%.3o", orig[i] & 0xff); + *need_escapep = false; append_string_as_wide (octal, output); ++i; } - - *need_escapep = true; } break; } |