Преглед изворни кода

coccinelle: deref_null: improve performance

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@lip6.fr>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Julia Lawall пре 7 година
родитељ
комит
21195f8e9a
1 измењених фајлова са 20 додато и 20 уклоњено
  1. 20 20
      scripts/coccinelle/null/deref_null.cocci

+ 20 - 20
scripts/coccinelle/null/deref_null.cocci

@@ -14,18 +14,10 @@ virtual context
 virtual org
 virtual org
 virtual report
 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
 // The following two rules are separate, because both can match a single
 // expression in different ways
 // expression in different ways
 @pr1 expression@
 @pr1 expression@
-expression *ifm.E;
+expression E;
 identifier f;
 identifier f;
 position p1;
 position p1;
 @@
 @@
@@ -33,7 +25,7 @@ position p1;
  (E != NULL && ...) ? <+...E->f@p1...+> : ...
  (E != NULL && ...) ? <+...E->f@p1...+> : ...
 
 
 @pr2 expression@
 @pr2 expression@
-expression *ifm.E;
+expression E;
 identifier f;
 identifier f;
 position p2;
 position p2;
 @@
 @@
@@ -46,6 +38,14 @@ position p2;
  sizeof(<+...E->f@p2...+>)
  sizeof(<+...E->f@p2...+>)
 )
 )
 
 
+@ifm@
+expression *E;
+statement S1,S2;
+position p1;
+@@
+
+if@p1 ((E == NULL && ...) || ...) S1 else S2
+
 // For org and report modes
 // For org and report modes
 
 
 @r depends on !context && (org || report) exists@
 @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.
 // The following three rules are duplicates of ifm, pr1 and pr2 respectively.
 // It is need because the previous rule as already made a "change".
 // 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@
 @pr11 depends on context && !org && !report expression@
-expression *ifm1.E;
+expression E;
 identifier f;
 identifier f;
 position p1;
 position p1;
 @@
 @@
@@ -229,7 +221,7 @@ position p1;
  (E != NULL && ...) ? <+...E->f@p1...+> : ...
  (E != NULL && ...) ? <+...E->f@p1...+> : ...
 
 
 @pr12 depends on context && !org && !report expression@
 @pr12 depends on context && !org && !report expression@
-expression *ifm1.E;
+expression E;
 identifier f;
 identifier f;
 position p2;
 position p2;
 @@
 @@
@@ -242,6 +234,14 @@ position p2;
  sizeof(<+...E->f@p2...+>)
  sizeof(<+...E->f@p2...+>)
 )
 )
 
 
+@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@
 @depends on context && !org && !report exists@
 expression subE <= ifm1.E;
 expression subE <= ifm1.E;
 expression *ifm1.E;
 expression *ifm1.E;