This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[rfc] asprintf() -> xasprintf()


Hello,

The attatched replaces all uses of asprintf()/vasprintf() with calls to
xasprintf() and xvasprintf().  The wrapper functions abort if the return
value is wrong.  Testing of the patch is continuing.

I'll also need to update TODO and CONTRIBUTE to reflect this.

	Andrew
ChangeLog:
Mon Nov 13 12:44:06 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.

mi/ChangeLog:
Mon Nov 13 12:48:47 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* mi-main.c: Replace asprintf with xasprintf.
	* mi-cmd-var.c (mi_cmd_var_create): Ditto.

Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.31
diff -p -r1.31 defs.h
*** defs.h	2000/09/01 23:47:52	1.31
--- defs.h	2000/11/13 05:30:33
*************** extern PTR xmmalloc (PTR, long);
*** 835,840 ****
--- 835,845 ----
  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: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.27
diff -p -r1.27 remote.c
*** remote.c	2000/11/03 22:00:56	1.27
--- remote.c	2000/11/13 05:30:56
*************** add_packet_config_cmd (struct packet_con
*** 574,585 ****
    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);
    /* set/show TITLE-packet {auto,on,off} */
!   asprintf (&cmd_name, "%s-packet", title);
    set_cmd = add_set_auto_boolean_cmd (cmd_name, class_obscure,
  				&config->detect, set_doc,
  				set_remote_list);
--- 574,585 ----
    config->title = title;
    config->detect = CMD_AUTO_BOOLEAN_AUTO;
    config->support = PACKET_SUPPORT_UNKNOWN;
!   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} */
!   xasprintf (&cmd_name, "%s-packet", title);
    set_cmd = add_set_auto_boolean_cmd (cmd_name, class_obscure,
  				&config->detect, set_doc,
  				set_remote_list);
*************** add_packet_config_cmd (struct packet_con
*** 590,596 ****
    if (legacy)
      {
        char *legacy_name;
!       asprintf (&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,
--- 590,596 ----
    if (legacy)
      {
        char *legacy_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: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.21
diff -p -r1.21 utils.c
*** utils.c	2000/11/04 00:46:46	1.21
--- utils.c	2000/11/13 05:31:02
*************** xrealloc (PTR ptr, size_t size)
*** 1079,1084 ****
--- 1079,1109 ----
  }
  
  
+ /* 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);
+   if ((*ret) == NULL)
+     internal_error ("%s:%d: vasprintf returned NULL buffer (errno %d)",
+ 		    __FILE__, __LINE__, errno);
+   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.  */
  
*************** vfprintf_maybe_filtered (struct ui_file 
*** 1952,1963 ****
    char *linebuffer;
    struct cleanup *old_cleanups;
  
!   vasprintf (&linebuffer, format, args);
!   if (linebuffer == NULL)
!     {
!       fputs_unfiltered ("\ngdb: virtual memory exhausted.\n", gdb_stderr);
!       exit (1);
!     }
    old_cleanups = make_cleanup (free, linebuffer);
    fputs_maybe_filtered (linebuffer, stream, filter);
    do_cleanups (old_cleanups);
--- 1977,1983 ----
    char *linebuffer;
    struct cleanup *old_cleanups;
  
!   xvasprintf (&linebuffer, format, args);
    old_cleanups = make_cleanup (free, linebuffer);
    fputs_maybe_filtered (linebuffer, stream, filter);
    do_cleanups (old_cleanups);
*************** vfprintf_unfiltered (struct ui_file *str
*** 1976,1987 ****
    char *linebuffer;
    struct cleanup *old_cleanups;
  
!   vasprintf (&linebuffer, format, args);
!   if (linebuffer == NULL)
!     {
!       fputs_unfiltered ("\ngdb: virtual memory exhausted.\n", gdb_stderr);
!       exit (1);
!     }
    old_cleanups = make_cleanup (free, linebuffer);
    fputs_unfiltered (linebuffer, stream);
    do_cleanups (old_cleanups);
--- 1996,2002 ----
    char *linebuffer;
    struct cleanup *old_cleanups;
  
!   xvasprintf (&linebuffer, format, args);
    old_cleanups = make_cleanup (free, linebuffer);
    fputs_unfiltered (linebuffer, stream);
    do_cleanups (old_cleanups);
Index: mi/mi-cmd-var.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-var.c,v
retrieving revision 1.5
diff -p -r1.5 mi-cmd-var.c
*** mi-cmd-var.c	2000/05/16 05:07:53	1.5
--- mi-cmd-var.c	2000/11/13 05:31:10
*************** mi_cmd_var_create (char *command, char *
*** 52,58 ****
  
    if (argc != 3)
      {
!       /*      asprintf (&mi_error_message,
           "mi_cmd_var_create: Usage: .");
           return MI_CMD_ERROR; */
        error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
--- 52,58 ----
  
    if (argc != 3)
      {
!       /*      xasprintf (&mi_error_message,
           "mi_cmd_var_create: Usage: .");
           return MI_CMD_ERROR; */
        error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
Index: mi/mi-main.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-main.c,v
retrieving revision 1.7
diff -p -r1.7 mi-main.c
*** mi-main.c	2000/07/30 01:48:28	1.7
--- mi-main.c	2000/11/13 05:31:15
*************** mi_cmd_exec_interrupt (char *args, int f
*** 196,202 ****
  #ifdef UI_OUT
    if (!target_executing)
      {
!       asprintf (&mi_error_message, "mi_cmd_exec_interrupt: Inferior not executing.");
        return MI_CMD_ERROR;
      }
    interrupt_target_command_wrapper (args, from_tty);
--- 196,203 ----
  #ifdef UI_OUT
    if (!target_executing)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_exec_interrupt: Inferior not executing.");
        return MI_CMD_ERROR;
      }
    interrupt_target_command_wrapper (args, from_tty);
*************** mi_cmd_thread_select (char *command, cha
*** 222,229 ****
  
    if (argc != 1)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_thread_select: USAGE: threadnum.");
        return MI_CMD_ERROR;
      }
    else
--- 223,230 ----
  
    if (argc != 1)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_thread_select: USAGE: threadnum.");
        return MI_CMD_ERROR;
      }
    else
*************** mi_cmd_thread_list_ids (char *command, c
*** 242,249 ****
  
    if (argc != 0)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_thread_list_ids: No arguments required.");
        return MI_CMD_ERROR;
      }
    else
--- 243,250 ----
  
    if (argc != 0)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_thread_list_ids: No arguments required.");
        return MI_CMD_ERROR;
      }
    else
*************** mi_cmd_data_list_register_names (char *c
*** 299,305 ****
  	ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
        else
  	{
! 	  asprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
--- 300,306 ----
  	ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
        else
  	{
! 	  xasprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
*************** mi_cmd_data_list_changed_registers (char
*** 335,342 ****
  	  changed = register_changed_p (regnum);
  	  if (changed < 0)
  	    {
! 	      asprintf (&mi_error_message,
! 			"mi_cmd_data_list_changed_registers: Unable to read register contents.");
  	      return MI_CMD_ERROR;
  	    }
  	  else if (changed)
--- 336,343 ----
  	  changed = register_changed_p (regnum);
  	  if (changed < 0)
  	    {
! 	      xasprintf (&mi_error_message,
! 			 "mi_cmd_data_list_changed_registers: Unable to read register contents.");
  	      return MI_CMD_ERROR;
  	    }
  	  else if (changed)
*************** mi_cmd_data_list_changed_registers (char
*** 357,364 ****
  	  changed = register_changed_p (regnum);
  	  if (changed < 0)
  	    {
! 	      asprintf (&mi_error_message,
! 			"mi_cmd_data_list_register_change: Unable to read register contents.");
  	      return MI_CMD_ERROR;
  	    }
  	  else if (changed)
--- 358,365 ----
  	  changed = register_changed_p (regnum);
  	  if (changed < 0)
  	    {
! 	      xasprintf (&mi_error_message,
! 			 "mi_cmd_data_list_register_change: Unable to read register contents.");
  	      return MI_CMD_ERROR;
  	    }
  	  else if (changed)
*************** mi_cmd_data_list_changed_registers (char
*** 366,372 ****
  	}
        else
  	{
! 	  asprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
--- 367,373 ----
  	}
        else
  	{
! 	  xasprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
*************** mi_cmd_data_list_register_values (char *
*** 417,424 ****
  
    if (argc == 0)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> [<regnum1>...<regnumN>]");
        return MI_CMD_ERROR;
      }
  
--- 418,425 ----
  
    if (argc == 0)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> [<regnum1>...<regnumN>]");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_data_list_register_values (char *
*** 426,432 ****
  
    if (!target_has_registers)
      {
!       asprintf (&mi_error_message, "mi_cmd_data_list_register_values: No registers.");
        return MI_CMD_ERROR;
      }
  
--- 427,434 ----
  
    if (!target_has_registers)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_list_register_values: No registers.");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_data_list_register_values (char *
*** 469,475 ****
  	}
        else
  	{
! 	  asprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
--- 471,477 ----
  	}
        else
  	{
! 	  xasprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
*************** get_register (int regnum, int format)
*** 499,505 ****
  		      regnum, (enum lval_type *) NULL);
    if (optim)
      {
!       asprintf (&mi_error_message, "Optimized out");
        return -1;
      }
  
--- 501,507 ----
  		      regnum, (enum lval_type *) NULL);
    if (optim)
      {
!       xasprintf (&mi_error_message, "Optimized out");
        return -1;
      }
  
*************** mi_cmd_data_write_register_values (char 
*** 563,570 ****
  
    if (argc == 0)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
        return MI_CMD_ERROR;
      }
  
--- 565,572 ----
  
    if (argc == 0)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_data_write_register_values (char 
*** 572,590 ****
  
    if (!target_has_registers)
      {
!       asprintf (&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.");
        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.");
        return MI_CMD_ERROR;
      }
  
--- 574,595 ----
  
    if (!target_has_registers)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_write_register_values: No registers.");
        return MI_CMD_ERROR;
      }
  
    if (!(argc - 1))
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_write_register_values: No regs and values specified.");
        return MI_CMD_ERROR;
      }
  
    if ((argc - 1) % 2)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_write_register_values: Regs and vals are not in pairs.");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_data_write_register_values (char 
*** 608,614 ****
  	}
        else
  	{
! 	  asprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
--- 613,619 ----
  	}
        else
  	{
! 	  xasprintf (&mi_error_message, "bad register number");
  	  return MI_CMD_ERROR;
  	}
      }
*************** mi_cmd_data_assign (char *command, char 
*** 630,637 ****
  
    if (argc != 1)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_data_assign: Usage: -data-assign expression");
        return MI_CMD_ERROR;
      }
  
--- 635,642 ----
  
    if (argc != 1)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_assign: Usage: -data-assign expression");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_data_evaluate_expression (char *c
*** 661,668 ****
  
    if (argc != 1)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
        return MI_CMD_ERROR;
      }
  
--- 666,673 ----
  
    if (argc != 1)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_target_download (char *args, int 
*** 691,699 ****
    char *run;
    struct cleanup *old_cleanups = NULL;
  
!   asprintf (&run, "load %s", args);
!   if (run == 0)
!     internal_error ("mi_cmd_target_download: no memory");
    old_cleanups = make_cleanup (free, run);
    execute_command (run, from_tty);
  
--- 696,702 ----
    char *run;
    struct cleanup *old_cleanups = NULL;
  
!   xasprintf (&run, "load %s", args);
    old_cleanups = make_cleanup (free, run);
    execute_command (run, from_tty);
  
*************** mi_cmd_target_select (char *args, int fr
*** 708,716 ****
    char *run;
    struct cleanup *old_cleanups = NULL;
  
!   asprintf (&run, "target %s", args);
!   if (run == 0)
!     internal_error ("mi_cmd_target_select: no memory");
    old_cleanups = make_cleanup (free, run);
  
    /* target-select is always synchronous.  once the call has returned
--- 711,717 ----
    char *run;
    struct cleanup *old_cleanups = NULL;
  
!   xasprintf (&run, "target %s", args);
    old_cleanups = make_cleanup (free, run);
  
    /* target-select is always synchronous.  once the call has returned
*************** mi_cmd_data_read_memory (char *command, 
*** 798,805 ****
  
    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].");
        return MI_CMD_ERROR;
      }
  
--- 799,806 ----
  
    if (argc < 5 || argc > 6)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_read_memory: Usage: ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
        return MI_CMD_ERROR;
      }
  
*************** mi_cmd_data_read_memory (char *command, 
*** 838,853 ****
    nr_rows = atol (argv[3]);
    if (nr_rows <= 0)
      {
!       asprintf (&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.");
      }
    /* The un-printable character when printing ascii. */
    if (argc == 6)
--- 839,854 ----
    nr_rows = atol (argv[3]);
    if (nr_rows <= 0)
      {
!       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)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_read_memory: invalid number of columns.");
      }
    /* The un-printable character when printing ascii. */
    if (argc == 6)
*************** mi_cmd_data_read_memory (char *command, 
*** 861,868 ****
    make_cleanup (free, mbuf);
    if (mbuf == NULL)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_data_read_memory: out of memory.");
        return MI_CMD_ERROR;
      }
    nr_bytes = 0;
--- 862,869 ----
    make_cleanup (free, mbuf);
    if (mbuf == NULL)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_read_memory: out of memory.");
        return MI_CMD_ERROR;
      }
    nr_bytes = 0;
*************** mi_cmd_data_write_memory (char *command,
*** 1004,1011 ****
  
    if (argc != 4)
      {
!       asprintf (&mi_error_message,
! 		"mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
        return MI_CMD_ERROR;
      }
  
--- 1005,1012 ----
  
    if (argc != 4)
      {
!       xasprintf (&mi_error_message,
! 		 "mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
        return MI_CMD_ERROR;
      }
  
*************** mi_execute_cli_command (const char *cli,
*** 1242,1254 ****
      {
        struct cleanup *old_cleanups;
        char *run;
!       asprintf (&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);
--- 1243,1253 ----
      {
        struct cleanup *old_cleanups;
        char *run;
!       xasprintf (&run, cli, args);
        if (mi_debug_p)
  	/* FIXME: gdb_???? */
  	fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
  			    cli, run);
        old_cleanups = make_cleanup (free, run);
        execute_command ( /*ui */ run, 0 /*from_tty */ );
        do_cleanups (old_cleanups);
*************** mi_execute_async_cli_command (char *mi, 
*** 1269,1285 ****
        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");
        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");
        old_cleanups = make_cleanup (free, run);
      }
  
--- 1268,1280 ----
        make_exec_cleanup (free, async_args);
        strcpy (async_args, args);
        strcat (async_args, "&");
!       xasprintf (&run, "%s %s", mi, async_args);
        make_exec_cleanup (free, run);
        add_continuation (mi_exec_async_cli_cmd_continuation, NULL);
      }
    else
      {
!       xasprintf (&run, "%s %s", mi, args);
        old_cleanups = make_cleanup (free, run);
      }
  

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]