From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19770 invoked by alias); 13 Sep 2008 22:53:04 -0000 Received: (qmail 19757 invoked by uid 22791); 13 Sep 2008 22:53:03 -0000 X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 13 Sep 2008 22:52:19 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id m8DMpFWb016580; Sat, 13 Sep 2008 18:51:35 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m8DMp3Wv017712; Sat, 13 Sep 2008 18:51:04 -0400 Received: from opsy.redhat.com (vpn-10-13.bos.redhat.com [10.16.10.13]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id m8DMp2K8012793; Sat, 13 Sep 2008 18:51:02 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 340B988803A; Sat, 13 Sep 2008 16:51:08 -0600 (MDT) To: Joel Brobecker Cc: gdb-patches@sourceware.org Subject: Re: RFA: fix minor memory leak in symfile.c References: <20080913171723.GH3714@adacore.com> <20080913223455.GB19625@adacore.com> From: Tom Tromey Reply-To: Tom Tromey X-Attribution: Tom Date: Sat, 13 Sep 2008 22:53:00 -0000 In-Reply-To: <20080913223455.GB19625@adacore.com> (Joel Brobecker's message of "Sat\, 13 Sep 2008 15\:34\:55 -0700") Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-09/txt/msg00302.txt.bz2 >>>>> "Joel" == Joel Brobecker writes: Joel> The C standard requires that free does nothing when passed a NULL Joel> pointer. So unless we're building GDB with a screwy C compiler, Joel> it's strictly equivalent to calling free. My understanding is that on all systems in active use, free(NULL) works fine. Jim Meyering recently removed if (x) free (x) from a bunch of GNU programs... Joel> Still, I think it'd be nice to get rid of these. In desperate Joel> situations, one might want to locally hack these to track memory Joel> issues... Here's the patch. I'm regtesting it now. I also changed a use of asprintf, because gdbint.texinfo clearly states that this function is not to be used. (It is the only use in gdb.) Ok if it succeeds? Note that, if you should ever actually have to do this, you should expect to have to fix gdb first anyway. In the absence of enforcement I am sure that more uses of free will sneak in. Tom 2008-09-13 Tom Tromey * varobj.c (varobj_set_display_format): Use xfree. * tracepoint.c (stringify_collection_list): Use xfree. * remote-fileio.c (remote_fileio_reset): Use xfree. * mipsread.c (read_alphacoff_dynamic_symtab): Use xfree. * dfp.c (decimal_from_floating): Use xfree, xstrprintf. Don't use asprintf. * cp-support.c (mangled_name_to_comp): Use xfree. diff --git a/gdb/cp-support.c b/gdb/cp-support.c index df48f60..f50d8fd 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -167,7 +167,7 @@ mangled_name_to_comp (const char *mangled_name, int options, if (ret == NULL) { - free (demangled_name); + xfree (demangled_name); return NULL; } diff --git a/gdb/dfp.c b/gdb/dfp.c index 9816d27..bbaf9aa 100644 --- a/gdb/dfp.c +++ b/gdb/dfp.c @@ -235,16 +235,12 @@ void decimal_from_floating (struct value *from, gdb_byte *to, int len) { char *buffer; - int ret; - ret = asprintf (&buffer, "%.30" DOUBLEST_PRINT_FORMAT, - value_as_double (from)); - if (ret < 0) - error (_("Error in memory allocation for conversion to decimal float.")); + buffer = xstrprintf ("%.30" DOUBLEST_PRINT_FORMAT, value_as_double (from)); decimal_from_string (to, len, buffer); - free (buffer); + xfree (buffer); } /* Converts a decimal float of LEN bytes to a double value. */ diff --git a/gdb/mipsread.c b/gdb/mipsread.c index fdd8634..1e88f81 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -217,13 +217,13 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, dyninfo_secsize = bfd_get_section_size (si.dyninfo_sect); got_secsize = bfd_get_section_size (si.got_sect); sym_secptr = xmalloc (sym_secsize); - cleanups = make_cleanup (free, sym_secptr); + cleanups = make_cleanup (xfree, sym_secptr); str_secptr = xmalloc (str_secsize); - make_cleanup (free, str_secptr); + make_cleanup (xfree, str_secptr); dyninfo_secptr = xmalloc (dyninfo_secsize); - make_cleanup (free, dyninfo_secptr); + make_cleanup (xfree, dyninfo_secptr); got_secptr = xmalloc (got_secsize); - make_cleanup (free, got_secptr); + make_cleanup (xfree, got_secptr); if (!bfd_get_section_contents (abfd, si.sym_sect, sym_secptr, (file_ptr) 0, sym_secsize)) diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c index 93665c9..05a78be 100644 --- a/gdb/remote-fileio.c +++ b/gdb/remote-fileio.c @@ -1398,7 +1398,7 @@ remote_fileio_reset (void) } if (remote_fio_data.fd_map) { - free (remote_fio_data.fd_map); + xfree (remote_fio_data.fd_map); remote_fio_data.fd_map = NULL; remote_fio_data.fd_map_size = 0; } diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 671a63a..99bd17f 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1457,7 +1457,7 @@ stringify_collection_list (struct collection_list *list, char *string) if (ndx == 0) { - free (str_list); + xfree (str_list); return NULL; } else diff --git a/gdb/varobj.c b/gdb/varobj.c index 3a0bf5e..12b644f 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -693,7 +693,7 @@ varobj_set_display_format (struct varobj *var, if (varobj_value_is_changeable_p (var) && var->value && !value_lazy (var->value)) { - free (var->print_value); + xfree (var->print_value); var->print_value = value_get_print_value (var->value, var->format); }