Merge tag 'block-5.11-2021-01-10' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / scripts / coccinelle / iterators / for_each_child.cocci
blobbc394615948ef3718ad15ccc5ff9b0b636c9be55
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Adds missing of_node_put() before return/break/goto statement within a for_each iterator for child nodes.
3 //# False positives can be due to function calls within the for_each
4 //# loop that may encapsulate an of_node_put.
5 ///
6 // Confidence: High
7 // Copyright: (C) 2020 Sumera Priyadarsini
8 // URL: http://coccinelle.lip6.fr
9 // Options: --no-includes --include-headers
11 virtual patch
12 virtual context
13 virtual org
14 virtual report
16 @r@
17 local idexpression n;
18 expression e1,e2;
19 iterator name for_each_node_by_name, for_each_node_by_type,
20 for_each_compatible_node, for_each_matching_node,
21 for_each_matching_node_and_match, for_each_child_of_node,
22 for_each_available_child_of_node, for_each_node_with_property;
23 iterator i;
24 statement S;
25 expression list [n1] es;
30 for_each_node_by_name(n,e1) S
32 for_each_node_by_type(n,e1) S
34 for_each_compatible_node(n,e1,e2) S
36 for_each_matching_node(n,e1) S
38 for_each_matching_node_and_match(n,e1,e2) S
40 for_each_child_of_node(e1,n) S
42 for_each_available_child_of_node(e1,n) S
44 for_each_node_with_property(n,e1) S
47 i(es,n,...) S
50 @ruleone depends on patch && !context && !org && !report@
52 local idexpression r.n;
53 iterator r.i,i1;
54 expression e;
55 expression list [r.n1] es;
56 statement S;
59  i(es,n,...) {
60    ...
62    of_node_put(n);
64    e = n
66    return n;
68    i1(...,n,...) S
70 - return of_node_get(n);
71 + return n;
73 +  of_node_put(n);
74 ?  return ...;
76    ... when any
77  }
79 @ruletwo depends on patch && !context && !org && !report@
81 local idexpression r.n;
82 iterator r.i,i1,i2;
83 expression e,e1;
84 expression list [r.n1] es;
85 statement S,S2;
88  i(es,n,...) {
89    ...
91    of_node_put(n);
93    e = n
95    i1(...,n,...) S
97 +  of_node_put(n);
98 ?  break;
100    ... when any
102 ... when != n
103     when strict
104     when forall
106  n = e1;
108 ?i2(...,n,...) S2
111 @rulethree depends on patch && !context && !org && !report exists@
113 local idexpression r.n;
114 iterator r.i,i1,i2;
115 expression e,e1;
116 identifier l;
117 expression list [r.n1] es;
118 statement S,S2;
121  i(es,n,...) {
122    ...
124    of_node_put(n);
126    e = n
128    i1(...,n,...) S
130 +  of_node_put(n);
131 ?  goto l;
133    ... when any
135 ... when exists
136 l: ... when != n
137        when strict
138        when forall
140  n = e1;
142 ?i2(...,n,...) S2
145 // ----------------------------------------------------------------------------
147 @ruleone_context depends on !patch && (context || org || report) exists@
148 statement S;
149 expression e;
150 expression list[r.n1] es;
151 iterator r.i, i1;
152 local idexpression r.n;
153 position j0, j1;
156  i@j0(es,n,...) {
157    ...
159    of_node_put(n);
161    e = n
163    return n;
165    i1(...,n,...) S
167   return @j1 ...;
169    ... when any
172 @ruleone_disj depends on !patch && (context || org || report)@
173 expression list[r.n1] es;
174 iterator r.i;
175 local idexpression r.n;
176 position ruleone_context.j0, ruleone_context.j1;
179 *  i@j0(es,n,...) {
180    ...
181 *return  @j1...;
182    ... when any
185 @ruletwo_context depends on !patch && (context || org || report) exists@
186 statement S, S2;
187 expression e, e1;
188 expression list[r.n1] es;
189 iterator r.i, i1, i2;
190 local idexpression r.n;
191 position j0, j2;
194  i@j0(es,n,...) {
195    ...
197    of_node_put(n);
199    e = n
201    i1(...,n,...) S
203   break@j2;
205    ... when any
207 ... when != n
208     when strict
209     when forall
211  n = e1;
213 ?i2(...,n,...) S2
216 @ruletwo_disj depends on !patch && (context || org || report)@
217 statement S2;
218 expression e1;
219 expression list[r.n1] es;
220 iterator r.i, i2;
221 local idexpression r.n;
222 position ruletwo_context.j0, ruletwo_context.j2;
225 *  i@j0(es,n,...) {
226    ...
227 *break @j2;
228    ... when any
230 ... when != n
231     when strict
232     when forall
234   n = e1;
236 ?i2(...,n,...) S2
239 @rulethree_context depends on !patch && (context || org || report) exists@
240 identifier l;
241 statement S,S2;
242 expression e, e1;
243 expression list[r.n1] es;
244 iterator r.i, i1, i2;
245 local idexpression r.n;
246 position j0, j3;
249  i@j0(es,n,...) {
250    ...
252    of_node_put(n);
254    e = n
256    i1(...,n,...) S
258   goto l@j3;
260   ... when any
262 ... when exists
264 ... when != n
265     when strict
266     when forall
268  n = e1;
270 ?i2(...,n,...) S2
273 @rulethree_disj depends on !patch && (context || org || report) exists@
274 identifier l;
275 statement S2;
276 expression e1;
277 expression list[r.n1] es;
278 iterator r.i, i2;
279 local idexpression r.n;
280 position rulethree_context.j0, rulethree_context.j3;
283 *  i@j0(es,n,...) {
284    ...
285 *goto l@j3;
286    ... when any
288 ... when exists
289  l:
290  ... when != n
291      when strict
292      when forall
294  n = e1;
296 ?i2(...,n,...) S2
299 // ----------------------------------------------------------------------------
301 @script:python ruleone_org depends on org@
302 i << r.i;
303 j0 << ruleone_context.j0;
304 j1 << ruleone_context. j1;
307 msg = "WARNING: Function \"%s\" should have of_node_put() before return " % (i)
308 coccilib.org.print_safe_todo(j0[0], msg)
309 coccilib.org.print_link(j1[0], "")
311 @script:python ruletwo_org depends on org@
312 i << r.i;
313 j0 << ruletwo_context.j0;
314 j2 << ruletwo_context.j2;
317 msg = "WARNING: Function \"%s\" should have of_node_put() before break " % (i)
318 coccilib.org.print_safe_todo(j0[0], msg)
319 coccilib.org.print_link(j2[0], "")
321 @script:python rulethree_org depends on org@
322 i << r.i;
323 j0 << rulethree_context.j0;
324 j3 << rulethree_context.j3;
327 msg = "WARNING: Function \"%s\" should have of_node_put() before goto " % (i)
328 coccilib.org.print_safe_todo(j0[0], msg)
329 coccilib.org.print_link(j3[0], "")
331 // ----------------------------------------------------------------------------
333 @script:python ruleone_report depends on report@
334 i << r.i;
335 j0 << ruleone_context.j0;
336 j1 << ruleone_context.j1;
339 msg = "WARNING: Function \"%s\" should have of_node_put() before return around line %s." % (i, j1[0].line)
340 coccilib.report.print_report(j0[0], msg)
342 @script:python ruletwo_report depends on report@
343 i << r.i;
344 j0 << ruletwo_context.j0;
345 j2 << ruletwo_context.j2;
348 msg = "WARNING: Function \"%s\" should have of_node_put() before break around line %s." % (i,j2[0].line)
349 coccilib.report.print_report(j0[0], msg)
351 @script:python rulethree_report depends on report@
352 i << r.i;
353 j0 << rulethree_context.j0;
354 j3 << rulethree_context.j3;
357 msg = "WARNING: Function \"%s\" should have of_node_put() before goto around lines %s." % (i,j3[0].line)
358 coccilib.report.print_report(j0[0], msg)