Fix "set integer-command unlimited junk"

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".
This commit is contained in:
Pedro Alves 2019-06-13 15:22:44 +01:00
parent 57a63d27dc
commit 4c04873103
4 changed files with 43 additions and 4 deletions

View 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

View 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);

View 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.

View 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"