aboutsummaryrefslogtreecommitdiff
path: root/gdb/printcmd.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-11-27 10:46:07 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2020-11-27 14:55:55 +0000
commit3df8c6afdd6d38a7622ff5f4b1a64aff80334ab9 (patch)
tree9403b027352d60730723ddbd205b017c78aa382b /gdb/printcmd.c
parentb1eea24024e2db6ba46c1a2838e69593e9314d0d (diff)
downloadgdb-3df8c6afdd6d38a7622ff5f4b1a64aff80334ab9.zip
gdb-3df8c6afdd6d38a7622ff5f4b1a64aff80334ab9.tar.gz
gdb-3df8c6afdd6d38a7622ff5f4b1a64aff80334ab9.tar.bz2
gdb: fix potentially uninitialised variable
In commit: commit 037d7135de575c9e0c20e9158c105979bfee339c Date: Mon Nov 16 11:36:56 2020 +0000 gdb: improve command completion for 'print', 'x', and 'display' A potential use of an uninitialised variable was introduced. This is fixed in this commit. Previously when analysing /FMT strings for tab completion we considered two possibilities, either the user has typed '/', or the user has typed '/' followed by an alpha-numeric character, as these are the only valid FMT string characters. This meant that if the user type, for example '/@' and then tried to tab complete gdb would use an uninitialised variable. Currently only the first character after the '/' is checked to see if it is alpha-numeric, so if a user typed '/x@@' then gdb would be happy to treat this as a FMT string. Given the goal of this change was primarily to allow tab completion of symbols later in the command when a /FMT was used then I decided to just make the /FMT skipping less smart. Now any characters after the '/' up to the first white space, will be treated as a FMT string. gdb/ChangeLog: * printcmd.c (skip_over_slash_fmt): Reorder code to ensure in_fmt is always initialized.
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r--gdb/printcmd.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index a9c64b9..e95b880 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -1258,27 +1258,38 @@ skip_over_slash_fmt (completion_tracker &tracker, const char **args)
bool in_fmt;
tracker.set_use_custom_word_point (true);
- if (ISALNUM (text[1]) || ISSPACE (text[1]))
+ if (text[1] == '\0')
{
- /* Skip over the actual format specification. */
+ /* The user tried to complete after typing just the '/' character
+ of the /FMT string. Step the completer past the '/', but we
+ don't offer any completions. */
+ in_fmt = true;
+ ++text;
+ }
+ else
+ {
+ /* The user has typed some characters after the '/', we assume
+ this is a complete /FMT string, first skip over it. */
text = skip_to_space (text);
if (*text == '\0')
{
+ /* We're at the end of the input string. The user has typed
+ '/FMT' and asked for a completion. Push an empty
+ completion string, this will cause readline to insert a
+ space so the user now has '/FMT '. */
in_fmt = true;
tracker.add_completion (make_unique_xstrdup (text));
}
else
{
+ /* The user has already typed things after the /FMT, skip the
+ whitespace and return false. Whoever called this function
+ should then try to complete what comes next. */
in_fmt = false;
text = skip_spaces (text);
}
}
- else if (text[1] == '\0')
- {
- in_fmt = true;
- ++text;
- }
tracker.advance_custom_word_point_by (text - *args);
*args = text;