~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/coccinelle/iterators/for_each_child.cocci

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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: https://coccinelle.gitlabpages.inria.fr/website
  9 // Options: --no-includes --include-headers
 10 
 11 virtual patch
 12 virtual context
 13 virtual org
 14 virtual report
 15 
 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;
 26 @@
 27 
 28 (
 29 (
 30 for_each_node_by_name(n,e1) S
 31 |
 32 for_each_node_by_type(n,e1) S
 33 |
 34 for_each_compatible_node(n,e1,e2) S
 35 |
 36 for_each_matching_node(n,e1) S
 37 |
 38 for_each_matching_node_and_match(n,e1,e2) S
 39 |
 40 for_each_child_of_node(e1,n) S
 41 |
 42 for_each_available_child_of_node(e1,n) S
 43 |
 44 for_each_node_with_property(n,e1) S
 45 )
 46 &
 47 i(es,n,...) S
 48 )
 49 
 50 @ruleone depends on patch && !context && !org && !report@
 51 
 52 local idexpression r.n;
 53 iterator r.i,i1;
 54 expression e;
 55 expression list [r.n1] es;
 56 statement S;
 57 @@
 58 
 59  i(es,n,...) {
 60    ...
 61 (
 62    of_node_put(n);
 63 |
 64    e = n
 65 |
 66    return n;
 67 |
 68    i1(...,n,...) S
 69 |
 70 - return of_node_get(n);
 71 + return n;
 72 |
 73 +  of_node_put(n);
 74 ?  return ...;
 75 )
 76    ... when any
 77  }
 78 
 79 @ruletwo depends on patch && !context && !org && !report@
 80 
 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;
 86 @@
 87 
 88  i(es,n,...) {
 89    ...
 90 (
 91    of_node_put(n);
 92 |
 93    e = n
 94 |
 95    i1(...,n,...) S
 96 |
 97 +  of_node_put(n);
 98 ?  break;
 99 )
100    ... when any
101  }
102 ... when != n
103     when strict
104     when forall
105 (
106  n = e1;
107 |
108 ?i2(...,n,...) S2
109 )
110 
111 @rulethree depends on patch && !context && !org && !report exists@
112 
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;
119 @@
120 
121  i(es,n,...) {
122    ...
123 (
124    of_node_put(n);
125 |
126    e = n
127 |
128    i1(...,n,...) S
129 |
130 +  of_node_put(n);
131 ?  goto l;
132 )
133    ... when any
134  }
135 ... when exists
136 l: ... when != n
137        when strict
138        when forall
139 (
140  n = e1;
141 |
142 ?i2(...,n,...) S2
143 )
144 
145 // ----------------------------------------------------------------------------
146 
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;
154 @@
155 
156  i@j0(es,n,...) {
157    ...
158 (
159    of_node_put(n);
160 |
161    e = n
162 |
163    return n;
164 |
165    i1(...,n,...) S
166 |
167   return @j1 ...;
168 )
169    ... when any
170  }
171 
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;
177 @@
178 
179 *  i@j0(es,n,...) {
180    ...
181 *return  @j1...;
182    ... when any
183  }
184 
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;
192 @@
193 
194  i@j0(es,n,...) {
195    ...
196 (
197    of_node_put(n);
198 |
199    e = n
200 |
201    i1(...,n,...) S
202 |
203   break@j2;
204 )
205    ... when any
206  }
207 ... when != n
208     when strict
209     when forall
210 (
211  n = e1;
212 |
213 ?i2(...,n,...) S2
214 )
215 
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;
223 @@
224 
225 *  i@j0(es,n,...) {
226    ...
227 *break @j2;
228    ... when any
229  }
230 ... when != n
231     when strict
232     when forall
233 (
234   n = e1;
235 |
236 ?i2(...,n,...) S2
237 )
238 
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;
247 @@
248 
249  i@j0(es,n,...) {
250    ...
251 (
252    of_node_put(n);
253 |
254    e = n
255 |
256    i1(...,n,...) S
257 |
258   goto l@j3;
259 )
260   ... when any
261  }
262 ... when exists
263 l:
264 ... when != n
265     when strict
266     when forall
267 (
268  n = e1;
269 |
270 ?i2(...,n,...) S2
271 )
272 
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;
281 @@
282 
283 *  i@j0(es,n,...) {
284    ...
285 *goto l@j3;
286    ... when any
287  }
288 ... when exists
289  l:
290  ... when != n
291      when strict
292      when forall
293 (
294  n = e1;
295 |
296 ?i2(...,n,...) S2
297 )
298 
299 // ----------------------------------------------------------------------------
300 
301 @script:python ruleone_org depends on org@
302 i << r.i;
303 j0 << ruleone_context.j0;
304 j1 << ruleone_context. j1;
305 @@
306 
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], "")
310 
311 @script:python ruletwo_org depends on org@
312 i << r.i;
313 j0 << ruletwo_context.j0;
314 j2 << ruletwo_context.j2;
315 @@
316 
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], "")
320 
321 @script:python rulethree_org depends on org@
322 i << r.i;
323 j0 << rulethree_context.j0;
324 j3 << rulethree_context.j3;
325 @@
326 
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], "")
330 
331 // ----------------------------------------------------------------------------
332 
333 @script:python ruleone_report depends on report@
334 i << r.i;
335 j0 << ruleone_context.j0;
336 j1 << ruleone_context.j1;
337 @@
338 
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)
341 
342 @script:python ruletwo_report depends on report@
343 i << r.i;
344 j0 << ruletwo_context.j0;
345 j2 << ruletwo_context.j2;
346 @@
347 
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)
350 
351 @script:python rulethree_report depends on report@
352 i << r.i;
353 j0 << rulethree_context.j0;
354 j3 << rulethree_context.j3;
355 @@
356 
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)

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php