[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <cb37f342635b045639d877034c9f6d175b5d80cd.camel@perches.com>
Date: Thu, 13 Feb 2020 18:05:13 -0800
From: Joe Perches <joe@...ches.com>
To: Valentin Schneider <valentin.schneider@....com>,
Peter Zijlstra <peterz@...radead.org>,
"Gustavo A. R. Silva" <gustavo@...eddedor.com>
Cc: Ingo Molnar <mingo@...hat.com>, Juri Lelli <juri.lelli@...hat.com>,
Vincent Guittot <vincent.guittot@...aro.org>,
Dietmar Eggemann <dietmar.eggemann@....com>,
Steven Rostedt <rostedt@...dmis.org>,
Ben Segall <bsegall@...gle.com>, Mel Gorman <mgorman@...e.de>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] sched/fair: Replace zero-length array with
flexible-array member
On Fri, 2020-02-14 at 00:25 +0000, Valentin Schneider wrote:
> On 13/02/2020 22:02, Joe Perches wrote:
> > That might be a somewhat difficult thing to add to checkpatch
> > as it is effectively a per-line scanner:
> >
> > Try something like:
> >
> > $ git grep -P -A1 '^\s*(?!return)(\w+\s+){1,3}\w+\[0\];' -- '*.[ch]'
> >
> > and look at the results.
> >
> > In checkpatch that could be something like:
> >
> > if ($line =~ /^.\s*$Type\s+$Ident\s*\[\s*0\s*\]\s*;/) {
> > warn...
> > }
> >
>
> So FWIW I felt like doing some coccinelle and ended up with this:
>
> This patches up valid ZLAs:
> $ spatch -D patch zero_length_array.cocci kernel/sched/fair.c
>
> This prints out the location of invalid ZLAs:
> $ spatch -D report zero_length_array.cocci kernel/sched/fair.c
>
> ---
> virtual patch
> virtual report
>
> @valid_zla depends on patch@
> identifier struct_name;
> type T;
> identifier zla;
> position pos;
> @@
> struct struct_name {
> ...
> T zla@pos
> - [0];
> + [];
> };
>
> @invalid_zla depends on report@
> identifier struct_name;
> type T1;
> identifier zla;
> type T2;
> identifier tail;
> position pos;
> @@
> struct struct_name {
> ...
> T1 zla[0]@pos;
> T2 tail;
> ...
> };
>
> @script:python depends on invalid_zla@
> pos << invalid_zla.pos;
> @@
> coccilib.report.print_report(pos[0], "Invalid ZLA!");
> ---
Nice.
It would miss a few forms like:
typedef struct tagfoo {
...
type t[0];
} foo;
and
struct {
...
type t[0];
} foo;
and
struct foo {
...
type t[0];
} *foo;
etc...
Powered by blists - more mailing lists