Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tom@tromey.com>
To: Andrew Burgess <andrew.burgess@embecosm.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] gdb: Don't leak memory with TYPE_ALLOC / TYPE_ZALLOC
Date: Tue, 11 Sep 2018 20:38:00 -0000	[thread overview]
Message-ID: <87lg87rcq3.fsf@tromey.com> (raw)
In-Reply-To: <20180911141147.14107-1-andrew.burgess@embecosm.com> (Andrew	Burgess's message of "Tue, 11 Sep 2018 15:11:47 +0100")

>>>>> "Andrew" == Andrew Burgess <andrew.burgess@embecosm.com> writes:

Andrew> I ran into the following issue after runnig valgrind on GDB.
Andrew> Calling TYPE_ALLOC or TYPE_ZALLOC currently allocates memory from
Andrew> either the objfile obstack or by using malloc.  The problem with this
Andrew> is that types are allocated either on the objfile obstack, or on the
Andrew> gdbarch obstack.

Thank you for the patch.  I found the analysis very clear, so thanks for
that too.

Andrew> This commit ensures that auxiliary type data is allocated from the
Andrew> same obstack as the type itself, which should reduce leaked memory.

I'm curious whether this is something you intend to do.  gdb has many
things that are allocated for the lifetime of the process...

Andrew> The one problem case that I found with this change was in eval.c,
Andrew> where in one place we allocate a local type structure, and then used
Andrew> TYPE_ZALLOC to allocate some space for the type.  This local type is
Andrew> neither object file owned, nor gdbarch owned, and so the updated
Andrew> TYPE_ALLOC code is unable to find an objstack to allocate space on.

Andrew> My proposed solution for this issue is that the space should be
Andrew> allocated with a direct call to xzalloc.  We could extend TYPE_ALLOC
Andrew> to check for type->gdbarch being null, and then fall back to a direct
Andrew> call to xzalloc, however, I think making the rare case of a local type
Andrew> requiring special handling is not a bad thing, this serves to
Andrew> highlight that clearing up the memory will require special handling
Andrew> too.

I went and refreshed my memory of this area.

My first thought was that this would be dangerous because -- surely --
there was code allocating a type on the heap and manually managing it.
I was remembering Python, but I think we didn't do this because we
bailed on the whole "type GC" idea.  So, there no problems that I could
find.

I suppose if the type from fake_method ever ends up somewhere it
shouldn't -- passed to something that uses TYPE_ALLOC -- gdb will crash.

I wonder if get_type_arch should assert that the result is not NULL.

Andrew> 	* gdbtypes.h (TYPE_ALLOC): Allocate space on either the objfile
Andrew> 	obstack, or the gdbarch obstack.
Andrew> 	(TYPE_ZALLOC): Rewrite using TYPE_ALLOC.
Andrew> 	* eval.c (fake_method::fake_method): Call xzalloc directly for a
Andrew> 	type that is neither object file owned, nor gdbarch owned.

Andrew> +/* See comment on TYPE_ALLOC.  */
Andrew> +
Andrew> +#define TYPE_ZALLOC(t,size) (memset (TYPE_ALLOC (t, size), 0, size))
 
Would you mind seeing what happens if you use obstack_zalloc here
instead?  It seems like that would give us some extra compile-time
safety.  If it fails, that would be interesting.


I think the eval.c change should have a comment explaining why
TYPE_ZALLOC is not used.

This is ok with that nit changed.  If obstack_zalloc works the I think
that variant would be better.

thanks,
Tom


  reply	other threads:[~2018-09-11 20:38 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-11 14:12 Andrew Burgess
2018-09-11 20:38 ` Tom Tromey [this message]
2018-09-13  0:31   ` Andrew Burgess
2018-09-13  3:31     ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87lg87rcq3.fsf@tromey.com \
    --to=tom@tromey.com \
    --cc=andrew.burgess@embecosm.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox