gdb/gdbsupport: make xstrprintf and xstrvprintf return a unique_ptr
authorAndrew Burgess <aburgess@redhat.com>
Mon, 8 Nov 2021 14:58:46 +0000 (14:58 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Tue, 16 Nov 2021 17:45:45 +0000 (17:45 +0000)
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.

34 files changed:
gdb/ada-lang.c
gdb/auto-load.c
gdb/breakpoint.c
gdb/charset.c
gdb/cli/cli-cmds.c
gdb/cli/cli-decode.c
gdb/cli/cli-utils.c
gdb/cp-abi.c
gdb/frv-tdep.c
gdb/gcore.c
gdb/guile/scm-breakpoint.c
gdb/guile/scm-cmd.c
gdb/guile/scm-exception.c
gdb/guile/scm-gsmob.c
gdb/guile/scm-ports.c
gdb/jit.c
gdb/language.c
gdb/linespec.c
gdb/location.c
gdb/macrotab.c
gdb/main.c
gdb/mi/mi-cmd-env.c
gdb/python/py-breakpoint.c
gdb/remote.c
gdb/riscv-tdep.c
gdb/rust-lang.h
gdb/skip.c
gdb/target.c
gdb/tracepoint.c
gdb/tui/tui-layout.c
gdb/utils.c
gdb/xtensa-tdep.c
gdbsupport/common-utils.cc
gdbsupport/common-utils.h

index e76a3000f616196cc27cc80cec0b9d0595d86fcc..b84e10fd029fc6ac27ca9016e72ccb2f7fd38516 100644 (file)
@@ -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.  */
index 36d87252b3fe80d0b2aae35884c28b16593af322..6579eb57ffb54716aafe00a0ff61864fa4a6407f 100644 (file)
@@ -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, _("\
index 86dffb40e8dfe752b97e59bccde337023c2249ec..d98c3a7cf0f914ebc48381f2328cb0dcebe868c6 100644 (file)
@@ -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));
index 9fb1a1f0b67e775afbe006012942353369e8f976..d1aebaa501165fd008a18d6f32e057dba38010ae 100644 (file)
@@ -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"));
 }
index 138a146c7d6a4a8bcaa12d7f1f0c7b70d8fe5e79..3fe479400763d35a3c9d835c6b7d4feed0b3427c 100644 (file)
@@ -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);
index 667d15585752d7d8b0ccd51e4bac91f7957ab8fa..030cba443386cfd157d708a2bd18f3ed42a3aab7 100644 (file)
@@ -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
index 3ee6ca692722a77fea9785e0ec93afee16649ace..8fc7557dbfe3bc9381b5a84ea9608dd337429bad 100644 (file)
@@ -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.  */
index f831b2b34b3c0321ca2c971fb94128d4c321ded8..f14bf45b04d3f15fd1183036faae7214bcef30ad 100644 (file)
@@ -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
index c74ea68fe847483edb211b347f98b12cb5fb0fe4..c5eac6b61b5a0e9a2cf6bfde827fac9fb7428c1a 100644 (file)
@@ -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.  */
 
index dccb77052bacab2f7da7c4fa8a7d0a64ced51909..0b4bab6e67dffee4d4aea2d82f6b5ec2a7dde3b9 100644 (file)
@@ -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)
index ab1ddb1bae093e20c5d55d84b3be7c2f7f4b3820..15ac45a39fccd541572e696965cbdd8d174b9bc6 100644 (file)
@@ -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);
index 676428577b28522af68c82f8e4ff15831365ba42..619c89c252c6cae3b936f39a4ea7b2bd0392cbae 100644 (file)
@@ -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,
index b62eaebfda662b211b5d0c5d0855192fbcd515f2..0c9cb5d50efa1c5323a55c3bd6c2ca284f740754 100644 (file)
@@ -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;
 }
 
index 72a96a781c136789058c766d826c403fd3a01cd0..110c1e69593dca69f27bd9c495a7da2186ac1205 100644 (file)
@@ -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;
 }
 
index 6251e697e64f4f1bdf6854904309b8d42b1c3626..41ccf30202dab079925419c8a94c6f801e4fb8cf 100644 (file)
@@ -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);
index 666262e2a05229b6e55dfbcff8d7b15449335291..e190e695aa853f4f3fda86aab73e892a1ce0274a 100644 (file)
--- 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 ();
index 9ac48a494c99a3ababe031783fa9a913323ebcf6..3e60a668ed61097ed910a3ea157bac05c6859c70 100644 (file)
@@ -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.  */
index d088801952a53f7c0300a0998db8b786e9fcb94e..56bfaede9d9a120b5ed5c621982cfdd5960500d8 100644 (file)
@@ -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
index 1ee2006931339818331fdd1d7b9684c868a16abf..8ec455bd15ba8ef61139e62fecb5f55484e301ab 100644 (file)
@@ -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:
index 96b29e345aaf6137dcb601264c7f56b2df676d20..bf2d79d219fbf6d95b0eed4056c920cdaae74523 100644 (file)
@@ -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 ();
        }
     }
index ca4ccc375dc7c3a9145b57e6584e2348f0715776..5e97f98e928e787260b9fdf522e919baa80970d2 100644 (file)
@@ -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);
index f9685a515ad9bd3d7662d02bf3353d678726f016..078087f327e56489c9a242d238259be5f0c0db38 100644 (file)
@@ -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 */ );
index d99d9b18b49f5cf55e5a22425611e11472cf04a7..1b414a1e028b5dc5a1be915b852622085354befd 100644 (file)
@@ -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
index abf63de622a38bb8f160886734ccbc30af4397a2..c360197240094773b0e802797ff73a349725b2e0 100644 (file)
@@ -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);
     }
 }
index a6a64d3cb84d61e760805dd3c2264a0340ab5708..522eaa7440e1d7792e59d219507bebf254dad5c2 100644 (file)
@@ -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 ());
       }
   }
 };
index 6962f45d7b88c56ad40d0c3f01b4226e78ffddc0..06de60ff7eab531b3f6a73df6d99fab5a3ef24fd 100644 (file)
@@ -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.  */
index 4d24088f2474db19d39e8663473b894258619d8a..0498becbdf1a74af7cbaa4140329bd3b5873c13f 100644 (file)
@@ -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));
     }
index 6219393987e8f3b9d02569d1346f8039f2925da3..8fe27c775ea74beb036305666375ad6f9dc35f25 100644 (file)
@@ -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 */
index 042fcc7f364e27647631aab80fff3a4a4802b304..0c5107c8d5c6d840117534f98955ea341ddf6a18 100644 (file)
@@ -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,
index 2dfc51935d96d9435491939f147b2e31225ffdd2..89f84a2b9425b08bae1f9afdd9caa63537bd6452 100644 (file)
@@ -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);
index 92a847aef4d6daa5a07c348cdcb87836a19c9481..e27a8818b94cb8392f77a59ad1e5dd7732d9ea11 100644 (file)
@@ -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,
index f09d2335559b0a0a30fbbae25b1287d6c0e93a25..239f1f786aad0160e082bbf07ed6b501e5d69192 100644 (file)
@@ -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
index 7a8434538dcfb70f39323d9d1bc6a39802acb558..42bce36e535604f9112d874c5454802c84efb4a1 100644 (file)
@@ -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
index 4a75e67079fdce2a40b7373399cc09da9fe933bb..1e90a5c078b0f2b96d544e80af9a2a4d55a36b33 100644 (file)
@@ -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.  */