From 0dfe5bfbb7e7a3e55c57d1b59c265dc1a3cd9fc7 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 22 Sep 2019 16:06:03 -0600 Subject: [PATCH] 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 * unittests/format_pieces-selftests.c: Update. Add final format. * gdbsupport/format.c (format_pieces::format_pieces): Don't add empty literal pieces. --- gdb/ChangeLog | 6 ++++++ gdb/gdbsupport/format.c | 16 ++++++++++------ gdb/unittests/format_pieces-selftests.c | 6 ++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd196d7e4f1..5c3dec35790 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2019-10-01 Tom Tromey + + * 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 * ui-out.h (enum class ui_out_style_kind): Remove. diff --git a/gdb/gdbsupport/format.c b/gdb/gdbsupport/format.c index fb3421e62bf..a5a367015f1 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 7d31b3cb93f..862b2da0f48 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), }); } -- 2.30.2