Replace asprintf() / vasprintf() with xasprintf() xvasprintf().
authorAndrew Cagney <cagney@redhat.com>
Mon, 20 Nov 2000 02:06:19 +0000 (02:06 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 20 Nov 2000 02:06:19 +0000 (02:06 +0000)
gdb/ChangeLog
gdb/TODO
gdb/defs.h
gdb/mi/ChangeLog
gdb/mi/mi-cmd-var.c
gdb/mi/mi-main.c
gdb/remote.c
gdb/utils.c

index 63b6081..f8f8416 100644 (file)
@@ -1,3 +1,15 @@
+Fri Nov 17 16:07:23 2000  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * utils.c (xvasprintf, xasprintf): New functions.
+       * defs.h (xvasprintf, xasprintf): Add declarations.
+
+       * remote.c (add_packet_config_cmd): Use function xasprintf instead
+       of asprintf.
+       * utils.c (vfprintf_maybe_filtered, vfprintf_unfiltered): Use
+       function xvasprintf instead of vasprintf.
+
+       * TODO (xasprintf): Update.
+
 Mon Nov 20 12:22:32 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * TODO: Mention ``extern'' and ``STREQ'' cleanups.
index 8d0785d..9c7acdb 100644 (file)
--- a/gdb/TODO
+++ b/gdb/TODO
@@ -366,13 +366,6 @@ needed.
 
 --
 
-Replace asprintf() calls with xasprintf() calls.
-
-As with things like strdup() most calls to asprintf() don't check the
-return value.
-
---
-
 Replace strsave() + mstrsave() with libiberty:xstrdup().
 
 --
index dd788e6..63f8345 100644 (file)
@@ -835,6 +835,11 @@ extern PTR xmmalloc (PTR, long);
 extern PTR xmrealloc (PTR, PTR, long);
 #endif
 
+/* Like asprintf/vasprintf but get an internal_error if the call
+   fails. */
+extern void xasprintf (char **ret, const char *format, ...) ATTR_FORMAT (printf, 2, 3);
+extern void xvasprintf (char **ret, const char *format, va_list ap);
+
 extern int parse_escape (char **);
 
 /* Message to be printed before the error message, when an error occurs.  */
index 15a1dde..c3fb691 100644 (file)
@@ -1,3 +1,8 @@
+Fri Nov 17 16:07:23 2000  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * mi-main.c: Replace asprintf with xasprintf.
+       * mi-cmd-var.c (mi_cmd_var_create): Ditto.
+
 2000-10-16  Eli Zaretskii  <eliz@is.elta.co.il>
 
        * gdbmi.texinfo (GDB/MI Variable Objects): Dimensions of
index 771d8ef..a5caa2a 100644 (file)
@@ -52,7 +52,7 @@ mi_cmd_var_create (char *command, char **argv, int argc)
 
   if (argc != 3)
     {
-      /*      asprintf (&mi_error_message,
+      /*      xasprintf (&mi_error_message,
          "mi_cmd_var_create: Usage: .");
          return MI_CMD_ERROR; */
       error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
index 12be2b7..75fd435 100644 (file)
@@ -196,7 +196,8 @@ mi_cmd_exec_interrupt (char *args, int from_tty)
 #ifdef UI_OUT
   if (!target_executing)
     {
-      asprintf (&mi_error_message, "mi_cmd_exec_interrupt: Inferior not executing.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_exec_interrupt: Inferior not executing.");
       return MI_CMD_ERROR;
     }
   interrupt_target_command_wrapper (args, from_tty);
@@ -222,8 +223,8 @@ mi_cmd_thread_select (char *command, char **argv, int argc)
 
   if (argc != 1)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_thread_select: USAGE: threadnum.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_thread_select: USAGE: threadnum.");
       return MI_CMD_ERROR;
     }
   else
@@ -242,8 +243,8 @@ mi_cmd_thread_list_ids (char *command, char **argv, int argc)
 
   if (argc != 0)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_thread_list_ids: No arguments required.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_thread_list_ids: No arguments required.");
       return MI_CMD_ERROR;
     }
   else
@@ -299,7 +300,7 @@ mi_cmd_data_list_register_names (char *command, char **argv, int argc)
        ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
       else
        {
-         asprintf (&mi_error_message, "bad register number");
+         xasprintf (&mi_error_message, "bad register number");
          return MI_CMD_ERROR;
        }
     }
@@ -335,8 +336,8 @@ mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
          changed = register_changed_p (regnum);
          if (changed < 0)
            {
-             asprintf (&mi_error_message,
-                       "mi_cmd_data_list_changed_registers: Unable to read register contents.");
+             xasprintf (&mi_error_message,
+                        "mi_cmd_data_list_changed_registers: Unable to read register contents.");
              return MI_CMD_ERROR;
            }
          else if (changed)
@@ -357,8 +358,8 @@ mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
          changed = register_changed_p (regnum);
          if (changed < 0)
            {
-             asprintf (&mi_error_message,
-                       "mi_cmd_data_list_register_change: Unable to read register contents.");
+             xasprintf (&mi_error_message,
+                        "mi_cmd_data_list_register_change: Unable to read register contents.");
              return MI_CMD_ERROR;
            }
          else if (changed)
@@ -366,7 +367,7 @@ mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
        }
       else
        {
-         asprintf (&mi_error_message, "bad register number");
+         xasprintf (&mi_error_message, "bad register number");
          return MI_CMD_ERROR;
        }
     }
@@ -417,8 +418,8 @@ mi_cmd_data_list_register_values (char *command, char **argv, int argc)
 
   if (argc == 0)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> [<regnum1>...<regnumN>]");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> [<regnum1>...<regnumN>]");
       return MI_CMD_ERROR;
     }
 
@@ -426,7 +427,8 @@ mi_cmd_data_list_register_values (char *command, char **argv, int argc)
 
   if (!target_has_registers)
     {
-      asprintf (&mi_error_message, "mi_cmd_data_list_register_values: No registers.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_list_register_values: No registers.");
       return MI_CMD_ERROR;
     }
 
@@ -469,7 +471,7 @@ mi_cmd_data_list_register_values (char *command, char **argv, int argc)
        }
       else
        {
-         asprintf (&mi_error_message, "bad register number");
+         xasprintf (&mi_error_message, "bad register number");
          return MI_CMD_ERROR;
        }
     }
@@ -499,7 +501,7 @@ get_register (int regnum, int format)
                      regnum, (enum lval_type *) NULL);
   if (optim)
     {
-      asprintf (&mi_error_message, "Optimized out");
+      xasprintf (&mi_error_message, "Optimized out");
       return -1;
     }
 
@@ -563,8 +565,8 @@ mi_cmd_data_write_register_values (char *command, char **argv, int argc)
 
   if (argc == 0)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
       return MI_CMD_ERROR;
     }
 
@@ -572,19 +574,22 @@ mi_cmd_data_write_register_values (char *command, char **argv, int argc)
 
   if (!target_has_registers)
     {
-      asprintf (&mi_error_message, "mi_cmd_data_write_register_values: No registers.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_write_register_values: No registers.");
       return MI_CMD_ERROR;
     }
 
   if (!(argc - 1))
     {
-      asprintf (&mi_error_message, "mi_cmd_data_write_register_values: No regs and values specified.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_write_register_values: No regs and values specified.");
       return MI_CMD_ERROR;
     }
 
   if ((argc - 1) % 2)
     {
-      asprintf (&mi_error_message, "mi_cmd_data_write_register_values: Regs and vals are not in pairs.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_write_register_values: Regs and vals are not in pairs.");
       return MI_CMD_ERROR;
     }
 
@@ -608,7 +613,7 @@ mi_cmd_data_write_register_values (char *command, char **argv, int argc)
        }
       else
        {
-         asprintf (&mi_error_message, "bad register number");
+         xasprintf (&mi_error_message, "bad register number");
          return MI_CMD_ERROR;
        }
     }
@@ -630,8 +635,8 @@ mi_cmd_data_assign (char *command, char **argv, int argc)
 
   if (argc != 1)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_assign: Usage: -data-assign expression");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_assign: Usage: -data-assign expression");
       return MI_CMD_ERROR;
     }
 
@@ -661,8 +666,8 @@ mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
 
   if (argc != 1)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
       return MI_CMD_ERROR;
     }
 
@@ -691,9 +696,7 @@ mi_cmd_target_download (char *args, int from_tty)
   char *run;
   struct cleanup *old_cleanups = NULL;
 
-  asprintf (&run, "load %s", args);
-  if (run == 0)
-    internal_error ("mi_cmd_target_download: no memory");
+  xasprintf (&run, "load %s", args);
   old_cleanups = make_cleanup (free, run);
   execute_command (run, from_tty);
 
@@ -708,9 +711,7 @@ mi_cmd_target_select (char *args, int from_tty)
   char *run;
   struct cleanup *old_cleanups = NULL;
 
-  asprintf (&run, "target %s", args);
-  if (run == 0)
-    internal_error ("mi_cmd_target_select: no memory");
+  xasprintf (&run, "target %s", args);
   old_cleanups = make_cleanup (free, run);
 
   /* target-select is always synchronous.  once the call has returned
@@ -798,8 +799,8 @@ mi_cmd_data_read_memory (char *command, char **argv, int argc)
 
   if (argc < 5 || argc > 6)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_read_memory: Usage: ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_read_memory: Usage: ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
       return MI_CMD_ERROR;
     }
 
@@ -838,16 +839,16 @@ mi_cmd_data_read_memory (char *command, char **argv, int argc)
   nr_rows = atol (argv[3]);
   if (nr_rows <= 0)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_read_memory: invalid number of rows.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_read_memory: invalid number of rows.");
       return MI_CMD_ERROR;
     }
   /* number of bytes per row. */
   nr_cols = atol (argv[4]);
   if (nr_cols <= 0)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_read_memory: invalid number of columns.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_read_memory: invalid number of columns.");
     }
   /* The un-printable character when printing ascii. */
   if (argc == 6)
@@ -861,8 +862,8 @@ mi_cmd_data_read_memory (char *command, char **argv, int argc)
   make_cleanup (free, mbuf);
   if (mbuf == NULL)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_read_memory: out of memory.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_read_memory: out of memory.");
       return MI_CMD_ERROR;
     }
   nr_bytes = 0;
@@ -1004,8 +1005,8 @@ mi_cmd_data_write_memory (char *command, char **argv, int argc)
 
   if (argc != 4)
     {
-      asprintf (&mi_error_message,
-               "mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
+      xasprintf (&mi_error_message,
+                "mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
       return MI_CMD_ERROR;
     }
 
@@ -1242,13 +1243,11 @@ mi_execute_cli_command (const char *cli, char *args)
     {
       struct cleanup *old_cleanups;
       char *run;
-      asprintf (&run, cli, args);
+      xasprintf (&run, cli, args);
       if (mi_debug_p)
        /* FIXME: gdb_???? */
        fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
                            cli, run);
-      if (run == 0)
-       abort ();
       old_cleanups = make_cleanup (free, run);
       execute_command ( /*ui */ run, 0 /*from_tty */ );
       do_cleanups (old_cleanups);
@@ -1269,17 +1268,13 @@ mi_execute_async_cli_command (char *mi, char *args, int from_tty)
       make_exec_cleanup (free, async_args);
       strcpy (async_args, args);
       strcat (async_args, "&");
-      asprintf (&run, "%s %s", mi, async_args);
-      if (run == 0)
-       internal_error ("mi_execute_async_cli_command: no memory");
+      xasprintf (&run, "%s %s", mi, async_args);
       make_exec_cleanup (free, run);
       add_continuation (mi_exec_async_cli_cmd_continuation, NULL);
     }
   else
     {
-      asprintf (&run, "%s %s", mi, args);
-      if (run == 0)
-       internal_error ("mi_execute_async_cli_command: no memory");
+      xasprintf (&run, "%s %s", mi, args);
       old_cleanups = make_cleanup (free, run);
     }
 
index 9764e58..2b8279c 100644 (file)
@@ -574,12 +574,12 @@ add_packet_config_cmd (struct packet_config *config,
   config->title = title;
   config->detect = CMD_AUTO_BOOLEAN_AUTO;
   config->support = PACKET_SUPPORT_UNKNOWN;
-  asprintf (&set_doc, "Set use of remote protocol `%s' (%s) packet",
-           name, title);
-  asprintf (&show_doc, "Show current use of remote protocol `%s' (%s) packet",
-           name, title);
+  xasprintf (&set_doc, "Set use of remote protocol `%s' (%s) packet",
+            name, title);
+  xasprintf (&show_doc, "Show current use of remote protocol `%s' (%s) packet",
+            name, title);
   /* set/show TITLE-packet {auto,on,off} */
-  asprintf (&cmd_name, "%s-packet", title);
+  xasprintf (&cmd_name, "%s-packet", title);
   set_cmd = add_set_auto_boolean_cmd (cmd_name, class_obscure,
                                &config->detect, set_doc,
                                set_remote_list);
@@ -590,7 +590,7 @@ add_packet_config_cmd (struct packet_config *config,
   if (legacy)
     {
       char *legacy_name;
-      asprintf (&legacy_name, "%s-packet", name);
+      xasprintf (&legacy_name, "%s-packet", name);
       add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
                     set_remote_list);
       add_alias_cmd (legacy_name, cmd_name, class_obscure, 0,
index 64c26ae..46d0eb1 100644 (file)
@@ -1079,6 +1079,35 @@ xrealloc (PTR ptr, size_t size)
 }
 \f
 
+/* Like asprintf/vasprintf but get an internal_error if the call
+   fails. */
+
+void
+xasprintf (char **ret, const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  xvasprintf (ret, format, args);
+  va_end (args);
+}
+
+void
+xvasprintf (char **ret, const char *format, va_list ap)
+{
+  int status = vasprintf (ret, format, ap);
+  /* NULL could be returned due to a memory allocation problem; a
+     badly format string; or something else. */
+  if ((*ret) == NULL)
+    internal_error ("%s:%d: vasprintf returned NULL buffer (errno %d)",
+                   __FILE__, __LINE__, errno);
+  /* A negative status with a non-NULL buffer shouldn't never
+     happen. But to be sure. */
+  if (status < 0)
+    internal_error ("%s:%d: vasprintf call failed (errno %d)",
+                   __FILE__, __LINE__, errno);
+}
+
+
 /* My replacement for the read system call.
    Used like `read' but keeps going if `read' returns too soon.  */
 
@@ -1952,12 +1981,7 @@ vfprintf_maybe_filtered (struct ui_file *stream, const char *format,
   char *linebuffer;
   struct cleanup *old_cleanups;
 
-  vasprintf (&linebuffer, format, args);
-  if (linebuffer == NULL)
-    {
-      fputs_unfiltered ("\ngdb: virtual memory exhausted.\n", gdb_stderr);
-      exit (1);
-    }
+  xvasprintf (&linebuffer, format, args);
   old_cleanups = make_cleanup (free, linebuffer);
   fputs_maybe_filtered (linebuffer, stream, filter);
   do_cleanups (old_cleanups);
@@ -1976,12 +2000,7 @@ vfprintf_unfiltered (struct ui_file *stream, const char *format, va_list args)
   char *linebuffer;
   struct cleanup *old_cleanups;
 
-  vasprintf (&linebuffer, format, args);
-  if (linebuffer == NULL)
-    {
-      fputs_unfiltered ("\ngdb: virtual memory exhausted.\n", gdb_stderr);
-      exit (1);
-    }
+  xvasprintf (&linebuffer, format, args);
   old_cleanups = make_cleanup (free, linebuffer);
   fputs_unfiltered (linebuffer, stream);
   do_cleanups (old_cleanups);