From bc18fbb575437dd10089ef4619e46c0b9a93097d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 18 May 2018 15:58:50 -0600 Subject: [PATCH] Change ada_catchpoint::excep_string to be a std::string 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. ChangeLog 2018-05-21 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. (~ada_catchpoint): Remove. --- gdb/ChangeLog | 18 ++++++ gdb/ada-lang.c | 132 ++++++++++++------------------------------ gdb/ada-lang.h | 2 +- gdb/mi/mi-cmd-catch.c | 18 ++---- 4 files changed, 60 insertions(+), 110 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5d773566ec3..10a054fe748 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2018-05-21 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. + (~ada_catchpoint): Remove. + 2018-05-21 Tom Tromey * ada-lang.c (ada_collect_symbol_completion_matches): Remove diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index b05203f081f..eaf30585f5d 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -12476,10 +12476,8 @@ static const struct bp_location_ops ada_catchpoint_location_ops = 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 @@ -12492,7 +12490,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... */ @@ -12502,7 +12500,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. */ @@ -12536,13 +12534,6 @@ create_excep_cond_exprs (struct ada_catchpoint *c, } } -/* ada_catchpoint destructor. */ - -ada_catchpoint::~ada_catchpoint () -{ - xfree (this->excep_string); -} - /* Implement the ALLOCATE_LOCATION method in the breakpoint_ops structure for all exception catchpoint kinds. */ @@ -12583,7 +12574,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) @@ -12733,12 +12724,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"); @@ -12750,11 +12741,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"); @@ -12788,10 +12779,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 @@ -12803,11 +12794,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 @@ -12837,8 +12828,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: @@ -13047,40 +13038,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 @@ -13095,24 +13052,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. */ @@ -13125,8 +13078,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); } @@ -13137,25 +13089,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 { @@ -13163,8 +13113,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 @@ -13288,15 +13236,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; @@ -13332,15 +13277,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 - must be allocated on the heap, and its deallocation is no longer - the responsibility of the caller. + COND_STRING, if not empty, is the catchpoint condition. TEMPFLAG, if nonzero, means that the underlying breakpoint should be temporary. @@ -13350,7 +13291,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, @@ -13358,8 +13299,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, @@ -13381,7 +13321,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; @@ -13389,7 +13329,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 */, @@ -13406,7 +13346,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; @@ -13414,7 +13354,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 09e7b403f2a..a4192fc8a5a 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 078e73ab6ae..77c9f952f51 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); -- 2.30.2