public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Martin Sebor <msebor@gmail.com>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: Re: [PATCH] plug memory leaks in warn_parm_array_mismatch (PR 99055)
Date: Fri, 12 Feb 2021 08:35:52 +0100	[thread overview]
Message-ID: <CAFiYyc1NA98tZjyNku-G8h2hSs3dozhOkz+MYP5ouN-OeUW-wQ@mail.gmail.com> (raw)
In-Reply-To: <23a920e2-a6e2-f7db-8e75-ff6224f732d2@gmail.com>

On Thu, Feb 11, 2021 at 7:35 PM Martin Sebor <msebor@gmail.com> wrote:
>
> On 2/11/21 12:59 AM, Richard Biener wrote:
> > On Wed, Feb 10, 2021 at 6:16 PM Martin Sebor <msebor@gmail.com> wrote:
> >>
> >> The attached patch replaces calls to print_generic_expr_to_str() with
> >> a helper function that returns a std::string and releases the caller
> >> from the responsibility to explicitly free memory.
> >
> > I don't like this.  What's the reason to use generic_expr_as_string
> > anyway?  We have %E pretty-printers after all.
>
> [Reposting; my first reply was too big.]
>
> The VLA bound is either an expression or the asterisk (*) when newbnd
> is null.  The reason for using the function is to avoid duplicating
> the warning call and making one with %E and another with "*".
>
> > Couldn't you have
> > fixed the leak by doing
> >
> > if (newbnd)
> >    free (newbndstr);
> >
> > etc.?
>
> Yes, I could have.  I considered it and chose not to because this
> is much simpler, safer (if newbnd were to change after newbndstr
> is set), and more in the "C++ spirit" (RAII).  This code already
> uses std::string (attr_access::array_as_string) and so my change
> is in line with it.
>
> I understand that you prefer a more C-ish coding style so if you
> consider it a prerequisite for accepting this fix I can make
> the change conform to it.  See the attached revision (although
> I hope you'll see why I chose not to go this route).

I can understand but I still disagree ;)

> For what it's worth, print_generic_expr_to_str() would be improved
> by returning std::string.  It would mean including <string> in
> most sources in the compiler, which I suspect may not be a popular
> suggestion with everyone here, and which is why I didn't make it
> to begin with.  But if you're open to it I'm happy to make that
> change either for GCC 12 or even now.

Well, looking at print_generic_expr_to_str I see

/* Print a single expression T to string, and return it.  */

char *
print_generic_expr_to_str (tree t)
{
  pretty_printer pp;
  dump_generic_node (&pp, t, 0, TDF_VOPS|TDF_MEMSYMS, false);
  return xstrdup (pp_formatted_text (&pp));
}

which makes me think that this instead should be sth like

class generic_expr_as_str : public pretty_printer
{
   generic_expr_as_str (tree t) { dump_generic_node (&pp, t, 0,
TDF_VOPS|TDF_MEMSYMS, false); }
   operator const char *() { return pp_formatted_text (&pp); }
   pretty_printer pp;
};

As we do seem to have a RAII pretty-printer class already.  That said,
I won't mind using

   pretty_printer pp;
   dump_generic_node (&pp, t, 0, TDF_VOPS|TDF_MEMSYMS, false);

and pp_formatted_text () in the users either.

That is, print_generic_expr_to_str looks just like a bad designed hack.
Using std::string there doesn't make it any better.

Don't you agree to that?

So your 2nd variant patch is OK but you might consider just using
a pretty-printer manually and even do away with the xstrdup in that
way entirely!

> >
> >> With the patch installed, Valgrind shows more leaks in this code that
> >> I'm not sure what to do about:
> >>
> >> 1) A tree built by build_type_attribute_qual_variant() called from
> >>      attr_access::array_as_string() to build a temporary type only
> >>      for the purposes of formatting it.
> >>
> >> 2) A tree (an attribute list) built by tree_cons() called from
> >>      build_attr_access_from_parms() that's used only for the duration
> >>      of the caller.
> >>
> >> Do these temporary trees need to be released somehow or are the leaks
> >> expected?
> >
> > You should configure GCC with --enable-valgrind-annotations to make
> > it aware of our GC.
>
> I did configure with that option:
>
> $ /src/gcc/master/configure --enable-checking=yes
> --enable-languages=all,jit,lto --enable-host-shared
> --enable-valgrind-annotations
>
> Attached to pr99055 is my valgrind output for gcc.dg/Wvla-parameter.c
> with the top of trunk and the patch applied:
>
> $ /build/gcc-master/gcc/xgcc -B /build/gcc-master/gcc -S -Wall
> /src/gcc/master/gcc/testsuite/gcc.dg/Wvla-parameter.c -wrapper
> valgrind,--leak-check=full,--show-leak-kinds=all,--track-origins=yes,--log-file=valgrind-out.txt
>
> Do you not see the same leaks?

Err, well.  --show-leak-kinds=all is probably the cause.  We
definitely do not force-release
all reachable GC allocated memory at program end.  Not sure if
valgrind annotations can
make that obvious to valgrind.  I'm just using --leak-check=full and
thus look for
unreleased and no longer reachable memory.

Richard.

>
> Martin
>

  reply	other threads:[~2021-02-12  7:36 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-10 17:16 Martin Sebor
2021-02-11  7:59 ` Richard Biener
2021-02-11 17:29   ` Martin Sebor
2021-02-11 18:35     ` Fwd: " Martin Sebor
2021-02-12  7:35       ` Richard Biener [this message]
2021-02-12 18:21         ` Martin Sebor
2021-02-12 19:36           ` Richard Biener
2021-02-12 20:32             ` Martin Sebor
2021-08-06 14:09         ` Valgrind '--show-leak-kinds=all' Thomas Schwinge
2021-08-06 15:10           ` Richard Biener
2021-08-17 13:00             ` Thomas Schwinge

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=CAFiYyc1NA98tZjyNku-G8h2hSs3dozhOkz+MYP5ouN-OeUW-wQ@mail.gmail.com \
    --to=richard.guenther@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=msebor@gmail.com \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).