Re: [PATCH] coccinelle: deref_null: improve performance
From: Masahiro Yamada
Date: Tue May 22 2018 - 09:29:51 EST
2018-05-21 15:58 GMT+09:00 Julia Lawall <Julia.Lawall@xxxxxxx>:
> Move rules looking for some special cases of safe dereferences before
> the collection of NULL-tested values. The special cases are fairly
> rare, but somewhat costly to find, because isomorphisms create many
> variants of the rules. There is thus no need to search for them over
> and over for each NULL tested expression. Collecting them just once
> is sufficient and more efficient.
>
> Signed-off-by: Julia Lawall <Julia.Lawall@xxxxxxx>
>
> ---
> scripts/coccinelle/null/deref_null.cocci | 40 +++++++++++++++----------------
> 1 file changed, 20 insertions(+), 20 deletions(-)
Applied to linux-kbuild. Thanks!
> diff --git a/scripts/coccinelle/null/deref_null.cocci b/scripts/coccinelle/null/deref_null.cocci
> index b16ccb7..cbc6184 100644
> --- a/scripts/coccinelle/null/deref_null.cocci
> +++ b/scripts/coccinelle/null/deref_null.cocci
> @@ -14,18 +14,10 @@ virtual context
> virtual org
> virtual report
>
> -@ifm@
> -expression *E;
> -statement S1,S2;
> -position p1;
> -@@
> -
> -if@p1 ((E == NULL && ...) || ...) S1 else S2
> -
> // The following two rules are separate, because both can match a single
> // expression in different ways
> @pr1 expression@
> -expression *ifm.E;
> +expression E;
> identifier f;
> position p1;
> @@
> @@ -33,7 +25,7 @@ position p1;
> (E != NULL && ...) ? <+...E->f@xxxxx+> : ...
>
> @pr2 expression@
> -expression *ifm.E;
> +expression E;
> identifier f;
> position p2;
> @@
> @@ -46,6 +38,14 @@ position p2;
> sizeof(<+...E->f@xxxxx+>)
> )
>
> +@ifm@
> +expression *E;
> +statement S1,S2;
> +position p1;
> +@@
> +
> +if@p1 ((E == NULL && ...) || ...) S1 else S2
> +
> // For org and report modes
>
> @r depends on !context && (org || report) exists@
> @@ -212,16 +212,8 @@ else S3
> // The following three rules are duplicates of ifm, pr1 and pr2 respectively.
> // It is need because the previous rule as already made a "change".
>
> -@ifm1 depends on context && !org && !report@
> -expression *E;
> -statement S1,S2;
> -position p1;
> -@@
> -
> -if@p1 ((E == NULL && ...) || ...) S1 else S2
> -
> @pr11 depends on context && !org && !report expression@
> -expression *ifm1.E;
> +expression E;
> identifier f;
> position p1;
> @@
> @@ -229,7 +221,7 @@ position p1;
> (E != NULL && ...) ? <+...E->f@xxxxx+> : ...
>
> @pr12 depends on context && !org && !report expression@
> -expression *ifm1.E;
> +expression E;
> identifier f;
> position p2;
> @@
> @@ -242,6 +234,14 @@ position p2;
> sizeof(<+...E->f@xxxxx+>)
> )
>
> +@ifm1 depends on context && !org && !report@
> +expression *E;
> +statement S1,S2;
> +position p1;
> +@@
> +
> +if@p1 ((E == NULL && ...) || ...) S1 else S2
> +
> @depends on context && !org && !report exists@
> expression subE <= ifm1.E;
> expression *ifm1.E;
>
--
Best Regards
Masahiro Yamada