diff options
author | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2020-05-09 16:17:45 +0200 |
---|---|---|
committer | Philippe Waroquiers <philippe.waroquiers@skynet.be> | 2020-05-15 22:17:45 +0200 |
commit | 89bcba74f89baceba3fa7387622e3d60e1de02e8 (patch) | |
tree | 2f91d85620ff9930aaa2c2709fd7cf71014db9f5 /gdb/unittests/command-def-selftests.c | |
parent | 3f4d92ebdf7f848b5ccc9e8d8e8514c64fde1183 (diff) | |
download | gdb-89bcba74f89baceba3fa7387622e3d60e1de02e8.zip gdb-89bcba74f89baceba3fa7387622e3d60e1de02e8.tar.gz gdb-89bcba74f89baceba3fa7387622e3d60e1de02e8.tar.bz2 |
command-def-selftests.c: detect missing or wrong prefix cmd in subcommands.
This test revealed a number of problems that are fixed in the previous commit.
2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* unittests/command-def-selftests.c (traverse_command_structure):
Verify all commands of a list have the same prefix command and
that only the top cmdlist commands have a null prefix.
Diffstat (limited to 'gdb/unittests/command-def-selftests.c')
-rw-r--r-- | gdb/unittests/command-def-selftests.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/gdb/unittests/command-def-selftests.c b/gdb/unittests/command-def-selftests.c index db70743..2146f80 100644 --- a/gdb/unittests/command-def-selftests.c +++ b/gdb/unittests/command-def-selftests.c @@ -106,20 +106,26 @@ help_doc_invariants_tests () namespace command_structure_tests { +/* Nr of commands in which a duplicated list is found. */ unsigned int nr_duplicates = 0; +/* Nr of commands in a list having no valid prefix cmd. */ +unsigned int nr_invalid_prefixcmd = 0; /* A map associating a list with the prefix leading to it. */ std::map<cmd_list_element **, const char *> lists; /* Store each command list in lists, associated with the prefix to reach it. A - list must only be found once. */ + list must only be found once. + + Verifies that all elements of the list have the same non-null prefix + command. */ static void traverse_command_structure (struct cmd_list_element **list, const char *prefix) { - struct cmd_list_element *c; + struct cmd_list_element *c, *prefixcmd; auto dupl = lists.find (list); if (dupl != lists.end ()) @@ -137,6 +143,13 @@ traverse_command_structure (struct cmd_list_element **list, lists.insert ({list, prefix}); + /* All commands of *list must have a prefix command equal to PREFIXCMD, + the prefix command of the first command. */ + if (*list == nullptr) + prefixcmd = nullptr; /* A prefix command with an empty subcommand list. */ + else + prefixcmd = (*list)->prefix; + /* Walk through the commands. */ for (c = *list; c; c = c->next) { @@ -148,6 +161,23 @@ traverse_command_structure (struct cmd_list_element **list, passing the right prefix in. */ traverse_command_structure (c->prefixlist, c->prefixname); } + if (prefixcmd != c->prefix + || (prefixcmd == nullptr && *list != cmdlist)) + { + if (c->prefix == nullptr) + fprintf_filtered (gdb_stdout, + "list %p reachable via prefix '%s'." + " command '%s' has null prefixcmd\n", + list, + prefix, c->name); + else + fprintf_filtered (gdb_stdout, + "list %p reachable via prefix '%s'." + " command '%s' has a different prefixcmd\n", + list, + prefix, c->name); + nr_invalid_prefixcmd++; + } } } @@ -157,12 +187,15 @@ static void command_structure_invariants_tests () { nr_duplicates = 0; + nr_invalid_prefixcmd = 0; + traverse_command_structure (&cmdlist, ""); /* Release memory, be ready to be re-run. */ lists.clear (); SELF_CHECK (nr_duplicates == 0); + SELF_CHECK (nr_invalid_prefixcmd == 0); } } |