diff options
author | Julia Lawall <Julia.Lawall@lip6.fr> | 2012-01-14 17:41:54 -0500 |
---|---|---|
committer | Michal Marek <mmarek@suse.cz> | 2012-01-14 18:05:46 -0500 |
commit | 29a36d4dec6cf7ad72e6e3337bf954096cbbb4cf (patch) | |
tree | 15ac5f3d0df3f56f233603e8626b5d383e6ab278 /scripts/coccinelle/iterators | |
parent | fb3f8af4ff52faf9b31e6c4e8ca0b0b16332808c (diff) |
scripts/coccinelle: improve the coverage of some semantic patches
This patch ensures that all semantic patches in the scripts/coccinelle
directory provide the report option. Report messages that include line
numbers now have the line number preceded by "line" for easier subsequent
processing.
Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Michal Marek <mmarek@suse.cz>
Diffstat (limited to 'scripts/coccinelle/iterators')
-rw-r--r-- | scripts/coccinelle/iterators/fen.cocci | 73 | ||||
-rw-r--r-- | scripts/coccinelle/iterators/itnull.cocci | 54 |
2 files changed, 111 insertions, 16 deletions
diff --git a/scripts/coccinelle/iterators/fen.cocci b/scripts/coccinelle/iterators/fen.cocci index 77bc108c3f59..0a40af828c43 100644 --- a/scripts/coccinelle/iterators/fen.cocci +++ b/scripts/coccinelle/iterators/fen.cocci | |||
@@ -2,16 +2,19 @@ | |||
2 | /// is no point to call of_node_put on the final value. | 2 | /// is no point to call of_node_put on the final value. |
3 | /// | 3 | /// |
4 | // Confidence: High | 4 | // Confidence: High |
5 | // Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. | 5 | // Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. |
6 | // Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. | 6 | // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. |
7 | // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. | 7 | // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. |
8 | // URL: http://coccinelle.lip6.fr/ | 8 | // URL: http://coccinelle.lip6.fr/ |
9 | // Comments: | 9 | // Comments: |
10 | // Options: -no_includes -include_headers | 10 | // Options: -no_includes -include_headers |
11 | 11 | ||
12 | virtual patch | 12 | virtual patch |
13 | virtual context | ||
14 | virtual org | ||
15 | virtual report | ||
13 | 16 | ||
14 | @@ | 17 | @depends on patch@ |
15 | iterator name for_each_node_by_name; | 18 | iterator name for_each_node_by_name; |
16 | expression np,E; | 19 | expression np,E; |
17 | identifier l; | 20 | identifier l; |
@@ -24,7 +27,7 @@ for_each_node_by_name(np,...) { | |||
24 | ... when != np = E | 27 | ... when != np = E |
25 | - of_node_put(np); | 28 | - of_node_put(np); |
26 | 29 | ||
27 | @@ | 30 | @depends on patch@ |
28 | iterator name for_each_node_by_type; | 31 | iterator name for_each_node_by_type; |
29 | expression np,E; | 32 | expression np,E; |
30 | identifier l; | 33 | identifier l; |
@@ -37,7 +40,7 @@ for_each_node_by_type(np,...) { | |||
37 | ... when != np = E | 40 | ... when != np = E |
38 | - of_node_put(np); | 41 | - of_node_put(np); |
39 | 42 | ||
40 | @@ | 43 | @depends on patch@ |
41 | iterator name for_each_compatible_node; | 44 | iterator name for_each_compatible_node; |
42 | expression np,E; | 45 | expression np,E; |
43 | identifier l; | 46 | identifier l; |
@@ -50,7 +53,7 @@ for_each_compatible_node(np,...) { | |||
50 | ... when != np = E | 53 | ... when != np = E |
51 | - of_node_put(np); | 54 | - of_node_put(np); |
52 | 55 | ||
53 | @@ | 56 | @depends on patch@ |
54 | iterator name for_each_matching_node; | 57 | iterator name for_each_matching_node; |
55 | expression np,E; | 58 | expression np,E; |
56 | identifier l; | 59 | identifier l; |
@@ -62,3 +65,59 @@ for_each_matching_node(np,...) { | |||
62 | } | 65 | } |
63 | ... when != np = E | 66 | ... when != np = E |
64 | - of_node_put(np); | 67 | - of_node_put(np); |
68 | |||
69 | // ---------------------------------------------------------------------- | ||
70 | |||
71 | @r depends on !patch forall@ | ||
72 | //iterator name for_each_node_by_name; | ||
73 | //iterator name for_each_node_by_type; | ||
74 | //iterator name for_each_compatible_node; | ||
75 | //iterator name for_each_matching_node; | ||
76 | expression np,E; | ||
77 | identifier l; | ||
78 | position p1,p2; | ||
79 | @@ | ||
80 | |||
81 | ( | ||
82 | *for_each_node_by_name@p1(np,...) | ||
83 | { | ||
84 | ... when != break; | ||
85 | when != goto l; | ||
86 | } | ||
87 | | | ||
88 | *for_each_node_by_type@p1(np,...) | ||
89 | { | ||
90 | ... when != break; | ||
91 | when != goto l; | ||
92 | } | ||
93 | | | ||
94 | *for_each_compatible_node@p1(np,...) | ||
95 | { | ||
96 | ... when != break; | ||
97 | when != goto l; | ||
98 | } | ||
99 | | | ||
100 | *for_each_matching_node@p1(np,...) | ||
101 | { | ||
102 | ... when != break; | ||
103 | when != goto l; | ||
104 | } | ||
105 | ) | ||
106 | ... when != np = E | ||
107 | * of_node_put@p2(np); | ||
108 | |||
109 | @script:python depends on org@ | ||
110 | p1 << r.p1; | ||
111 | p2 << r.p2; | ||
112 | @@ | ||
113 | |||
114 | cocci.print_main("unneeded of_node_put",p2) | ||
115 | cocci.print_secs("iterator",p1) | ||
116 | |||
117 | @script:python depends on report@ | ||
118 | p1 << r.p1; | ||
119 | p2 << r.p2; | ||
120 | @@ | ||
121 | |||
122 | msg = "ERROR: of_node_put not needed after iterator on line %s" % (p1[0].line) | ||
123 | coccilib.report.print_report(p2[0], msg) | ||
diff --git a/scripts/coccinelle/iterators/itnull.cocci b/scripts/coccinelle/iterators/itnull.cocci index baa4297a4ed1..259899f6838e 100644 --- a/scripts/coccinelle/iterators/itnull.cocci +++ b/scripts/coccinelle/iterators/itnull.cocci | |||
@@ -1,20 +1,24 @@ | |||
1 | /// Many iterators have the property that the first argument is always bound | 1 | /// Many iterators have the property that the first argument is always bound |
2 | /// to a real list element, never NULL. False positives arise for some | 2 | /// to a real list element, never NULL. |
3 | /// iterators that do not have this property, or in cases when the loop | 3 | //# False positives arise for some iterators that do not have this property, |
4 | /// cursor is reassigned. The latter should only happen when the matched | 4 | //# or in cases when the loop cursor is reassigned. The latter should only |
5 | /// code is on the way to a loop exit (break, goto, or return). | 5 | //# happen when the matched code is on the way to a loop exit (break, goto, |
6 | //# or return). | ||
6 | /// | 7 | /// |
7 | // Confidence: Moderate | 8 | // Confidence: Moderate |
8 | // Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. | 9 | // Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. |
9 | // Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. | 10 | // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. |
10 | // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. | 11 | // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. |
11 | // URL: http://coccinelle.lip6.fr/ | 12 | // URL: http://coccinelle.lip6.fr/ |
12 | // Comments: | 13 | // Comments: |
13 | // Options: -no_includes -include_headers | 14 | // Options: -no_includes -include_headers |
14 | 15 | ||
15 | virtual patch | 16 | virtual patch |
17 | virtual context | ||
18 | virtual org | ||
19 | virtual report | ||
16 | 20 | ||
17 | @@ | 21 | @depends on patch@ |
18 | iterator I; | 22 | iterator I; |
19 | expression x,E,E1,E2; | 23 | expression x,E,E1,E2; |
20 | statement S,S1,S2; | 24 | statement S,S1,S2; |
@@ -55,4 +59,36 @@ I(x,...) { <... | |||
55 | x != NULL | 59 | x != NULL |
56 | + ) | 60 | + ) |
57 | ) | 61 | ) |
58 | ...> } \ No newline at end of file | 62 | ...> } |
63 | |||
64 | @r depends on !patch exists@ | ||
65 | iterator I; | ||
66 | expression x,E; | ||
67 | position p1,p2; | ||
68 | @@ | ||
69 | |||
70 | *I@p1(x,...) | ||
71 | { ... when != x = E | ||
72 | ( | ||
73 | * x@p2 == NULL | ||
74 | | | ||
75 | * x@p2 != NULL | ||
76 | ) | ||
77 | ... when any | ||
78 | } | ||
79 | |||
80 | @script:python depends on org@ | ||
81 | p1 << r.p1; | ||
82 | p2 << r.p2; | ||
83 | @@ | ||
84 | |||
85 | cocci.print_main("iterator-bound variable",p1) | ||
86 | cocci.print_secs("useless NULL test",p2) | ||
87 | |||
88 | @script:python depends on report@ | ||
89 | p1 << r.p1; | ||
90 | p2 << r.p2; | ||
91 | @@ | ||
92 | |||
93 | msg = "ERROR: iterator variable bound on line %s cannot be NULL" % (p1[0].line) | ||
94 | coccilib.report.print_report(p2[0], msg) | ||