diff options
author | Tom Tromey <tom@tromey.com> | 2019-09-22 16:06:03 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-10-01 15:12:37 -0600 |
commit | 0dfe5bfbb7e7a3e55c57d1b59c265dc1a3cd9fc7 (patch) | |
tree | 7d49e611a4042f0e496d6c231879d40bd2ff2164 | |
parent | e43b10e10eba9d9493a0ad40176b2aea9cfb62ab (diff) | |
download | gdb-0dfe5bfbb7e7a3e55c57d1b59c265dc1a3cd9fc7.zip gdb-0dfe5bfbb7e7a3e55c57d1b59c265dc1a3cd9fc7.tar.gz gdb-0dfe5bfbb7e7a3e55c57d1b59c265dc1a3cd9fc7.tar.bz2 |
Don't create empty literal pieces
I noticed that format_pieces can create an empty literal piece.
However, there's never a need for one, so this patch removes the
possibility.
gdb/ChangeLog
2019-10-01 Tom Tromey <tom@tromey.com>
* unittests/format_pieces-selftests.c: Update. Add final format.
* gdbsupport/format.c (format_pieces::format_pieces): Don't add
empty literal pieces.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbsupport/format.c | 16 | ||||
-rw-r--r-- | gdb/unittests/format_pieces-selftests.c | 6 |
3 files changed, 20 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd196d7..5c3dec3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2019-10-01 Tom Tromey <tom@tromey.com> + * unittests/format_pieces-selftests.c: Update. Add final format. + * gdbsupport/format.c (format_pieces::format_pieces): Don't add + empty literal pieces. + +2019-10-01 Tom Tromey <tom@tromey.com> + * ui-out.h (enum class ui_out_style_kind): Remove. (class ui_out) <field_string, field_stsream, do_field_string>: Change type of "style". diff --git a/gdb/gdbsupport/format.c b/gdb/gdbsupport/format.c index fb3421e..a5a3670 100644 --- a/gdb/gdbsupport/format.c +++ b/gdb/gdbsupport/format.c @@ -129,7 +129,8 @@ format_pieces::format_pieces (const char **arg) current_substring += f - 1 - prev_start; *current_substring++ = '\0'; - m_pieces.emplace_back (sub_start, literal_piece); + if (*sub_start != '\0') + m_pieces.emplace_back (sub_start, literal_piece); percent_loc = f - 1; @@ -340,11 +341,14 @@ format_pieces::format_pieces (const char **arg) /* Record the remainder of the string. */ - sub_start = current_substring; + if (f > prev_start) + { + sub_start = current_substring; - strncpy (current_substring, prev_start, f - prev_start); - current_substring += f - prev_start; - *current_substring++ = '\0'; + strncpy (current_substring, prev_start, f - prev_start); + current_substring += f - prev_start; + *current_substring++ = '\0'; - m_pieces.emplace_back (sub_start, literal_piece); + m_pieces.emplace_back (sub_start, literal_piece); + } } diff --git a/gdb/unittests/format_pieces-selftests.c b/gdb/unittests/format_pieces-selftests.c index 7d31b3c..862b2da 100644 --- a/gdb/unittests/format_pieces-selftests.c +++ b/gdb/unittests/format_pieces-selftests.c @@ -48,13 +48,15 @@ test_escape_sequences () static void test_format_specifier () { - check ("Hello %d%llx%%d", /* ARI: %ll */ + /* The format string here ends with a % sequence, to ensure we don't + see a trailing empty literal piece. */ + check ("Hello %d%llx%%d%d", /* ARI: %ll */ { format_piece ("Hello ", literal_piece), format_piece ("%d", int_arg), - format_piece ("", literal_piece), format_piece ("%llx", long_long_arg), /* ARI: %ll */ format_piece ("%%d", literal_piece), + format_piece ("%d", int_arg), }); } |