From patchwork Sat May 19 16:06:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 27338 Received: (qmail 60211 invoked by alias); 19 May 2018 16:06:15 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 60065 invoked by uid 89); 19 May 2018 16:06:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=responsibility, sal, tokens, sk:discard X-HELO: gateway34.websitewelcome.com Received: from gateway34.websitewelcome.com (HELO gateway34.websitewelcome.com) (192.185.148.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 19 May 2018 16:06:11 +0000 Received: from cm13.websitewelcome.com (cm13.websitewelcome.com [100.42.49.6]) by gateway34.websitewelcome.com (Postfix) with ESMTP id 7609D10F400 for ; Sat, 19 May 2018 11:06:10 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id K4N0fXDZjQUwqK4N0fDoTM; Sat, 19 May 2018 11:06:10 -0500 X-Authority-Reason: nr=8 Received: from 174-29-44-154.hlrn.qwest.net ([174.29.44.154]:37004 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89_1) (envelope-from ) id 1fK4N0-002Uoe-5y; Sat, 19 May 2018 11:06:10 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 3/3] Change ada_catchpoint::excep_string to be a std::string Date: Sat, 19 May 2018 10:06:06 -0600 Message-Id: <20180519160606.19969-4-tom@tromey.com> In-Reply-To: <20180519160606.19969-1-tom@tromey.com> References: <20180519160606.19969-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1fK4N0-002Uoe-5y X-Source-Sender: 174-29-44-154.hlrn.qwest.net (bapiya.Home) [174.29.44.154]:37004 X-Source-Auth: tom+tromey.com X-Email-Count: 4 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes This changes ada_catchpoint::excep_string to be a std::string and then fixes up all t he users. This found a memory leak in catch_ada_exception_command_split, where "cond" was copied but never freed. I changed the type of the "cond_string" argument to catch_ada_exception_command_split to follow the rule that out parameters should be pointers and not references. This patch enables the removal of some cleanups and also the function ada_get_next_arg. gdb/ChangeLog 2018-05-18 Tom Tromey * mi/mi-cmd-catch.c (mi_cmd_catch_assert) (mi_cmd_catch_exception, mi_cmd_catch_handlers): Update. * ada-lang.h (create_ada_exception_catchpoint): Update. * ada-lang.c (struct ada_catchpoint) : Now a std::string. (create_excep_cond_exprs, ~ada_catchpoint) (should_stop_exception, print_one_exception) (print_mention_exception, print_recreate_exception): Update. (ada_get_next_arg): Remove. (catch_ada_exception_command_split): Use std::string. Change type of "excep_string", "cond_string". (catch_ada_exception_command): Update. (create_ada_exception_catchpoint): Change type of excep_string. (ada_exception_sal): Remove excep_string parameter. --- gdb/ChangeLog | 17 +++++++ gdb/ada-lang.c | 122 +++++++++++++++----------------------------------- gdb/ada-lang.h | 2 +- gdb/mi/mi-cmd-catch.c | 18 +++----- 4 files changed, 59 insertions(+), 100 deletions(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index cbb0fe9d82..159c1a0da2 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -12480,7 +12480,7 @@ struct ada_catchpoint : public breakpoint ~ada_catchpoint () override; /* The name of the specific exception the user specified. */ - char *excep_string; + std::string excep_string; }; /* Parse the exception condition string in the context of each of the @@ -12493,7 +12493,7 @@ create_excep_cond_exprs (struct ada_catchpoint *c, struct bp_location *bl; /* Nothing to do if there's no specific exception to catch. */ - if (c->excep_string == NULL) + if (c->excep_string.empty ()) return; /* Same if there are no locations... */ @@ -12503,7 +12503,7 @@ create_excep_cond_exprs (struct ada_catchpoint *c, /* Compute the condition expression in text form, from the specific expection we want to catch. */ std::string cond_string - = ada_exception_catchpoint_cond_string (c->excep_string, ex); + = ada_exception_catchpoint_cond_string (c->excep_string.c_str (), ex); /* Iterate over all the catchpoint's locations, and parse an expression for each. */ @@ -12541,7 +12541,6 @@ create_excep_cond_exprs (struct ada_catchpoint *c, ada_catchpoint::~ada_catchpoint () { - xfree (this->excep_string); } /* Implement the ALLOCATE_LOCATION method in the breakpoint_ops @@ -12584,7 +12583,7 @@ should_stop_exception (const struct bp_location *bl) int stop; /* With no specific exception, should always stop. */ - if (c->excep_string == NULL) + if (c->excep_string.empty ()) return 1; if (ada_loc->excep_cond_expr == NULL) @@ -12734,12 +12733,12 @@ print_one_exception (enum ada_exception_catchpoint_kind ex, switch (ex) { case ada_catch_exception: - if (c->excep_string != NULL) + if (!c->excep_string.empty ()) { - char *msg = xstrprintf (_("`%s' Ada exception"), c->excep_string); + std::string msg = string_printf (_("`%s' Ada exception"), + c->excep_string.c_str ()); uiout->field_string ("what", msg); - xfree (msg); } else uiout->field_string ("what", "all Ada exceptions"); @@ -12751,11 +12750,11 @@ print_one_exception (enum ada_exception_catchpoint_kind ex, break; case ada_catch_handlers: - if (c->excep_string != NULL) + if (!c->excep_string.empty ()) { uiout->field_fmt ("what", _("`%s' Ada exception handlers"), - c->excep_string); + c->excep_string.c_str ()); } else uiout->field_string ("what", "all Ada exceptions handlers"); @@ -12789,10 +12788,10 @@ print_mention_exception (enum ada_exception_catchpoint_kind ex, switch (ex) { case ada_catch_exception: - if (c->excep_string != NULL) + if (!c->excep_string.empty ()) { std::string info = string_printf (_("`%s' Ada exception"), - c->excep_string); + c->excep_string.c_str ()); uiout->text (info.c_str ()); } else @@ -12804,11 +12803,11 @@ print_mention_exception (enum ada_exception_catchpoint_kind ex, break; case ada_catch_handlers: - if (c->excep_string != NULL) + if (!c->excep_string.empty ()) { std::string info = string_printf (_("`%s' Ada exception handlers"), - c->excep_string); + c->excep_string.c_str ()); uiout->text (info.c_str ()); } else @@ -12838,8 +12837,8 @@ print_recreate_exception (enum ada_exception_catchpoint_kind ex, { case ada_catch_exception: fprintf_filtered (fp, "catch exception"); - if (c->excep_string != NULL) - fprintf_filtered (fp, " %s", c->excep_string); + if (!c->excep_string.empty ()) + fprintf_filtered (fp, " %s", c->excep_string.c_str ()); break; case ada_catch_exception_unhandled: @@ -13048,40 +13047,6 @@ print_recreate_catch_handlers (struct breakpoint *b, static struct breakpoint_ops catch_handlers_breakpoint_ops; -/* Return a newly allocated copy of the first space-separated token - in ARGSP, and then adjust ARGSP to point immediately after that - token. - - Return NULL if ARGPS does not contain any more tokens. */ - -static char * -ada_get_next_arg (const char **argsp) -{ - const char *args = *argsp; - const char *end; - char *result; - - args = skip_spaces (args); - if (args[0] == '\0') - return NULL; /* No more arguments. */ - - /* Find the end of the current argument. */ - - end = skip_to_space (args); - - /* Adjust ARGSP to point to the start of the next argument. */ - - *argsp = end; - - /* Make a copy of the current argument and return it. */ - - result = (char *) xmalloc (end - args + 1); - strncpy (result, args, end - args); - result[end - args] = '\0'; - - return result; -} - /* Split the arguments specified in a "catch exception" command. Set EX to the appropriate catchpoint type. Set EXCEP_STRING to the name of the specific exception if @@ -13096,24 +13061,20 @@ static void catch_ada_exception_command_split (const char *args, bool is_catch_handlers_cmd, enum ada_exception_catchpoint_kind *ex, - char **excep_string, - std::string &cond_string) + std::string *excep_string, + std::string *cond_string) { - struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); - char *exception_name; - char *cond = NULL; + std::string exception_name; - exception_name = ada_get_next_arg (&args); - if (exception_name != NULL && strcmp (exception_name, "if") == 0) + exception_name = extract_arg (&args); + if (exception_name == "if") { /* This is not an exception name; this is the start of a condition expression for a catchpoint on all exceptions. So, "un-get" this token, and set exception_name to NULL. */ - xfree (exception_name); - exception_name = NULL; + exception_name.clear (); args -= 2; } - make_cleanup (xfree, exception_name); /* Check to see if we have a condition. */ @@ -13126,8 +13087,7 @@ catch_ada_exception_command_split (const char *args, if (args[0] == '\0') error (_("Condition missing after `if' keyword")); - cond = xstrdup (args); - make_cleanup (xfree, cond); + *cond_string = args; args += strlen (args); } @@ -13138,25 +13098,23 @@ catch_ada_exception_command_split (const char *args, if (args[0] != '\0') error (_("Junk at end of expression")); - discard_cleanups (old_chain); - if (is_catch_handlers_cmd) { /* Catch handling of exceptions. */ *ex = ada_catch_handlers; *excep_string = exception_name; } - else if (exception_name == NULL) + else if (exception_name.empty ()) { /* Catch all exceptions. */ *ex = ada_catch_exception; - *excep_string = NULL; + excep_string->clear (); } - else if (strcmp (exception_name, "unhandled") == 0) + else if (exception_name == "unhandled") { /* Catch unhandled exceptions. */ *ex = ada_catch_exception_unhandled; - *excep_string = NULL; + excep_string->clear (); } else { @@ -13164,8 +13122,6 @@ catch_ada_exception_command_split (const char *args, *ex = ada_catch_exception; *excep_string = exception_name; } - if (cond != NULL) - cond_string.assign (cond); } /* Return the name of the symbol on which we should break in order to @@ -13289,15 +13245,12 @@ ada_exception_catchpoint_cond_string (const char *excep_string, /* Return the symtab_and_line that should be used to insert an exception catchpoint of the TYPE kind. - EXCEP_STRING should contain the name of a specific exception that - the catchpoint should catch, or NULL otherwise. - ADDR_STRING returns the name of the function where the real breakpoint that implements the catchpoints is set, depending on the type of catchpoint we need to create. */ static struct symtab_and_line -ada_exception_sal (enum ada_exception_catchpoint_kind ex, char *excep_string, +ada_exception_sal (enum ada_exception_catchpoint_kind ex, const char **addr_string, const struct breakpoint_ops **ops) { const char *sym_name; @@ -13333,13 +13286,11 @@ ada_exception_sal (enum ada_exception_catchpoint_kind ex, char *excep_string, EX_KIND is the kind of exception catchpoint to be created. - If EXCEPT_STRING is NULL, this catchpoint is expected to trigger + If EXCEPT_STRING is empty, this catchpoint is expected to trigger for all exceptions. Otherwise, EXCEPT_STRING indicates the name - of the exception to which this catchpoint applies. When not NULL, - the string must be allocated on the heap, and its deallocation - is no longer the responsibility of the caller. + of the exception to which this catchpoint applies. - COND_STRING, if not NULL, is the catchpoint condition. This string + COND_STRING, if not empty, is the catchpoint condition. This string must be allocated on the heap, and its deallocation is no longer the responsibility of the caller. @@ -13351,7 +13302,7 @@ ada_exception_sal (enum ada_exception_catchpoint_kind ex, char *excep_string, void create_ada_exception_catchpoint (struct gdbarch *gdbarch, enum ada_exception_catchpoint_kind ex_kind, - char *excep_string, + const std::string &excep_string, const std::string &cond_string, int tempflag, int disabled, @@ -13359,8 +13310,7 @@ create_ada_exception_catchpoint (struct gdbarch *gdbarch, { const char *addr_string = NULL; const struct breakpoint_ops *ops = NULL; - struct symtab_and_line sal - = ada_exception_sal (ex_kind, excep_string, &addr_string, &ops); + struct symtab_and_line sal = ada_exception_sal (ex_kind, &addr_string, &ops); std::unique_ptr c (new ada_catchpoint ()); init_ada_exception_breakpoint (c.get (), gdbarch, sal, addr_string, @@ -13382,7 +13332,7 @@ catch_ada_exception_command (const char *arg_entry, int from_tty, struct gdbarch *gdbarch = get_current_arch (); int tempflag; enum ada_exception_catchpoint_kind ex_kind; - char *excep_string = NULL; + std::string excep_string; std::string cond_string; tempflag = get_cmd_context (command) == CATCH_TEMPORARY; @@ -13390,7 +13340,7 @@ catch_ada_exception_command (const char *arg_entry, int from_tty, if (!arg) arg = ""; catch_ada_exception_command_split (arg, false, &ex_kind, &excep_string, - cond_string); + &cond_string); create_ada_exception_catchpoint (gdbarch, ex_kind, excep_string, cond_string, tempflag, 1 /* enabled */, @@ -13407,7 +13357,7 @@ catch_ada_handlers_command (const char *arg_entry, int from_tty, struct gdbarch *gdbarch = get_current_arch (); int tempflag; enum ada_exception_catchpoint_kind ex_kind; - char *excep_string = NULL; + std::string excep_string; std::string cond_string; tempflag = get_cmd_context (command) == CATCH_TEMPORARY; @@ -13415,7 +13365,7 @@ catch_ada_handlers_command (const char *arg_entry, int from_tty, if (!arg) arg = ""; catch_ada_exception_command_split (arg, true, &ex_kind, &excep_string, - cond_string); + &cond_string); create_ada_exception_catchpoint (gdbarch, ex_kind, excep_string, cond_string, tempflag, 1 /* enabled */, diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h index 09e7b403f2..a4192fc8a5 100644 --- a/gdb/ada-lang.h +++ b/gdb/ada-lang.h @@ -377,7 +377,7 @@ extern char *ada_main_name (void); extern void create_ada_exception_catchpoint (struct gdbarch *gdbarch, enum ada_exception_catchpoint_kind ex_kind, - char *excep_string, const std::string &cond_string, int tempflag, + const std::string &excep_string, const std::string &cond_string, int tempflag, int disabled, int from_tty); /* Some information about a given Ada exception. */ diff --git a/gdb/mi/mi-cmd-catch.c b/gdb/mi/mi-cmd-catch.c index 078e73ab6a..77c9f952f5 100644 --- a/gdb/mi/mi-cmd-catch.c +++ b/gdb/mi/mi-cmd-catch.c @@ -79,8 +79,8 @@ mi_cmd_catch_assert (const char *cmd, char *argv[], int argc) error (_("Invalid argument: %s"), argv[oind]); scoped_restore restore_breakpoint_reporting = setup_breakpoint_reporting (); - create_ada_exception_catchpoint (gdbarch, ada_catch_assert, - NULL, condition, temp, enabled, 0); + create_ada_exception_catchpoint (gdbarch, ada_catch_assert, std::string (), + condition, temp, enabled, 0); } /* Handler for the -catch-exception command. */ @@ -91,7 +91,7 @@ mi_cmd_catch_exception (const char *cmd, char *argv[], int argc) struct gdbarch *gdbarch = get_current_arch(); std::string condition; int enabled = 1; - char *exception_name = NULL; + std::string exception_name; int temp = 0; enum ada_exception_catchpoint_kind ex_kind = ada_catch_exception; @@ -148,14 +148,10 @@ mi_cmd_catch_exception (const char *cmd, char *argv[], int argc) /* Specifying an exception name does not make sense when requesting an unhandled exception breakpoint. */ - if (ex_kind == ada_catch_exception_unhandled && exception_name != NULL) + if (ex_kind == ada_catch_exception_unhandled && !exception_name.empty ()) error (_("\"-e\" and \"-u\" are mutually exclusive")); scoped_restore restore_breakpoint_reporting = setup_breakpoint_reporting (); - /* create_ada_exception_catchpoint needs EXCEPTION_NAME to be - xstrdup'ed, and will assume control of its lifetime. */ - if (exception_name != NULL) - exception_name = xstrdup (exception_name); create_ada_exception_catchpoint (gdbarch, ex_kind, exception_name, condition, temp, enabled, 0); @@ -169,7 +165,7 @@ mi_cmd_catch_handlers (const char *cmd, char *argv[], int argc) struct gdbarch *gdbarch = get_current_arch (); std::string condition; int enabled = 1; - char *exception_name = NULL; + std::string exception_name; int temp = 0; int oind = 0; @@ -220,10 +216,6 @@ mi_cmd_catch_handlers (const char *cmd, char *argv[], int argc) scoped_restore restore_breakpoint_reporting = setup_breakpoint_reporting (); - /* create_ada_exception_catchpoint needs EXCEPTION_NAME to be - xstrdup'ed, and will assume control of its lifetime. */ - if (exception_name != NULL) - exception_name = xstrdup (exception_name); create_ada_exception_catchpoint (gdbarch, ada_catch_handlers, exception_name, condition, temp, enabled, 0);