Fix "set integer-command unlimited junk"
authorPedro Alves <palves@redhat.com>
Thu, 13 Jun 2019 14:22:44 +0000 (15:22 +0100)
committerPedro Alves <palves@redhat.com>
Thu, 13 Jun 2019 14:22:44 +0000 (15:22 +0100)
With integer commands that support "unlimited", we currently fail to
notice junk after "unlimited":

 (gdb) show print elements
 Limit on string chars or array elements to print is 200.
 (gdb) set print elements unlimited foo
 (gdb) show print elements
 Limit on string chars or array elements to print is unlimited.

This commit fixes that.  After, we get:

 (gdb) set print elements unlimited foo
 Junk after "unlimited": foo

gdb/ChangeLog:
2019-06-13  Pedro Alves  <palves@redhat.com>

* cli/cli-setshow.c (cli/cli-setshow.c): New parameter
'expression'.  When parsing an expression, error out if there's
junk after "unlimited".
(parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited)
(do_set_command): Adjust calls to is_unlimited_literal.

gdb/testsuite/ChangeLog:
2019-06-13  Pedro Alves  <palves@redhat.com>

* gdb.base/settings.exp (test-integer): Test junk after
"unlimited".

gdb/ChangeLog
gdb/cli/cli-setshow.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/settings.exp

index 029acd14dc91acabea6440969ec2bedf9b64c566..91f3b7549ab3276b2aa8623c9133952b9d4badc0 100644 (file)
@@ -1,3 +1,11 @@
+2019-06-13  Pedro Alves  <palves@redhat.com>
+
+       * cli/cli-setshow.c (cli/cli-setshow.c): New parameter
+       'expression'.  When parsing an expression, error out if there's
+       junk after "unlimited".
+       (parse_cli_var_uinteger, parse_cli_var_zuinteger_unlimited)
+       (do_set_command): Adjust calls to is_unlimited_literal.
+
 2019-06-13  Pedro Alves  <palves@redhat.com>
 
        * compile/compile.c (make_compile_options_def_group): Add braces
index 14ea723c6a98820f346db6fd721ae99cf9ee6ac2..8199fa7c0b0199ea21b5e37637ec26bf791aac84 100644 (file)
@@ -150,10 +150,12 @@ deprecated_show_value_hack (struct ui_file *ignore_file,
 /* Returns true if ARG is "unlimited".  */
 
 static bool
-is_unlimited_literal (const char **arg)
+is_unlimited_literal (const char **arg, bool expression)
 {
   *arg = skip_spaces (*arg);
 
+  const char *unl_start = *arg;
+
   const char *p = skip_to_space (*arg);
 
   size_t len = p - *arg;
@@ -161,6 +163,19 @@ is_unlimited_literal (const char **arg)
   if (len > 0 && strncmp ("unlimited", *arg, len) == 0)
     {
       *arg += len;
+
+      /* If parsing an expression (i.e., parsing for a "set" command),
+        anything after "unlimited" is junk.  For options, anything
+        after "unlimited" might be a command argument or another
+        option.  */
+      if (expression)
+       {
+         const char *after = skip_spaces (*arg);
+         if (*after != '\0')
+           error (_("Junk after \"%.*s\": %s"),
+                  (int) len, unl_start, after);
+       }
+
       return true;
     }
 
@@ -183,7 +198,7 @@ parse_cli_var_uinteger (var_types var_type, const char **arg,
        error_no_arg (_("integer to set it to."));
     }
 
-  if (var_type == var_uinteger && is_unlimited_literal (arg))
+  if (var_type == var_uinteger && is_unlimited_literal (arg, expression))
     val = 0;
   else if (expression)
     val = parse_and_eval_long (*arg);
@@ -213,7 +228,7 @@ parse_cli_var_zuinteger_unlimited (const char **arg, bool expression)
   if (*arg == nullptr)
     error_no_arg (_("integer to set it to, or \"unlimited\"."));
 
-  if (is_unlimited_literal (arg))
+  if (is_unlimited_literal (arg, expression))
     val = -1;
   else if (expression)
     val = parse_and_eval_long (*arg);
@@ -448,7 +463,7 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
              error_no_arg (_("integer to set it to."));
          }
 
-       if (c->var_type == var_integer && is_unlimited_literal (&arg))
+       if (c->var_type == var_integer && is_unlimited_literal (&arg, true))
          val = 0;
        else
          val = parse_and_eval_long (arg);
index 3a3a6e8132465a6b82e05764cd2e1cddc1e1d991..37e327d9f2adabcb42f945db920a233f4b1af1c0 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-13  Pedro Alves  <palves@redhat.com>
+
+       * gdb.base/settings.exp (test-integer): Test junk after
+       "unlimited".
+
 2019-06-13  Pedro Alves  <palves@redhat.com>
 
        * gdb.base/options.exp (test-thread-apply): New.
index 4a7319df4895a4318e72a0efa736722b2274856b..aeca67c0e7fcdbf05f5abdf37542430fb9ddac58 100644 (file)
@@ -141,8 +141,19 @@ proc test-integer {variant} {
            "$set_cmd unlimited"
     }
 
+    # Check junk after "unlimited".
     gdb_test "$set_cmd unlimitedu" "No symbol table is loaded.*"
 
+    if {$variant == "zinteger" || $variant == "zuinteger"} {
+       gdb_test "$set_cmd unlimited u" "No symbol table is loaded.*"
+       gdb_test "$set_cmd unlimited 1" "No symbol table is loaded.*"
+       gdb_test "$set_cmd unlimited -1" "No symbol table is loaded.*"
+    } else {
+       gdb_test "$set_cmd unlimited u" "Junk after \"unlimited\": u"
+       gdb_test "$set_cmd unlimited 1" "Junk after \"unlimited\": 1"
+       gdb_test "$set_cmd unlimited -1" "Junk after \"unlimited\": -1"
+    }
+
     test_gdb_complete_none "$set_cmd unlimited "
     test_gdb_complete_none "$set_cmd unlimitedu"
     test_gdb_complete_none "$set_cmd unlimited u"