linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ian Rogers <irogers@google.com>
To: Arnaldo Carvalho de Melo <acme@kernel.org>, dmalcolm@redhat.com
Cc: Namhyung Kim <namhyung@kernel.org>, Jiri Olsa <jolsa@redhat.com>,
	Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Stephane Eranian <eranian@google.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 05/11] perf parse-event: Fix memory leak in evsel->unit
Date: Tue, 15 Sep 2020 11:59:13 -0700	[thread overview]
Message-ID: <CAP-5=fXwuS_GAjnQgBav=Ugc26OACimUmbhtAHbeThb_BEk0UQ@mail.gmail.com> (raw)
In-Reply-To: <20200915121912.GF720847@kernel.org>

On Tue, Sep 15, 2020 at 5:19 AM Arnaldo Carvalho de Melo
<acme@kernel.org> wrote:
>
> Em Tue, Sep 15, 2020 at 12:18:13PM +0900, Namhyung Kim escreveu:
> > The evsel->unit borrows a pointer of pmu event or alias instead of
> > owns a string.  But tool event (duration_time) passes a result of
> > strdup() caused a leak.
> >
> > It was found by ASAN during metric test:
>
> Thanks, applied.

Thanks Namhyung and Arnaldo, just to raise a meta point. A lot of the
parse-events asan failures were caused by a lack of strdup causing
frees of string literals. It seems we're now adding strdup defensively
but introducing memory leaks. Could we be doing this in a smarter way?
For C++ I'd likely use std::string and walk away. For perf code the
best source of "ownership" I've found is to look at the "delete"
functions and figure out ownership from what gets freed there - this
can be burdensome. For strings, the code is also using strbuf and
asprintf. One possible improvement could be to document ownership next
to the struct member variable declarations. Another idea would be to
declare a macro whose usage would look like:

struct evsel {
...
  OWNER(char *name, "this");
...
  UNOWNED(const char *unit);
...

Maybe then we could get a static analyzer to complain if a literal
were assigned to an owned struct variable. Perhaps if a strdup were
assigned to an UNOWNED struct variable perhaps it could warn too, as
presumably the memory allocation is a request to own the memory.

There was a talk about GCC's -fanalyzer option doing malloc/free
checking at Linux plumbers 2 weeks ago:
https://linuxplumbersconf.org/event/7/contributions/721/attachments/542/961/2020-LPC-analyzer-talk.pdf
I added David Malcolm, the LPC presenter, as he may have ideas on how
we could do this in a better way.

Thanks,
Ian


> >   Direct leak of 210 byte(s) in 70 object(s) allocated from:
> >     #0 0x7fe366fca0b5 in strdup (/lib/x86_64-linux-gnu/libasan.so.5+0x920b5)
> >     #1 0x559fbbcc6ea3 in add_event_tool util/parse-events.c:414
> >     #2 0x559fbbcc6ea3 in parse_events_add_tool util/parse-events.c:1414
> >     #3 0x559fbbd8474d in parse_events_parse util/parse-events.y:439
> >     #4 0x559fbbcc95da in parse_events__scanner util/parse-events.c:2096
> >     #5 0x559fbbcc95da in __parse_events util/parse-events.c:2141
> >     #6 0x559fbbc28555 in check_parse_id tests/pmu-events.c:406
> >     #7 0x559fbbc28555 in check_parse_id tests/pmu-events.c:393
> >     #8 0x559fbbc28555 in check_parse_cpu tests/pmu-events.c:415
> >     #9 0x559fbbc28555 in test_parsing tests/pmu-events.c:498
> >     #10 0x559fbbc0109b in run_test tests/builtin-test.c:410
> >     #11 0x559fbbc0109b in test_and_print tests/builtin-test.c:440
> >     #12 0x559fbbc03e69 in __cmd_test tests/builtin-test.c:695
> >     #13 0x559fbbc03e69 in cmd_test tests/builtin-test.c:807
> >     #14 0x559fbbc691f4 in run_builtin /home/namhyung/project/linux/tools/perf/perf.c:312
> >     #15 0x559fbbb071a8 in handle_internal_command /home/namhyung/project/linux/tools/perf/perf.c:364
> >     #16 0x559fbbb071a8 in run_argv /home/namhyung/project/linux/tools/perf/perf.c:408
> >     #17 0x559fbbb071a8 in main /home/namhyung/project/linux/tools/perf/perf.c:538
> >     #18 0x7fe366b68cc9 in __libc_start_main ../csu/libc-start.c:308
> >
> > Acked-by: Jiri Olsa <jolsa@redhat.com>
> > Fixes: f0fbb114e3025 ("perf stat: Implement duration_time as a proper event")
> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> > ---
> >  tools/perf/util/parse-events.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
> > index b35e4bb1cecb..ece321ccf599 100644
> > --- a/tools/perf/util/parse-events.c
> > +++ b/tools/perf/util/parse-events.c
> > @@ -416,7 +416,7 @@ static int add_event_tool(struct list_head *list, int *idx,
> >               return -ENOMEM;
> >       evsel->tool_event = tool_event;
> >       if (tool_event == PERF_TOOL_DURATION_TIME)
> > -             evsel->unit = strdup("ns");
> > +             evsel->unit = "ns";
> >       return 0;
> >  }
> >
> > --
> > 2.28.0.618.gf4bc123cb7-goog
> >
>
> --
>
> - Arnaldo

  reply	other threads:[~2020-09-15 18:59 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-15  3:18 [PATCHSET v2 00/11] perf tools: Fix various memory leaks Namhyung Kim
2020-09-15  3:18 ` [PATCH 01/11] perf metric: Fix some " Namhyung Kim
2020-09-15 11:58   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 02/11] perf metric: Fix some memory leaks - part 2 Namhyung Kim
2020-09-15 11:59   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 03/11] perf evlist: Fix cpu/thread map leak Namhyung Kim
2020-09-15  3:18 ` [PATCH 04/11] perf parse-event: Fix cpu map leaks Namhyung Kim
2020-09-15 12:18   ` Arnaldo Carvalho de Melo
2020-09-15 14:39     ` Namhyung Kim
2020-09-15 16:51       ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 05/11] perf parse-event: Fix memory leak in evsel->unit Namhyung Kim
2020-09-15 12:19   ` Arnaldo Carvalho de Melo
2020-09-15 18:59     ` Ian Rogers [this message]
2020-09-15 19:56       ` David Malcolm
2020-09-16  7:12         ` Namhyung Kim
2020-09-16 18:37           ` Ian Rogers
2020-09-15 20:03       ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 06/11] perf test: Fix memory leaks in parse-metric test Namhyung Kim
2020-09-15 12:23   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 07/11] perf metric: Release expr_parse_ctx after testing Namhyung Kim
2020-09-15  3:18 ` [PATCH 08/11] perf metric: Free metric when it failed to resolve Namhyung Kim
2020-09-15 12:24   ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 09/11] perf metric: Do not free metric when " Namhyung Kim
2020-09-15  3:18 ` [PATCH 10/11] perf test: Free aliases for PMU event map aliases test Namhyung Kim
2020-09-15  7:37   ` John Garry
2020-09-15 11:57     ` Arnaldo Carvalho de Melo
2020-09-15  3:18 ` [PATCH 11/11] perf test: Free formats for perf pmu parse test Namhyung Kim
2020-09-15  5:15 ` [PATCHSET v2 00/11] perf tools: Fix various memory leaks Ian Rogers
2020-09-15 14:49   ` Namhyung Kim

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='CAP-5=fXwuS_GAjnQgBav=Ugc26OACimUmbhtAHbeThb_BEk0UQ@mail.gmail.com' \
    --to=irogers@google.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=dmalcolm@redhat.com \
    --cc=eranian@google.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.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;
as well as URLs for NNTP newsgroup(s).