Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi via Gdb-patches <gdb-patches@sourceware.org>
To: Marco Barisione <mbarisione@undo.io>, gdb-patches@sourceware.org
Subject: Re: [PATCH v2 4/5] gdb: generate the prefix name for prefix commands on demand
Date: Mon, 8 Mar 2021 18:25:30 -0500	[thread overview]
Message-ID: <1b0b042b-f8f4-c350-dcbf-1f617670f24f@polymtl.ca> (raw)
In-Reply-To: <20210125112649.56362-5-mbarisione@undo.io>

On 2021-01-25 6:26 a.m., Marco Barisione via Gdb-patches wrote:
> Previously, the prefixname field of struct cmd_list_element was manually
> set for prefix commands.  This seems verbose and error prone as it
> required every single call to functions adding prefix commands to
> specify the prefix name while the same information can be easily
> generated.
> 
> Historically, this was not possible as the prefix field was null for
> many commands, but this was fixed in commit
> 3f4d92ebdf7f848b5ccc9e8d8e8514c64fde1183 by Philippe Waroquiers, so
> we can rely on the prefix field being set when generating the prefix
> name.

Sounds like a good idea to me.  The patch is ok to push with these nits
fixed.

> 
> This commit also fixes a free after in this scenario:

"a free" -> "a use after free"?

> * A command gets created via Python (using the gdb.Command class).
>   The prefix name member is dynamically allocated.
> * An alias to the new command is created. The alias's prefixname is set
>   to point to the prefixname for the original command with a direct
>   assignment.
> * A new command with the same name as the Python command is created.
> * The object for the original Python command gets freed and its
>   prefixname gets freed as well.
> * The alias is update to point to the new command, but its prefixname
>   is not updated so it keeps pointing to the freed one.
> 
> gdb/ChangeLog:
> 
> 	* command.h (add_prefix_cmd): Remove the prefixname argument as
> 	it can now be generated automatically.
> 	(add_basic_prefix_cmd): Ditto.
> 	(add_show_prefix_cmd): Ditto.
> 	(add_prefix_cmd_suppress_notification): Ditto.
> 	(add_abbrev_prefix_cmd): Ditto.
> 	* cli/cli-decode.h (struct cmd_list_element): Replace the
> 	prefixname member variable with a method which generates the
> 	prefix name at runtime.
> 	* python/py-cmd.c (cmdpy_destroyer): Remove code to free the
> 	prefixname member as it's now a method.
> 	(cmdpy_function): Determine if the command is a prefix by
> 	looking at prefixlist, not prefixname.
> 	(cmdpy_init): Remove code to generate the prefix name.
> 	* cli/cli-decode.c (add_alias_cmd): Do not set prefixname on
> 	aliases.
> 	(do_prefix_cmd): Do not pass the prefixname argument to
> 	help_list.
> 	(add_prefix_cmd): Remove the prefixname argument.
> 	(add_basic_prefix_cmd): Ditto.
> 	(add_show_prefix_cmd): Ditto.
> 	(add_abbrev_prefix_cmd): Ditto.
> 	(fput_command_name_styled): Use the prefixname method.
> 	(apropos_cmd): Ditto.
> 	(help_cmd): Ditto.
> 	(lookup_cmd): Ditto.
> 	(deprecated_cmd_warning): Ditto.
> 	* cli/cli-script.c (do_define_command): Do not set the prefix
> 	name.
> 	(define_prefix_command): Ditto.
> 	(show_user_1): Uupdate to use the prefixname method.
> 	* cli/cli-setshow.c (cmd_show_list): Ditto.
> 	* top.c (execute_command): Ditto.
> 	* unittests/command-def-selftests.c (check_doc): Ditto.
> 	(traverse_command_structure): Ditto.
> 	* ada-lang.c (_initialize_ada_language): Do not pass the prefix
> 	name as it's not needed any more.
> 	* arm-tdep.c (_initialize_arm_tdep): Ditto.
> 	* auto-load.c: Ditto.
> 	* breakpoint.c: Ditto.
> 	* bsd-kvm.c: Ditto.
> 	* btrace.c: Ditto.
> 	* cli/cli-cmds.c: Ditto.
> 	* cli/cli-dump.c (_initialize_cli_dump): Ditto.
> 	* cli/cli-logging.c (_initialize_cli_logging): Ditto.
> 	* cli/cli-style.c (cli_style_option::add_setshow_commands): Ditto.
> 	* cli/cli-style.h (class cli_style_option): Ditto.
> 	* compile/compile.c: Ditto.
> 	* cp-support.c (_initialize_cp_support): Ditto.
> 	* dcache.c: Ditto.
> 	* dwarf2/index-cache.c (_initialize_index_cache): Ditto.
> 	* dwarf2/read.c: Ditto.
> 	* f-lang.c (_initialize_f_language): Ditto.
> 	* frame.c: Ditto.
> 	* gnu-nat.c (add_thread_commands): Ditto.
> 	* go32-nat.c (DJGPP): Ditto.
> 	* guile/guile.c: Ditto.
> 	* guile/scm-cmd.c (gdbscm_register_command_x): Ditto.
> 	* i386-tdep.c: Ditto.
> 	* infcmd.c: Ditto.
> 	* language.c (_initialize_language): Ditto.
> 	* macrocmd.c (_initialize_macrocmd): Ditto.
> 	* maint-test-options.c: Ditto.
> 	* maint-test-settings.c: Ditto.
> 	* maint.c: Ditto.
> 	* memattr.c: Ditto.
> 	* mips-tdep.c (_initialize_mips_tdep): Ditto.
> 	* printcmd.c: Ditto.
> 	* probe.c: Ditto.
> 	* python/python.c: Ditto.
> 	* ravenscar-thread.c (_initialize_ravenscar): Ditto.
> 	* record-btrace.c (_initialize_record_btrace): Ditto.
> 	* record-full.c (_initialize_record_full): Ditto.
> 	* record.c: Ditto.
> 	* remote.c: Ditto.
> 	* riscv-tdep.c (_initialize_riscv_tdep): Ditto.
> 	* rs6000-tdep.c (_initialize_rs6000_tdep): Ditto.
> 	* ser-tcp.c: Ditto.
> 	* serial.c: Ditto.
> 	* sh-tdep.c (_initialize_sh_tdep): Ditto.
> 	* skip.c: Ditto.
> 	* sparc64-tdep.c (_initialize_sparc64_adi_tdep): Ditto.
> 	* stack.c: Ditto.
> 	* symfile.c: Ditto.
> 	* symtab.c: Ditto.
> 	* target-descriptions.c: Ditto.
> 	* target.c: Ditto.
> 	* thread.c: Ditto.
> 	* tracepoint.c: Ditto.
> 	* tui/tui-layout.c: Ditto.
> 	* tui/tui-win.c (tui_get_cmd_list): Ditto.
> 	(_initialize_tui_win): Ditto.
> 	* typeprint.c: Ditto.
> 	* utils.c (add_internal_problem_command): Ditto.
> 	* valprint.c: Ditto.
> 	* value.c: Ditto.
> 	* windows-tdep.c (init_w32_command_list): Ditto.

IMO it's not really useful to list all the spots that were just
trivially adjusted.  It's ok to write things like:

  * command.h (add_prefix_cmd): Remove prefixname parameter.  Update all
  callers.

... and then skip listing all callers.  That will also help preserve
your sanity.

> diff --git a/gdb/cli/cli-decode.h b/gdb/cli/cli-decode.h
> index e6907a95a84..ddcb2ea9578 100644
> --- a/gdb/cli/cli-decode.h
> +++ b/gdb/cli/cli-decode.h
> @@ -71,6 +71,26 @@ struct cmd_list_element
>  
>      DISABLE_COPY_AND_ASSIGN (cmd_list_element);
>  
> +    /* For prefix commands, retun a string containing prefix commands to

retun -> return

> +       get here: this one plus any others needed to get to it.  Ends in a
> +       space.  It is used before the word "command" in describing the
> +       commands reached through this prefix.
> +
> +       For non-prefix commands, an empty string is returned.  */
> +    std::string prefixname ()
> +      {
> +	if (prefixlist == nullptr)
> +	  /* Not a prefix command.  */
> +	  return "";
> +
> +	std::string prefixname;
> +	if (prefix != nullptr)
> +	  prefixname = prefix->prefixname ();
> +	prefixname += name;
> +	prefixname += " ";
> +	return prefixname;
> +      }

De-indent the whole block by one (see the methods just above).

Simon

  reply	other threads:[~2021-03-08 23:25 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-08 10:07 [PATCH 0/4] Add support for command renaming Marco Barisione via Gdb-patches
2021-01-08 10:07 ` [PATCH 1/4] gdb: add lookup_cmd_exact to simplify a common pattern Marco Barisione via Gdb-patches
2021-01-10  0:06   ` Lancelot SIX via Gdb-patches
2021-01-17 10:47     ` Marco Barisione via Gdb-patches
2021-01-17 19:02       ` Lancelot SIX via Gdb-patches
2021-01-25 11:33         ` Luis Machado via Gdb-patches
2021-01-08 10:07 ` [PATCH 2/4] gdb: prevent prefix commands from being hooks Marco Barisione via Gdb-patches
2021-01-08 10:07 ` [PATCH 3/4] gdb: update the docs for add_cmd and do_add_cmd to match reality Marco Barisione via Gdb-patches
2021-01-08 10:07 ` [PATCH 4/4] gdb: Add support for renaming commands Marco Barisione via Gdb-patches
2021-01-08 10:30   ` Eli Zaretskii via Gdb-patches
2021-01-25 11:26 ` [PATCH v2 0/5] Add support for command renaming Marco Barisione via Gdb-patches
2021-01-25 11:26   ` [PATCH v2 1/5] gdb: add lookup_cmd_exact to simplify a common pattern Marco Barisione via Gdb-patches
2021-03-08 18:58     ` Simon Marchi
2021-05-07 14:47       ` Marco Barisione via Gdb-patches
2021-01-25 11:26   ` [PATCH v2 2/5] gdb: prevent prefix commands from being hooks Marco Barisione via Gdb-patches
2021-03-08 21:32     ` Simon Marchi via Gdb-patches
2021-03-09  9:42       ` Marco Barisione via Gdb-patches
2021-03-16  3:17         ` Simon Marchi via Gdb-patches
2021-05-07 14:59           ` Marco Barisione via Gdb-patches
2021-05-07 19:30             ` Simon Marchi via Gdb-patches
2021-05-07 20:11               ` Marco Barisione via Gdb-patches
2021-05-14 20:38       ` [PATCH v3 " Marco Barisione via Gdb-patches
2021-01-25 11:26   ` [PATCH v2 3/5] gdb: update the docs for add_cmd and do_add_cmd to match reality Marco Barisione via Gdb-patches
2021-03-08 22:52     ` Simon Marchi via Gdb-patches
2021-03-08 23:10       ` Simon Marchi via Gdb-patches
2021-05-14 20:39       ` [PATCH v3 3/5] gdb: move declarations and docs for cli-decode.c to cli-decode.h Marco Barisione via Gdb-patches
2021-01-25 11:26   ` [PATCH v2 4/5] gdb: generate the prefix name for prefix commands on demand Marco Barisione via Gdb-patches
2021-03-08 23:25     ` Simon Marchi via Gdb-patches [this message]
2021-03-16 17:00       ` Simon Marchi via Gdb-patches
2021-05-12 11:10       ` Marco Barisione via Gdb-patches
2021-01-25 11:26   ` [PATCH v2 5/5] gdb: Add support for renaming commands Marco Barisione via Gdb-patches
2021-03-23 18:45     ` Simon Marchi via Gdb-patches
2021-05-14 20:41       ` [PATCH v3 5/5] gdb: add " Marco Barisione via Gdb-patches
2021-02-08 17:53   ` [PING] [PATCH v2 0/5] Add support for command renaming Marco Barisione via Gdb-patches
2021-02-15  8:27     ` [PING2] " Marco Barisione via Gdb-patches
2021-02-22  8:28       ` [PING 3] " Marco Barisione via Gdb-patches
2021-03-01  8:32         ` [PING 4] " Marco Barisione via Gdb-patches
2021-03-08  9:23           ` [PING 5] " Marco Barisione via Gdb-patches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1b0b042b-f8f4-c350-dcbf-1f617670f24f@polymtl.ca \
    --to=gdb-patches@sourceware.org \
    --cc=mbarisione@undo.io \
    --cc=simon.marchi@polymtl.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox