This is the mail archive of the gdb-patches@sourceware.org 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]
Other format: [Raw text]

Re: [PATCH] gdb: Don't leak memory with TYPE_ALLOC / TYPE_ZALLOC


>>>>> "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


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