gdb: fix potentially uninitialised variable
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 27 Nov 2020 10:46:07 +0000 (10:46 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 27 Nov 2020 14:55:55 +0000 (14:55 +0000)
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.

gdb/ChangeLog
gdb/printcmd.c

index aa08449d100f67a3ef6ac2f4f1f536cec8df8f05..e9beaaba6325e9f2938df34d18467e110bbbdc66 100644 (file)
@@ -1,3 +1,8 @@
+2020-11-27  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * printcmd.c (skip_over_slash_fmt): Reorder code to ensure in_fmt
+       is always initialized.
+
 2020-11-26  Przemyslaw Wirkus  <przemyslaw.wirkus@arm.com>
 
        * features/aarch64-fpu.c (create_feature_aarch64_fpu): Regenerate.
index a9c64b97c81dc6d9422709c7c41a59b18a4af9d0..e95b88029501c4da655a8d051d07346560126b1c 100644 (file)
@@ -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;