aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-09-22 16:06:03 -0600
committerTom Tromey <tom@tromey.com>2019-10-01 15:12:37 -0600
commit0dfe5bfbb7e7a3e55c57d1b59c265dc1a3cd9fc7 (patch)
tree7d49e611a4042f0e496d6c231879d40bd2ff2164
parente43b10e10eba9d9493a0ad40176b2aea9cfb62ab (diff)
downloadgdb-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/ChangeLog6
-rw-r--r--gdb/gdbsupport/format.c16
-rw-r--r--gdb/unittests/format_pieces-selftests.c6
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),
});
}