Fix alias command not detecting non matching prefix & sometimes asserting.

alias_command does not detect that the prefixes of the alias command and the
aliased command are not matching: it is comparing the alias prefix
with itself, instead of comparing it with the aliased command prefix.

This causes either the alias command to silently do nothing,
or to have GDB asserting:
    (gdb) alias assigne imprime limite-elements = set print elements
    ../../binutils-gdb/gdb/cli/cli-cmds.c:1552: internal-error: void alias_command(const char*, int): Assertion `c_command != NULL && c_command != (struct cmd_list_element *) -1' failed.
    A problem internal to GDB has been detected,

Fix the logic, and update gdb.base/alias.exp to test these cases.

gdb/ChangeLog
2019-06-25  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* cli/cli-cmds.c (alias_command): Compare the alias prefix
	with the command prefix.

gdb/testsuite/ChangeLog
2019-06-25  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

	* gdb.base/alias.exp: Test non matching/non existing prefixes.
This commit is contained in:
Philippe Waroquiers 2019-06-23 15:34:15 +02:00
parent 9b444f9533
commit b65b566cdc
4 changed files with 64 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2019-06-25 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* cli/cli-cmds.c (alias_command): Compare the alias prefix
with the command prefix.
2019-06-25 Tom Tromey <tom@tromey.com> 2019-06-25 Tom Tromey <tom@tromey.com>
* tui/tui-wingeneral.c (tui_delete_win): Remove "return". * tui/tui-wingeneral.c (tui_delete_win): Remove "return".

View file

@ -1518,8 +1518,8 @@ alias_command (const char *args, int from_tty)
Example: alias spe = set print elements Example: alias spe = set print elements
Otherwise ALIAS and COMMAND must have the same number of words, Otherwise ALIAS and COMMAND must have the same number of words,
and every word except the last must match; and the last word of and every word except the last must identify the same prefix command;
ALIAS is made an alias of the last word of COMMAND. and the last word of ALIAS is made an alias of the last word of COMMAND.
Example: alias set print elms = set pr elem Example: alias set print elms = set pr elem
Note that unambiguous abbreviations are allowed. */ Note that unambiguous abbreviations are allowed. */
@ -1538,10 +1538,11 @@ alias_command (const char *args, int from_tty)
error (_("Mismatched command length between ALIAS and COMMAND.")); error (_("Mismatched command length between ALIAS and COMMAND."));
/* Create copies of ALIAS and COMMAND without the last word, /* Create copies of ALIAS and COMMAND without the last word,
and use that to verify the leading elements match. */ and use that to verify the leading elements give the same
prefix command. */
std::string alias_prefix_string (argv_to_string (alias_argv, std::string alias_prefix_string (argv_to_string (alias_argv,
alias_argc - 1)); alias_argc - 1));
std::string command_prefix_string (argv_to_string (alias_argv, std::string command_prefix_string (argv_to_string (command_argv.get (),
command_argc - 1)); command_argc - 1));
alias_prefix = alias_prefix_string.c_str (); alias_prefix = alias_prefix_string.c_str ();
command_prefix = command_prefix_string.c_str (); command_prefix = command_prefix_string.c_str ();

View file

@ -1,3 +1,7 @@
2019-06-23 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.base/alias.exp: Test non matching/non existing prefixes.
2019-06-25 Tom de Vries <tdevries@suse.de> 2019-06-25 Tom de Vries <tdevries@suse.de>
PR testsuite/24727 PR testsuite/24727

View file

@ -66,3 +66,53 @@ gdb_test_no_output "alias set pr elms = set p elem"
gdb_test_no_output "set pr elms 51" gdb_test_no_output "set pr elms 51"
gdb_test "show print elements" "Limit .* is 51\[.\]" "verify set pr elms" gdb_test "show print elements" "Limit .* is 51\[.\]" "verify set pr elms"
gdb_test "help set print" "set print elms .*" gdb_test "help set print" "set print elms .*"
# Verify alias command detects a non existing prefix.
gdb_test "alias assigne imprime limite-elements = set print elements" \
"ALIAS and COMMAND prefixes do not match\." \
"assigne imprime prefix not defined"
gdb_test "alias set imprime limite-elements = set print elements" \
"ALIAS and COMMAND prefixes do not match\." \
"set imprime prefix not defined"
# Verify alias command detects a non matching prefix.
gdb_test "alias set ada limite-elements = set print elements" \
"ALIAS and COMMAND prefixes do not match\." \
"mismatched prefix"
# Verify alias command detects a non matching prefix due to length.
gdb_test "alias set imprime-limite-elements = set print elements" \
"Mismatched command length between ALIAS and COMMAND\." \
"mismatched length"
# Gradually define the prefixes and the limite-elements command.
gdb_test_no_output "alias assigne = set" "alias assigne"
gdb_test_no_output "alias assigne imprime = set print" "alias assigne imprime"
gdb_test_no_output "alias assigne imprime limite-elements = set print elements" \
"alias assigne imprime limite-elements"
# Define an alias using the command prefix with a command using an alias prefix.
gdb_test_no_output "alias set print max-elements = assigne imprime elements" \
"alias set print max-elements using assigne imprime"
# Tests the resulting prefixes and commands.
gdb_test_no_output "assigne print elements 52"
gdb_test "show print elements" "Limit .* is 52\[.\]" "verify 52"
gdb_test_no_output "assigne imprime elements 53"
gdb_test "show print elements" "Limit .* is 53\[.\]" "verify 53"
gdb_test_no_output "assigne imprime limite-elements 54"
gdb_test "show print elements" "Limit .* is 54\[.\]" "verify 54"
gdb_test_no_output "set imprime elements 55"
gdb_test "show print elements" "Limit .* is 55\[.\]" "verify 55"
gdb_test_no_output "set print limite-elements 56"
gdb_test "show print elements" "Limit .* is 56\[.\]" "verify 56"
gdb_test_no_output "set print max-elements 57"
gdb_test "show print elements" "Limit .* is 57\[.\]" "verify 57"