aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2021-11-08 14:58:46 +0000
committerAndrew Burgess <aburgess@redhat.com>2021-11-16 17:45:45 +0000
commit8579fd136a614985bd27f20539c7bb7c5a51287d (patch)
treefb84850409a44e13e832cbadc9025d40c1d33d9f
parent2bb7589ddf61e163f2e414e7033fad56ea17e784 (diff)
downloadgdb-8579fd136a614985bd27f20539c7bb7c5a51287d.zip
gdb-8579fd136a614985bd27f20539c7bb7c5a51287d.tar.gz
gdb-8579fd136a614985bd27f20539c7bb7c5a51287d.tar.bz2
gdb/gdbsupport: make xstrprintf and xstrvprintf return a unique_ptr
The motivation is to reduce the number of places where unmanaged pointers are returned from allocation type routines. All of the callers are updated. There should be no user visible changes after this commit.
-rw-r--r--gdb/ada-lang.c3
-rw-r--r--gdb/auto-load.c17
-rw-r--r--gdb/breakpoint.c9
-rw-r--r--gdb/charset.c18
-rw-r--r--gdb/cli/cli-cmds.c9
-rw-r--r--gdb/cli/cli-decode.c12
-rw-r--r--gdb/cli/cli-utils.c2
-rw-r--r--gdb/cp-abi.c11
-rw-r--r--gdb/frv-tdep.c14
-rw-r--r--gdb/gcore.c2
-rw-r--r--gdb/guile/scm-breakpoint.c2
-rw-r--r--gdb/guile/scm-cmd.c33
-rw-r--r--gdb/guile/scm-exception.c12
-rw-r--r--gdb/guile/scm-gsmob.c7
-rw-r--r--gdb/guile/scm-ports.c6
-rw-r--r--gdb/jit.c4
-rw-r--r--gdb/language.c3
-rw-r--r--gdb/linespec.c5
-rw-r--r--gdb/location.c9
-rw-r--r--gdb/macrotab.c2
-rw-r--r--gdb/main.c2
-rw-r--r--gdb/mi/mi-cmd-env.c2
-rw-r--r--gdb/python/py-breakpoint.c2
-rw-r--r--gdb/remote.c39
-rw-r--r--gdb/riscv-tdep.c4
-rw-r--r--gdb/rust-lang.h5
-rw-r--r--gdb/skip.c2
-rw-r--r--gdb/target.c6
-rw-r--r--gdb/tracepoint.c2
-rw-r--r--gdb/tui/tui-layout.c4
-rw-r--r--gdb/utils.c4
-rw-r--r--gdb/xtensa-tdep.c3
-rw-r--r--gdbsupport/common-utils.cc9
-rw-r--r--gdbsupport/common-utils.h6
34 files changed, 119 insertions, 151 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index e76a300..b84e10f 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -13287,8 +13287,7 @@ public:
{
type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type)));
std::string name = type_to_string (type);
- return gdb::unique_xmalloc_ptr<char>
- (xstrprintf ("{%s} %s", name.c_str (), core_addr_to_string (addr)));
+ return xstrprintf ("{%s} %s", name.c_str (), core_addr_to_string (addr));
}
/* See language.h. */
diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index 36d8725..6579eb5 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -1489,8 +1489,8 @@ void
_initialize_auto_load ()
{
struct cmd_list_element *cmd;
- char *scripts_directory_help, *gdb_name_help, *python_name_help;
- char *guile_name_help;
+ gdb::unique_xmalloc_ptr<char> scripts_directory_help, gdb_name_help,
+ python_name_help, guile_name_help;
const char *suffix;
gdb::observers::new_objfile.attach (auto_load_new_objfile,
@@ -1565,23 +1565,18 @@ having 'set auto-load ... off'.\n\
Directories listed here need to be present also \
in the 'set auto-load safe-path'\n\
option."),
- gdb_name_help,
- python_name_help ? python_name_help : "",
- guile_name_help ? guile_name_help : "");
+ gdb_name_help.get (),
+ python_name_help.get () ? python_name_help.get () : "",
+ guile_name_help.get () ? guile_name_help.get () : "");
add_setshow_optional_filename_cmd ("scripts-directory", class_support,
&auto_load_dir, _("\
Set the list of directories from which to load auto-loaded scripts."), _("\
Show the list of directories from which to load auto-loaded scripts."),
- scripts_directory_help,
+ scripts_directory_help.get (),
set_auto_load_dir, show_auto_load_dir,
auto_load_set_cmdlist_get (),
auto_load_show_cmdlist_get ());
- xfree (scripts_directory_help);
- xfree (python_name_help);
- xfree (gdb_name_help);
- xfree (guile_name_help);
-
auto_load_safe_path_vec_update ();
add_setshow_optional_filename_cmd ("safe-path", class_support,
&auto_load_safe_path, _("\
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 86dffb4..d98c3a7 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -8728,7 +8728,7 @@ static void
update_dprintf_command_list (struct breakpoint *b)
{
const char *dprintf_args = b->extra_string.get ();
- char *printf_line = NULL;
+ gdb::unique_xmalloc_ptr<char> printf_line = nullptr;
if (!dprintf_args)
return;
@@ -8779,7 +8779,7 @@ update_dprintf_command_list (struct breakpoint *b)
/* Manufacture a printf sequence. */
struct command_line *printf_cmd_line
- = new struct command_line (simple_control, printf_line);
+ = new struct command_line (simple_control, printf_line.release ());
breakpoint_set_commands (b, counted_command_line (printf_cmd_line,
command_lines_deleter ()));
}
@@ -10798,9 +10798,8 @@ watch_command_1 (const char *arg, int accessflag, int from_tty,
w->exp_string_reparse
= current_language->watch_location_expression (t, addr);
- w->exp_string.reset (xstrprintf ("-location %.*s",
- (int) (exp_end - exp_start),
- exp_start));
+ w->exp_string = xstrprintf ("-location %.*s",
+ (int) (exp_end - exp_start), exp_start);
}
else
w->exp_string.reset (savestring (exp_start, exp_end - exp_start));
diff --git a/gdb/charset.c b/gdb/charset.c
index 9fb1a1f..d1aebaa 100644
--- a/gdb/charset.c
+++ b/gdb/charset.c
@@ -960,35 +960,31 @@ intermediate_encoding (void)
{
iconv_t desc;
static const char *stored_result = NULL;
- char *result;
+ gdb::unique_xmalloc_ptr<char> result;
if (stored_result)
return stored_result;
result = xstrprintf ("UTF-%d%s", (int) (sizeof (gdb_wchar_t) * 8),
ENDIAN_SUFFIX);
/* Check that the name is supported by iconv_open. */
- desc = iconv_open (result, host_charset ());
+ desc = iconv_open (result.get (), host_charset ());
if (desc != (iconv_t) -1)
{
iconv_close (desc);
- stored_result = result;
- return result;
+ stored_result = result.release ();
+ return stored_result;
}
- /* Not valid, free the allocated memory. */
- xfree (result);
/* Second try, with UCS-2 type. */
result = xstrprintf ("UCS-%d%s", (int) sizeof (gdb_wchar_t),
ENDIAN_SUFFIX);
/* Check that the name is supported by iconv_open. */
- desc = iconv_open (result, host_charset ());
+ desc = iconv_open (result.get (), host_charset ());
if (desc != (iconv_t) -1)
{
iconv_close (desc);
- stored_result = result;
- return result;
+ stored_result = result.release ();
+ return stored_result;
}
- /* Not valid, free the allocated memory. */
- xfree (result);
/* No valid charset found, generate error here. */
error (_("Unable to find a valid charset for string conversions"));
}
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 138a146..3fe4794 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -943,7 +943,6 @@ edit_command (const char *arg, int from_tty)
struct symtab_and_line sal;
struct symbol *sym;
const char *editor;
- char *p;
const char *fn;
/* Pull in the current default source line if necessary. */
@@ -1032,9 +1031,9 @@ edit_command (const char *arg, int from_tty)
/* Quote the file name, in case it has whitespace or other special
characters. */
- p = xstrprintf ("%s +%d \"%s\"", editor, sal.line, fn);
- shell_escape (p, from_tty);
- xfree (p);
+ gdb::unique_xmalloc_ptr<char> p
+ = xstrprintf ("%s +%d \"%s\"", editor, sal.line, fn);
+ shell_escape (p.get (), from_tty);
}
/* The options for the "pipe" command. */
@@ -2730,7 +2729,7 @@ Usage: source [-s] [-v] FILE\n\
-v: each command in FILE is echoed as it is executed.\n\
\n\
Note that the file \"%s\" is read automatically in this way\n\
-when GDB is started."), GDBINIT);
+when GDB is started."), GDBINIT).release ();
c = add_cmd ("source", class_support, source_command,
source_help_text, &cmdlist);
set_cmd_completer (c, filename_completer);
diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
index 667d155..030cba4 100644
--- a/gdb/cli/cli-decode.c
+++ b/gdb/cli/cli-decode.c
@@ -534,8 +534,8 @@ add_setshow_cmd_full_erased (const char *name,
{
struct cmd_list_element *set;
struct cmd_list_element *show;
- char *full_set_doc;
- char *full_show_doc;
+ gdb::unique_xmalloc_ptr<char> full_set_doc;
+ gdb::unique_xmalloc_ptr<char> full_show_doc;
if (help_doc != NULL)
{
@@ -544,18 +544,18 @@ add_setshow_cmd_full_erased (const char *name,
}
else
{
- full_set_doc = xstrdup (set_doc);
- full_show_doc = xstrdup (show_doc);
+ full_set_doc = make_unique_xstrdup (set_doc);
+ full_show_doc = make_unique_xstrdup (show_doc);
}
set = add_set_or_show_cmd (name, set_cmd, theclass, var_type, args,
- full_set_doc, set_list);
+ full_set_doc.release (), set_list);
set->doc_allocated = 1;
if (set_func != NULL)
set->func = set_func;
show = add_set_or_show_cmd (name, show_cmd, theclass, var_type, args,
- full_show_doc, show_list);
+ full_show_doc.release (), show_list);
show->doc_allocated = 1;
show->show_value_func = show_func;
/* Disable the default symbol completer. Doesn't make much sense
diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c
index 3ee6ca6..8fc7557 100644
--- a/gdb/cli/cli-utils.c
+++ b/gdb/cli/cli-utils.c
@@ -209,7 +209,7 @@ The flag -q disables the production of these headers and messages.%s"),
prefix, entity_kind, entity_kind, entity_kind,
(document_n_flag ? _("\n\
By default, the command will include non-debug symbols in the output;\n\
-these can be excluded using the -n flag.") : ""));
+these can be excluded using the -n flag.") : "")).release ();
}
/* See documentation in cli-utils.h. */
diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c
index f831b2b..f14bf45 100644
--- a/gdb/cp-abi.c
+++ b/gdb/cp-abi.c
@@ -265,7 +265,6 @@ register_cp_abi (struct cp_abi_ops *abi)
void
set_cp_abi_as_auto_default (const char *short_name)
{
- char *new_longname, *new_doc;
struct cp_abi_ops *abi = find_cp_abi (short_name);
if (abi == NULL)
@@ -279,12 +278,10 @@ set_cp_abi_as_auto_default (const char *short_name)
auto_cp_abi = *abi;
auto_cp_abi.shortname = "auto";
- new_longname = xstrprintf ("currently \"%s\"", abi->shortname);
- auto_cp_abi.longname = new_longname;
-
- new_doc = xstrprintf ("Automatically selected; currently \"%s\"",
- abi->shortname);
- auto_cp_abi.doc = new_doc;
+ auto_cp_abi.longname = xstrprintf ("currently \"%s\"",
+ abi->shortname).release ();
+ auto_cp_abi.doc = xstrprintf ("Automatically selected; currently \"%s\"",
+ abi->shortname).release ();
/* Since we copy the current ABI into current_cp_abi instead of
using a pointer, if auto is currently the default, we need to
diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
index c74ea68..c5eac6b 100644
--- a/gdb/frv-tdep.c
+++ b/gdb/frv-tdep.c
@@ -182,11 +182,8 @@ new_variant (void)
in the G packet. If we need more in the future, we'll add them
elsewhere. */
for (r = acc0_regnum; r <= acc7_regnum; r++)
- {
- char *buf;
- buf = xstrprintf ("acc%d", r - acc0_regnum);
- var->register_names[r] = buf;
- }
+ var->register_names[r]
+ = xstrprintf ("acc%d", r - acc0_regnum).release ();
/* accg0 - accg7: These are one byte registers. The remote protocol
provides the raw values packed four into a slot. accg0123 and
@@ -195,11 +192,8 @@ new_variant (void)
likely not want to see these raw values. */
for (r = accg0_regnum; r <= accg7_regnum; r++)
- {
- char *buf;
- buf = xstrprintf ("accg%d", r - accg0_regnum);
- var->register_names[r] = buf;
- }
+ var->register_names[r]
+ = xstrprintf ("accg%d", r - accg0_regnum).release ();
/* msr0 and msr1. */
diff --git a/gdb/gcore.c b/gdb/gcore.c
index dccb770..0b4bab6 100644
--- a/gdb/gcore.c
+++ b/gdb/gcore.c
@@ -136,7 +136,7 @@ gcore_command (const char *args, int from_tty)
else
{
/* Default corefile name is "core.PID". */
- corefilename.reset (xstrprintf ("core.%d", inferior_ptid.pid ()));
+ corefilename = xstrprintf ("core.%d", inferior_ptid.pid ());
}
if (info_verbose)
diff --git a/gdb/guile/scm-breakpoint.c b/gdb/guile/scm-breakpoint.c
index ab1ddb1..15ac45a 100644
--- a/gdb/guile/scm-breakpoint.c
+++ b/gdb/guile/scm-breakpoint.c
@@ -968,7 +968,7 @@ gdbscm_set_breakpoint_stop_x (SCM self, SCM newvalue)
= xstrprintf (_("Only one stop condition allowed. There is"
" currently a %s stop condition defined for"
" this breakpoint."),
- ext_lang_capitalized_name (extlang));
+ ext_lang_capitalized_name (extlang)).release ();
scm_dynwind_begin ((scm_t_dynwind_flags) 0);
gdbscm_dynwind_xfree (error_text);
diff --git a/gdb/guile/scm-cmd.c b/gdb/guile/scm-cmd.c
index 6764285..619c89c 100644
--- a/gdb/guile/scm-cmd.c
+++ b/gdb/guile/scm-cmd.c
@@ -475,9 +475,7 @@ gdbscm_parse_command_name (const char *name,
struct cmd_list_element *elt;
int len = strlen (name);
int i, lastchar;
- char *prefix_text;
- const char *prefix_text2;
- char *result, *msg;
+ char *msg;
/* Skip trailing whitespace. */
for (i = len - 1; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
@@ -493,9 +491,9 @@ gdbscm_parse_command_name (const char *name,
/* Find first character of the final word. */
for (; i > 0 && valid_cmd_char_p (name[i - 1]); --i)
;
- result = (char *) xmalloc (lastchar - i + 2);
- memcpy (result, &name[i], lastchar - i + 1);
- result[lastchar - i + 1] = '\0';
+ gdb::unique_xmalloc_ptr<char> result ((char *) xmalloc (lastchar - i + 2));
+ memcpy (result.get (), &name[i], lastchar - i + 1);
+ result.get ()[lastchar - i + 1] = '\0';
/* Skip whitespace again. */
for (--i; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
@@ -503,20 +501,19 @@ gdbscm_parse_command_name (const char *name,
if (i < 0)
{
*base_list = start_list;
- return result;
+ return result.release ();
}
- prefix_text = (char *) xmalloc (i + 2);
- memcpy (prefix_text, name, i + 1);
- prefix_text[i + 1] = '\0';
+ gdb::unique_xmalloc_ptr<char> prefix_text ((char *) xmalloc (i + 2));
+ memcpy (prefix_text.get (), name, i + 1);
+ prefix_text.get ()[i + 1] = '\0';
- prefix_text2 = prefix_text;
+ const char *prefix_text2 = prefix_text.get ();
elt = lookup_cmd_1 (&prefix_text2, *start_list, NULL, NULL, 1);
if (elt == NULL || elt == CMD_LIST_AMBIGUOUS)
{
- msg = xstrprintf (_("could not find command prefix '%s'"), prefix_text);
- xfree (prefix_text);
- xfree (result);
+ msg = xstrprintf (_("could not find command prefix '%s'"),
+ prefix_text.get ()).release ();
scm_dynwind_begin ((scm_t_dynwind_flags) 0);
gdbscm_dynwind_xfree (msg);
gdbscm_out_of_range_error (func_name, arg_pos,
@@ -525,14 +522,12 @@ gdbscm_parse_command_name (const char *name,
if (elt->is_prefix ())
{
- xfree (prefix_text);
*base_list = elt->subcommands;
- return result;
+ return result.release ();
}
- msg = xstrprintf (_("'%s' is not a prefix command"), prefix_text);
- xfree (prefix_text);
- xfree (result);
+ msg = xstrprintf (_("'%s' is not a prefix command"),
+ prefix_text.get ()).release ();
scm_dynwind_begin ((scm_t_dynwind_flags) 0);
gdbscm_dynwind_xfree (msg);
gdbscm_out_of_range_error (func_name, arg_pos,
diff --git a/gdb/guile/scm-exception.c b/gdb/guile/scm-exception.c
index b62eaeb..0c9cb5d 100644
--- a/gdb/guile/scm-exception.c
+++ b/gdb/guile/scm-exception.c
@@ -234,7 +234,7 @@ SCM
gdbscm_make_type_error (const char *subr, int arg_pos, SCM bad_value,
const char *expected_type)
{
- char *msg;
+ gdb::unique_xmalloc_ptr<char> msg;
SCM result;
if (arg_pos > 0)
@@ -262,9 +262,8 @@ gdbscm_make_type_error (const char *subr, int arg_pos, SCM bad_value,
msg = xstrprintf (_("Wrong type argument: ~S"));
}
- result = gdbscm_make_error (scm_arg_type_key, subr, msg,
+ result = gdbscm_make_error (scm_arg_type_key, subr, msg.get (),
scm_list_1 (bad_value), scm_list_1 (bad_value));
- xfree (msg);
return result;
}
@@ -279,7 +278,7 @@ static SCM
gdbscm_make_arg_error (SCM key, const char *subr, int arg_pos, SCM bad_value,
const char *error_prefix, const char *error)
{
- char *msg;
+ gdb::unique_xmalloc_ptr<char> msg;
SCM result;
if (error_prefix != NULL)
@@ -300,9 +299,8 @@ gdbscm_make_arg_error (SCM key, const char *subr, int arg_pos, SCM bad_value,
msg = xstrprintf (_("%s: ~S"), error);
}
- result = gdbscm_make_error (key, subr, msg,
- scm_list_1 (bad_value), scm_list_1 (bad_value));
- xfree (msg);
+ result = gdbscm_make_error (key, subr, msg.get (), scm_list_1 (bad_value),
+ scm_list_1 (bad_value));
return result;
}
diff --git a/gdb/guile/scm-gsmob.c b/gdb/guile/scm-gsmob.c
index 72a96a7..110c1e6 100644
--- a/gdb/guile/scm-gsmob.c
+++ b/gdb/guile/scm-gsmob.c
@@ -191,16 +191,13 @@ gdbscm_gsmob_kind (SCM self)
SCM smob, result;
scm_t_bits smobnum;
const char *name;
- char *kind;
smob = gsscm_get_gsmob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
smobnum = SCM_SMOBNUM (smob);
name = SCM_SMOBNAME (smobnum);
- kind = xstrprintf ("<%s>", name);
- result = scm_from_latin1_symbol (kind);
- xfree (kind);
-
+ gdb::unique_xmalloc_ptr<char> kind = xstrprintf ("<%s>", name);
+ result = scm_from_latin1_symbol (kind.get ());
return result;
}
diff --git a/gdb/guile/scm-ports.c b/gdb/guile/scm-ports.c
index 6251e69..41ccf30 100644
--- a/gdb/guile/scm-ports.c
+++ b/gdb/guile/scm-ports.c
@@ -139,7 +139,7 @@ static const unsigned min_memory_port_buf_size = 1;
static const unsigned max_memory_port_buf_size = 4096;
/* "out of range" error message for buf sizes. */
-static char *out_of_range_buf_size;
+static gdb::unique_xmalloc_ptr<char> out_of_range_buf_size;
#else
@@ -1447,7 +1447,7 @@ gdbscm_set_memory_port_read_buffer_size_x (SCM port, SCM size)
max_memory_port_buf_size))
{
gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG2, size,
- out_of_range_buf_size);
+ out_of_range_buf_size.get ());
}
iomem = (ioscm_memory_port *) SCM_STREAM (port);
@@ -1497,7 +1497,7 @@ gdbscm_set_memory_port_write_buffer_size_x (SCM port, SCM size)
max_memory_port_buf_size))
{
gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG2, size,
- out_of_range_buf_size);
+ out_of_range_buf_size.get ());
}
iomem = (ioscm_memory_port *) SCM_STREAM (port);
diff --git a/gdb/jit.c b/gdb/jit.c
index 666262e..e190e69 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -164,8 +164,8 @@ jit_reader_load_command (const char *args, int from_tty)
error (_("JIT reader already loaded. Run jit-reader-unload first."));
if (!IS_ABSOLUTE_PATH (file.get ()))
- file.reset (xstrprintf ("%s%s%s", jit_reader_dir.c_str (), SLASH_STRING,
- file.get ()));
+ file = xstrprintf ("%s%s%s", jit_reader_dir.c_str (),
+ SLASH_STRING, file.get ());
loaded_jit_reader = jit_reader_load (file.get ());
reinit_frame_cache ();
diff --git a/gdb/language.c b/gdb/language.c
index 9ac48a4..3e60a66 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -602,8 +602,7 @@ language_defn::watch_location_expression (struct type *type,
/* Generates an expression that assumes a C like syntax is valid. */
type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type)));
std::string name = type_to_string (type);
- return gdb::unique_xmalloc_ptr<char>
- (xstrprintf ("* (%s *) %s", name.c_str (), core_addr_to_string (addr)));
+ return xstrprintf ("* (%s *) %s", name.c_str (), core_addr_to_string (addr));
}
/* See language.h. */
diff --git a/gdb/linespec.c b/gdb/linespec.c
index d088801..56bfaed 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -1078,11 +1078,12 @@ add_sal_to_sals (struct linespec_state *self,
the time being. */
if (symname != NULL && sal->line != 0
&& self->language->la_language == language_ada)
- canonical->suffix = xstrprintf ("%s:%d", symname, sal->line);
+ canonical->suffix = xstrprintf ("%s:%d", symname,
+ sal->line).release ();
else if (symname != NULL)
canonical->suffix = xstrdup (symname);
else
- canonical->suffix = xstrprintf ("%d", sal->line);
+ canonical->suffix = xstrprintf ("%d", sal->line).release ();
canonical->symtab = sal->symtab;
}
else
diff --git a/gdb/location.c b/gdb/location.c
index 1ee2006..8ec455b 100644
--- a/gdb/location.c
+++ b/gdb/location.c
@@ -415,9 +415,12 @@ event_location_to_string (struct event_location *location)
break;
case ADDRESS_LOCATION:
- EL_STRING (location)
- = xstrprintf ("*%s",
- core_addr_to_string (EL_ADDRESS (location)));
+ {
+ const char *addr_string
+ = core_addr_to_string (EL_ADDRESS (location));
+ EL_STRING (location)
+ = xstrprintf ("*%s", addr_string).release ();
+ }
break;
case EXPLICIT_LOCATION:
diff --git a/gdb/macrotab.c b/gdb/macrotab.c
index 96b29e3..bf2d79d 100644
--- a/gdb/macrotab.c
+++ b/gdb/macrotab.c
@@ -893,7 +893,7 @@ fixup_definition (const char *filename, int line, struct macro_definition *def)
}
else if (def->argc == macro_LINE)
{
- saved_expansion.reset (xstrprintf ("%d", line));
+ saved_expansion = xstrprintf ("%d", line);
def->replacement = saved_expansion.get ();
}
}
diff --git a/gdb/main.c b/gdb/main.c
index ca4ccc3..5e97f98 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -702,7 +702,7 @@ captured_main_1 (struct captured_main_args *context)
/* Prefix warning messages with the command name. */
gdb::unique_xmalloc_ptr<char> tmp_warn_preprint
- (xstrprintf ("%s: warning: ", gdb_program_name));
+ = xstrprintf ("%s: warning: ", gdb_program_name);
warning_pre_print = tmp_warn_preprint.get ();
current_directory = getcwd (NULL, 0);
diff --git a/gdb/mi/mi-cmd-env.c b/gdb/mi/mi-cmd-env.c
index f9685a5..078087f 100644
--- a/gdb/mi/mi-cmd-env.c
+++ b/gdb/mi/mi-cmd-env.c
@@ -48,7 +48,7 @@ env_execute_cli_command (const char *cmd, const char *args)
gdb::unique_xmalloc_ptr<char> run;
if (args != NULL)
- run.reset (xstrprintf ("%s %s", cmd, args));
+ run = xstrprintf ("%s %s", cmd, args);
else
run.reset (xstrdup (cmd));
execute_command ( /*ui */ run.get (), 0 /*from_tty */ );
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index d99d9b1..1b414a1 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -781,7 +781,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
if (lineobj != NULL)
{
if (PyInt_Check (lineobj))
- line.reset (xstrprintf ("%ld", PyInt_AsLong (lineobj)));
+ line = xstrprintf ("%ld", PyInt_AsLong (lineobj));
else if (PyString_Check (lineobj))
line = python_string_to_host_string (lineobj);
else
diff --git a/gdb/remote.c b/gdb/remote.c
index abf63de..c360197 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1919,41 +1919,36 @@ static void
add_packet_config_cmd (struct packet_config *config, const char *name,
const char *title, int legacy)
{
- char *set_doc;
- char *show_doc;
- char *cmd_name;
-
config->name = name;
config->title = title;
- set_doc = xstrprintf ("Set use of remote protocol `%s' (%s) packet.",
- name, title);
- show_doc = xstrprintf ("Show current use of remote "
- "protocol `%s' (%s) packet.",
- name, title);
+ gdb::unique_xmalloc_ptr<char> set_doc
+ = xstrprintf ("Set use of remote protocol `%s' (%s) packet.",
+ name, title);
+ gdb::unique_xmalloc_ptr<char> show_doc
+ = xstrprintf ("Show current use of remote protocol `%s' (%s) packet.",
+ name, title);
/* set/show TITLE-packet {auto,on,off} */
- cmd_name = xstrprintf ("%s-packet", title);
+ gdb::unique_xmalloc_ptr<char> cmd_name = xstrprintf ("%s-packet", title);
set_show_commands cmds
- = add_setshow_auto_boolean_cmd (cmd_name, class_obscure,
- &config->detect, set_doc,
- show_doc, NULL, /* help_doc */
+ = add_setshow_auto_boolean_cmd (cmd_name.release (), class_obscure,
+ &config->detect, set_doc.get (),
+ show_doc.get (), NULL, /* help_doc */
NULL,
show_remote_protocol_packet_cmd,
&remote_set_cmdlist, &remote_show_cmdlist);
config->show_cmd = cmds.show;
- /* The command code copies the documentation strings. */
- xfree (set_doc);
- xfree (show_doc);
-
/* set/show remote NAME-packet {auto,on,off} -- legacy. */
if (legacy)
{
- char *legacy_name;
-
- legacy_name = xstrprintf ("%s-packet", name);
- add_alias_cmd (legacy_name, cmds.set, class_obscure, 0,
+ /* It's not clear who should take ownership of this string, so, for
+ now, make it static, and give copies to each of the add_alias_cmd
+ calls below. */
+ static gdb::unique_xmalloc_ptr<char> legacy_name
+ = xstrprintf ("%s-packet", name);
+ add_alias_cmd (legacy_name.get (), cmds.set, class_obscure, 0,
&remote_set_cmdlist);
- add_alias_cmd (legacy_name, cmds.show, class_obscure, 0,
+ add_alias_cmd (legacy_name.get (), cmds.show, class_obscure, 0,
&remote_show_cmdlist);
}
}
diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
index a6a64d3..522eaa7 100644
--- a/gdb/riscv-tdep.c
+++ b/gdb/riscv-tdep.c
@@ -566,8 +566,8 @@ private:
for (auto &reg : m_registers)
{
int csr_num = reg.regnum - RISCV_FIRST_CSR_REGNUM;
- const char *alias = xstrprintf ("csr%d", csr_num);
- reg.names.push_back (alias);
+ gdb::unique_xmalloc_ptr<char> alias = xstrprintf ("csr%d", csr_num);
+ reg.names.push_back (alias.release ());
}
}
};
diff --git a/gdb/rust-lang.h b/gdb/rust-lang.h
index 6962f45..06de60f 100644
--- a/gdb/rust-lang.h
+++ b/gdb/rust-lang.h
@@ -113,9 +113,8 @@ public:
{
type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type)));
std::string name = type_to_string (type);
- return gdb::unique_xmalloc_ptr<char>
- (xstrprintf ("*(%s as *mut %s)", core_addr_to_string (addr),
- name.c_str ()));
+ return xstrprintf ("*(%s as *mut %s)", core_addr_to_string (addr),
+ name.c_str ());
}
/* See language.h. */
diff --git a/gdb/skip.c b/gdb/skip.c
index 4d24088..0498bec 100644
--- a/gdb/skip.c
+++ b/gdb/skip.c
@@ -650,7 +650,7 @@ complete_skip_number (cmd_list_element *cmd,
for (const skiplist_entry &entry : skiplist_entries)
{
- gdb::unique_xmalloc_ptr<char> name (xstrprintf ("%d", entry.number ()));
+ gdb::unique_xmalloc_ptr<char> name = xstrprintf ("%d", entry.number ());
if (strncmp (word, name.get (), word_len) == 0)
completer.add_completion (std::move (name));
}
diff --git a/gdb/target.c b/gdb/target.c
index 6219393..8fe27c7 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -887,15 +887,15 @@ void
add_deprecated_target_alias (const target_info &tinfo, const char *alias)
{
struct cmd_list_element *c;
- char *alt;
/* If we use add_alias_cmd, here, we do not get the deprecated warning,
see PR cli/15104. */
c = add_cmd (alias, no_class, tinfo.doc, &targetlist);
c->func = open_target;
c->set_context ((void *) &tinfo);
- alt = xstrprintf ("target %s", tinfo.shortname);
- deprecate_cmd (c, alt);
+ gdb::unique_xmalloc_ptr<char> alt
+ = xstrprintf ("target %s", tinfo.shortname);
+ deprecate_cmd (c, alt.release ());
}
/* Stub functions */
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 042fcc7..0c5107c 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -2809,7 +2809,7 @@ all_tracepoint_actions (struct breakpoint *t)
if (!default_collect.empty ())
{
gdb::unique_xmalloc_ptr<char> default_collect_line
- (xstrprintf ("collect %s", default_collect.c_str ()));
+ = xstrprintf ("collect %s", default_collect.c_str ());
validate_actionline (default_collect_line.get (), t);
actions.reset (new struct command_line (simple_control,
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index 2dfc519..89f84a2 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -850,10 +850,10 @@ add_layout_command (const char *name, tui_layout_split *layout)
layout->specification (&spec, 0);
gdb::unique_xmalloc_ptr<char> doc
- (xstrprintf (_("Apply the \"%s\" layout.\n\
+ = xstrprintf (_("Apply the \"%s\" layout.\n\
This layout was created using:\n\
tui new-layout %s %s"),
- name, name, spec.c_str ()));
+ name, name, spec.c_str ());
cmd = add_cmd (name, class_tui, nullptr, doc.get (), &layout_list);
cmd->set_context (layout);
diff --git a/gdb/utils.c b/gdb/utils.c
index 92a847a..e27a881 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -534,10 +534,10 @@ add_internal_problem_command (struct internal_problem *problem)
set_doc and show_doc in this function. */
const char *set_doc
= xstrprintf (_("Configure what GDB does when %s is detected."),
- problem->name);
+ problem->name).release ();
const char *show_doc
= xstrprintf (_("Show what GDB does when %s is detected."),
- problem->name);
+ problem->name).release ();
add_setshow_prefix_cmd (problem->name, class_maintenance,
set_doc, show_doc, set_cmd_list, show_cmd_list,
diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c
index f09d233..239f1f7 100644
--- a/gdb/xtensa-tdep.c
+++ b/gdb/xtensa-tdep.c
@@ -727,7 +727,8 @@ xtensa_init_reggroups (void)
xtensa_vectra_reggroup = reggroup_new ("vectra", USER_REGGROUP);
for (i = 0; i < XTENSA_MAX_COPROCESSOR; i++)
- xtensa_cp[i] = reggroup_new (xstrprintf ("cp%d", i), USER_REGGROUP);
+ xtensa_cp[i] = reggroup_new (xstrprintf ("cp%d", i).release (),
+ USER_REGGROUP);
}
static void
diff --git a/gdbsupport/common-utils.cc b/gdbsupport/common-utils.cc
index 7a84345..42bce36 100644
--- a/gdbsupport/common-utils.cc
+++ b/gdbsupport/common-utils.cc
@@ -32,19 +32,18 @@ xzalloc (size_t size)
/* Like asprintf/vasprintf but get an internal_error if the call
fails. */
-char *
+gdb::unique_xmalloc_ptr<char>
xstrprintf (const char *format, ...)
{
- char *ret;
va_list args;
va_start (args, format);
- ret = xstrvprintf (format, args);
+ gdb::unique_xmalloc_ptr<char> ret = xstrvprintf (format, args);
va_end (args);
return ret;
}
-char *
+gdb::unique_xmalloc_ptr<char>
xstrvprintf (const char *format, va_list ap)
{
char *ret = NULL;
@@ -56,7 +55,7 @@ xstrvprintf (const char *format, va_list ap)
happen, but just to be sure. */
if (ret == NULL || status < 0)
internal_error (__FILE__, __LINE__, _("vasprintf call failed"));
- return ret;
+ return gdb::unique_xmalloc_ptr<char> (ret);
}
int
diff --git a/gdbsupport/common-utils.h b/gdbsupport/common-utils.h
index 4a75e67..1e90a5c 100644
--- a/gdbsupport/common-utils.h
+++ b/gdbsupport/common-utils.h
@@ -23,6 +23,7 @@
#include <string>
#include <vector>
#include "gdbsupport/byte-vector.h"
+#include "gdbsupport/gdb_unique_ptr.h"
#include "poison.h"
@@ -54,8 +55,9 @@ void *xzalloc (size_t);
/* Like asprintf and vasprintf, but return the string, throw an error
if no memory. */
-char *xstrprintf (const char *format, ...) ATTRIBUTE_PRINTF (1, 2);
-char *xstrvprintf (const char *format, va_list ap)
+gdb::unique_xmalloc_ptr<char> xstrprintf (const char *format, ...)
+ ATTRIBUTE_PRINTF (1, 2);
+gdb::unique_xmalloc_ptr<char> xstrvprintf (const char *format, va_list ap)
ATTRIBUTE_PRINTF (1, 0);
/* Like snprintf, but throw an error if the output buffer is too small. */