182c2d813SSumera Priyadarsini// SPDX-License-Identifier: GPL-2.0-only
282c2d813SSumera Priyadarsini// Adds missing of_node_put() before return/break/goto statement within a for_each iterator for child nodes.
382c2d813SSumera Priyadarsini//# False positives can be due to function calls within the for_each
482c2d813SSumera Priyadarsini//# loop that may encapsulate an of_node_put.
582c2d813SSumera Priyadarsini///
682c2d813SSumera Priyadarsini// Confidence: High
782c2d813SSumera Priyadarsini// Copyright: (C) 2020 Sumera Priyadarsini
8*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website
982c2d813SSumera Priyadarsini// Options: --no-includes --include-headers
1082c2d813SSumera Priyadarsini
1182c2d813SSumera Priyadarsinivirtual patch
1282c2d813SSumera Priyadarsinivirtual context
1382c2d813SSumera Priyadarsinivirtual org
1482c2d813SSumera Priyadarsinivirtual report
1582c2d813SSumera Priyadarsini
1682c2d813SSumera Priyadarsini@r@
1782c2d813SSumera Priyadarsinilocal idexpression n;
1882c2d813SSumera Priyadarsiniexpression e1,e2;
1982c2d813SSumera Priyadarsiniiterator name for_each_node_by_name, for_each_node_by_type,
2082c2d813SSumera Priyadarsinifor_each_compatible_node, for_each_matching_node,
2182c2d813SSumera Priyadarsinifor_each_matching_node_and_match, for_each_child_of_node,
2282c2d813SSumera Priyadarsinifor_each_available_child_of_node, for_each_node_with_property;
2382c2d813SSumera Priyadarsiniiterator i;
2482c2d813SSumera Priyadarsinistatement S;
2582c2d813SSumera Priyadarsiniexpression list [n1] es;
2682c2d813SSumera Priyadarsini@@
2782c2d813SSumera Priyadarsini
2882c2d813SSumera Priyadarsini(
2982c2d813SSumera Priyadarsini(
3082c2d813SSumera Priyadarsinifor_each_node_by_name(n,e1) S
3182c2d813SSumera Priyadarsini|
3282c2d813SSumera Priyadarsinifor_each_node_by_type(n,e1) S
3382c2d813SSumera Priyadarsini|
3482c2d813SSumera Priyadarsinifor_each_compatible_node(n,e1,e2) S
3582c2d813SSumera Priyadarsini|
3682c2d813SSumera Priyadarsinifor_each_matching_node(n,e1) S
3782c2d813SSumera Priyadarsini|
3882c2d813SSumera Priyadarsinifor_each_matching_node_and_match(n,e1,e2) S
3982c2d813SSumera Priyadarsini|
4082c2d813SSumera Priyadarsinifor_each_child_of_node(e1,n) S
4182c2d813SSumera Priyadarsini|
4282c2d813SSumera Priyadarsinifor_each_available_child_of_node(e1,n) S
4382c2d813SSumera Priyadarsini|
4482c2d813SSumera Priyadarsinifor_each_node_with_property(n,e1) S
4582c2d813SSumera Priyadarsini)
4682c2d813SSumera Priyadarsini&
4782c2d813SSumera Priyadarsinii(es,n,...) S
4882c2d813SSumera Priyadarsini)
4982c2d813SSumera Priyadarsini
5082c2d813SSumera Priyadarsini@ruleone depends on patch && !context && !org && !report@
5182c2d813SSumera Priyadarsini
5282c2d813SSumera Priyadarsinilocal idexpression r.n;
5382c2d813SSumera Priyadarsiniiterator r.i,i1;
5482c2d813SSumera Priyadarsiniexpression e;
5582c2d813SSumera Priyadarsiniexpression list [r.n1] es;
5682c2d813SSumera Priyadarsinistatement S;
5782c2d813SSumera Priyadarsini@@
5882c2d813SSumera Priyadarsini
5982c2d813SSumera Priyadarsini i(es,n,...) {
6082c2d813SSumera Priyadarsini   ...
6182c2d813SSumera Priyadarsini(
6282c2d813SSumera Priyadarsini   of_node_put(n);
6382c2d813SSumera Priyadarsini|
6482c2d813SSumera Priyadarsini   e = n
6582c2d813SSumera Priyadarsini|
6682c2d813SSumera Priyadarsini   return n;
6782c2d813SSumera Priyadarsini|
6882c2d813SSumera Priyadarsini   i1(...,n,...) S
6982c2d813SSumera Priyadarsini|
7082c2d813SSumera Priyadarsini- return of_node_get(n);
7182c2d813SSumera Priyadarsini+ return n;
7282c2d813SSumera Priyadarsini|
7382c2d813SSumera Priyadarsini+  of_node_put(n);
7482c2d813SSumera Priyadarsini?  return ...;
7582c2d813SSumera Priyadarsini)
7682c2d813SSumera Priyadarsini   ... when any
7782c2d813SSumera Priyadarsini }
7882c2d813SSumera Priyadarsini
7982c2d813SSumera Priyadarsini@ruletwo depends on patch && !context && !org && !report@
8082c2d813SSumera Priyadarsini
8182c2d813SSumera Priyadarsinilocal idexpression r.n;
8282c2d813SSumera Priyadarsiniiterator r.i,i1,i2;
8382c2d813SSumera Priyadarsiniexpression e,e1;
8482c2d813SSumera Priyadarsiniexpression list [r.n1] es;
8582c2d813SSumera Priyadarsinistatement S,S2;
8682c2d813SSumera Priyadarsini@@
8782c2d813SSumera Priyadarsini
8882c2d813SSumera Priyadarsini i(es,n,...) {
8982c2d813SSumera Priyadarsini   ...
9082c2d813SSumera Priyadarsini(
9182c2d813SSumera Priyadarsini   of_node_put(n);
9282c2d813SSumera Priyadarsini|
9382c2d813SSumera Priyadarsini   e = n
9482c2d813SSumera Priyadarsini|
9582c2d813SSumera Priyadarsini   i1(...,n,...) S
9682c2d813SSumera Priyadarsini|
9782c2d813SSumera Priyadarsini+  of_node_put(n);
9882c2d813SSumera Priyadarsini?  break;
9982c2d813SSumera Priyadarsini)
10082c2d813SSumera Priyadarsini   ... when any
10182c2d813SSumera Priyadarsini }
10282c2d813SSumera Priyadarsini... when != n
10382c2d813SSumera Priyadarsini    when strict
10482c2d813SSumera Priyadarsini    when forall
10582c2d813SSumera Priyadarsini(
10682c2d813SSumera Priyadarsini n = e1;
10782c2d813SSumera Priyadarsini|
10882c2d813SSumera Priyadarsini?i2(...,n,...) S2
10982c2d813SSumera Priyadarsini)
11082c2d813SSumera Priyadarsini
11182c2d813SSumera Priyadarsini@rulethree depends on patch && !context && !org && !report exists@
11282c2d813SSumera Priyadarsini
11382c2d813SSumera Priyadarsinilocal idexpression r.n;
11482c2d813SSumera Priyadarsiniiterator r.i,i1,i2;
11582c2d813SSumera Priyadarsiniexpression e,e1;
11682c2d813SSumera Priyadarsiniidentifier l;
11782c2d813SSumera Priyadarsiniexpression list [r.n1] es;
11882c2d813SSumera Priyadarsinistatement S,S2;
11982c2d813SSumera Priyadarsini@@
12082c2d813SSumera Priyadarsini
12182c2d813SSumera Priyadarsini i(es,n,...) {
12282c2d813SSumera Priyadarsini   ...
12382c2d813SSumera Priyadarsini(
12482c2d813SSumera Priyadarsini   of_node_put(n);
12582c2d813SSumera Priyadarsini|
12682c2d813SSumera Priyadarsini   e = n
12782c2d813SSumera Priyadarsini|
12882c2d813SSumera Priyadarsini   i1(...,n,...) S
12982c2d813SSumera Priyadarsini|
13082c2d813SSumera Priyadarsini+  of_node_put(n);
13182c2d813SSumera Priyadarsini?  goto l;
13282c2d813SSumera Priyadarsini)
13382c2d813SSumera Priyadarsini   ... when any
13482c2d813SSumera Priyadarsini }
13582c2d813SSumera Priyadarsini... when exists
13682c2d813SSumera Priyadarsinil: ... when != n
13782c2d813SSumera Priyadarsini       when strict
13882c2d813SSumera Priyadarsini       when forall
13982c2d813SSumera Priyadarsini(
14082c2d813SSumera Priyadarsini n = e1;
14182c2d813SSumera Priyadarsini|
14282c2d813SSumera Priyadarsini?i2(...,n,...) S2
14382c2d813SSumera Priyadarsini)
14482c2d813SSumera Priyadarsini
14582c2d813SSumera Priyadarsini// ----------------------------------------------------------------------------
14682c2d813SSumera Priyadarsini
14782c2d813SSumera Priyadarsini@ruleone_context depends on !patch && (context || org || report) exists@
14882c2d813SSumera Priyadarsinistatement S;
14982c2d813SSumera Priyadarsiniexpression e;
15082c2d813SSumera Priyadarsiniexpression list[r.n1] es;
15182c2d813SSumera Priyadarsiniiterator r.i, i1;
15282c2d813SSumera Priyadarsinilocal idexpression r.n;
15382c2d813SSumera Priyadarsiniposition j0, j1;
15482c2d813SSumera Priyadarsini@@
15582c2d813SSumera Priyadarsini
15682c2d813SSumera Priyadarsini i@j0(es,n,...) {
15782c2d813SSumera Priyadarsini   ...
15882c2d813SSumera Priyadarsini(
15982c2d813SSumera Priyadarsini   of_node_put(n);
16082c2d813SSumera Priyadarsini|
16182c2d813SSumera Priyadarsini   e = n
16282c2d813SSumera Priyadarsini|
16382c2d813SSumera Priyadarsini   return n;
16482c2d813SSumera Priyadarsini|
16582c2d813SSumera Priyadarsini   i1(...,n,...) S
16682c2d813SSumera Priyadarsini|
16782c2d813SSumera Priyadarsini  return @j1 ...;
16882c2d813SSumera Priyadarsini)
16982c2d813SSumera Priyadarsini   ... when any
17082c2d813SSumera Priyadarsini }
17182c2d813SSumera Priyadarsini
17282c2d813SSumera Priyadarsini@ruleone_disj depends on !patch && (context || org || report)@
17382c2d813SSumera Priyadarsiniexpression list[r.n1] es;
17482c2d813SSumera Priyadarsiniiterator r.i;
17582c2d813SSumera Priyadarsinilocal idexpression r.n;
17682c2d813SSumera Priyadarsiniposition ruleone_context.j0, ruleone_context.j1;
17782c2d813SSumera Priyadarsini@@
17882c2d813SSumera Priyadarsini
17982c2d813SSumera Priyadarsini*  i@j0(es,n,...) {
18082c2d813SSumera Priyadarsini   ...
18182c2d813SSumera Priyadarsini*return  @j1...;
18282c2d813SSumera Priyadarsini   ... when any
18382c2d813SSumera Priyadarsini }
18482c2d813SSumera Priyadarsini
18582c2d813SSumera Priyadarsini@ruletwo_context depends on !patch && (context || org || report) exists@
18682c2d813SSumera Priyadarsinistatement S, S2;
18782c2d813SSumera Priyadarsiniexpression e, e1;
18882c2d813SSumera Priyadarsiniexpression list[r.n1] es;
18982c2d813SSumera Priyadarsiniiterator r.i, i1, i2;
19082c2d813SSumera Priyadarsinilocal idexpression r.n;
19182c2d813SSumera Priyadarsiniposition j0, j2;
19282c2d813SSumera Priyadarsini@@
19382c2d813SSumera Priyadarsini
19482c2d813SSumera Priyadarsini i@j0(es,n,...) {
19582c2d813SSumera Priyadarsini   ...
19682c2d813SSumera Priyadarsini(
19782c2d813SSumera Priyadarsini   of_node_put(n);
19882c2d813SSumera Priyadarsini|
19982c2d813SSumera Priyadarsini   e = n
20082c2d813SSumera Priyadarsini|
20182c2d813SSumera Priyadarsini   i1(...,n,...) S
20282c2d813SSumera Priyadarsini|
20382c2d813SSumera Priyadarsini  break@j2;
20482c2d813SSumera Priyadarsini)
20582c2d813SSumera Priyadarsini   ... when any
20682c2d813SSumera Priyadarsini }
20782c2d813SSumera Priyadarsini... when != n
20882c2d813SSumera Priyadarsini    when strict
20982c2d813SSumera Priyadarsini    when forall
21082c2d813SSumera Priyadarsini(
21182c2d813SSumera Priyadarsini n = e1;
21282c2d813SSumera Priyadarsini|
21382c2d813SSumera Priyadarsini?i2(...,n,...) S2
21482c2d813SSumera Priyadarsini)
21582c2d813SSumera Priyadarsini
21682c2d813SSumera Priyadarsini@ruletwo_disj depends on !patch && (context || org || report)@
21782c2d813SSumera Priyadarsinistatement S2;
21882c2d813SSumera Priyadarsiniexpression e1;
21982c2d813SSumera Priyadarsiniexpression list[r.n1] es;
22082c2d813SSumera Priyadarsiniiterator r.i, i2;
22182c2d813SSumera Priyadarsinilocal idexpression r.n;
22282c2d813SSumera Priyadarsiniposition ruletwo_context.j0, ruletwo_context.j2;
22382c2d813SSumera Priyadarsini@@
22482c2d813SSumera Priyadarsini
22582c2d813SSumera Priyadarsini*  i@j0(es,n,...) {
22682c2d813SSumera Priyadarsini   ...
22782c2d813SSumera Priyadarsini*break @j2;
22882c2d813SSumera Priyadarsini   ... when any
22982c2d813SSumera Priyadarsini }
23082c2d813SSumera Priyadarsini... when != n
23182c2d813SSumera Priyadarsini    when strict
23282c2d813SSumera Priyadarsini    when forall
23382c2d813SSumera Priyadarsini(
23482c2d813SSumera Priyadarsini  n = e1;
23582c2d813SSumera Priyadarsini|
23682c2d813SSumera Priyadarsini?i2(...,n,...) S2
23782c2d813SSumera Priyadarsini)
23882c2d813SSumera Priyadarsini
23982c2d813SSumera Priyadarsini@rulethree_context depends on !patch && (context || org || report) exists@
24082c2d813SSumera Priyadarsiniidentifier l;
24182c2d813SSumera Priyadarsinistatement S,S2;
24282c2d813SSumera Priyadarsiniexpression e, e1;
24382c2d813SSumera Priyadarsiniexpression list[r.n1] es;
24482c2d813SSumera Priyadarsiniiterator r.i, i1, i2;
24582c2d813SSumera Priyadarsinilocal idexpression r.n;
24682c2d813SSumera Priyadarsiniposition j0, j3;
24782c2d813SSumera Priyadarsini@@
24882c2d813SSumera Priyadarsini
24982c2d813SSumera Priyadarsini i@j0(es,n,...) {
25082c2d813SSumera Priyadarsini   ...
25182c2d813SSumera Priyadarsini(
25282c2d813SSumera Priyadarsini   of_node_put(n);
25382c2d813SSumera Priyadarsini|
25482c2d813SSumera Priyadarsini   e = n
25582c2d813SSumera Priyadarsini|
25682c2d813SSumera Priyadarsini   i1(...,n,...) S
25782c2d813SSumera Priyadarsini|
25882c2d813SSumera Priyadarsini  goto l@j3;
25982c2d813SSumera Priyadarsini)
26082c2d813SSumera Priyadarsini  ... when any
26182c2d813SSumera Priyadarsini }
26282c2d813SSumera Priyadarsini... when exists
26382c2d813SSumera Priyadarsinil:
26482c2d813SSumera Priyadarsini... when != n
26582c2d813SSumera Priyadarsini    when strict
26682c2d813SSumera Priyadarsini    when forall
26782c2d813SSumera Priyadarsini(
26882c2d813SSumera Priyadarsini n = e1;
26982c2d813SSumera Priyadarsini|
27082c2d813SSumera Priyadarsini?i2(...,n,...) S2
27182c2d813SSumera Priyadarsini)
27282c2d813SSumera Priyadarsini
27382c2d813SSumera Priyadarsini@rulethree_disj depends on !patch && (context || org || report) exists@
27482c2d813SSumera Priyadarsiniidentifier l;
27582c2d813SSumera Priyadarsinistatement S2;
27682c2d813SSumera Priyadarsiniexpression e1;
27782c2d813SSumera Priyadarsiniexpression list[r.n1] es;
27882c2d813SSumera Priyadarsiniiterator r.i, i2;
27982c2d813SSumera Priyadarsinilocal idexpression r.n;
28082c2d813SSumera Priyadarsiniposition rulethree_context.j0, rulethree_context.j3;
28182c2d813SSumera Priyadarsini@@
28282c2d813SSumera Priyadarsini
28382c2d813SSumera Priyadarsini*  i@j0(es,n,...) {
28482c2d813SSumera Priyadarsini   ...
28582c2d813SSumera Priyadarsini*goto l@j3;
28682c2d813SSumera Priyadarsini   ... when any
28782c2d813SSumera Priyadarsini }
28882c2d813SSumera Priyadarsini... when exists
28982c2d813SSumera Priyadarsini l:
29082c2d813SSumera Priyadarsini ... when != n
29182c2d813SSumera Priyadarsini     when strict
29282c2d813SSumera Priyadarsini     when forall
29382c2d813SSumera Priyadarsini(
29482c2d813SSumera Priyadarsini n = e1;
29582c2d813SSumera Priyadarsini|
29682c2d813SSumera Priyadarsini?i2(...,n,...) S2
29782c2d813SSumera Priyadarsini)
29882c2d813SSumera Priyadarsini
29982c2d813SSumera Priyadarsini// ----------------------------------------------------------------------------
30082c2d813SSumera Priyadarsini
30182c2d813SSumera Priyadarsini@script:python ruleone_org depends on org@
30282c2d813SSumera Priyadarsinii << r.i;
30382c2d813SSumera Priyadarsinij0 << ruleone_context.j0;
30482c2d813SSumera Priyadarsinij1 << ruleone_context. j1;
30582c2d813SSumera Priyadarsini@@
30682c2d813SSumera Priyadarsini
30782c2d813SSumera Priyadarsinimsg = "WARNING: Function \"%s\" should have of_node_put() before return " % (i)
30882c2d813SSumera Priyadarsinicoccilib.org.print_safe_todo(j0[0], msg)
30982c2d813SSumera Priyadarsinicoccilib.org.print_link(j1[0], "")
31082c2d813SSumera Priyadarsini
31182c2d813SSumera Priyadarsini@script:python ruletwo_org depends on org@
31282c2d813SSumera Priyadarsinii << r.i;
31382c2d813SSumera Priyadarsinij0 << ruletwo_context.j0;
31482c2d813SSumera Priyadarsinij2 << ruletwo_context.j2;
31582c2d813SSumera Priyadarsini@@
31682c2d813SSumera Priyadarsini
31782c2d813SSumera Priyadarsinimsg = "WARNING: Function \"%s\" should have of_node_put() before break " % (i)
31882c2d813SSumera Priyadarsinicoccilib.org.print_safe_todo(j0[0], msg)
31982c2d813SSumera Priyadarsinicoccilib.org.print_link(j2[0], "")
32082c2d813SSumera Priyadarsini
32182c2d813SSumera Priyadarsini@script:python rulethree_org depends on org@
32282c2d813SSumera Priyadarsinii << r.i;
32382c2d813SSumera Priyadarsinij0 << rulethree_context.j0;
32482c2d813SSumera Priyadarsinij3 << rulethree_context.j3;
32582c2d813SSumera Priyadarsini@@
32682c2d813SSumera Priyadarsini
32782c2d813SSumera Priyadarsinimsg = "WARNING: Function \"%s\" should have of_node_put() before goto " % (i)
32882c2d813SSumera Priyadarsinicoccilib.org.print_safe_todo(j0[0], msg)
32982c2d813SSumera Priyadarsinicoccilib.org.print_link(j3[0], "")
33082c2d813SSumera Priyadarsini
33182c2d813SSumera Priyadarsini// ----------------------------------------------------------------------------
33282c2d813SSumera Priyadarsini
33382c2d813SSumera Priyadarsini@script:python ruleone_report depends on report@
33482c2d813SSumera Priyadarsinii << r.i;
33582c2d813SSumera Priyadarsinij0 << ruleone_context.j0;
33682c2d813SSumera Priyadarsinij1 << ruleone_context.j1;
33782c2d813SSumera Priyadarsini@@
33882c2d813SSumera Priyadarsini
33982c2d813SSumera Priyadarsinimsg = "WARNING: Function \"%s\" should have of_node_put() before return around line %s." % (i, j1[0].line)
34082c2d813SSumera Priyadarsinicoccilib.report.print_report(j0[0], msg)
34182c2d813SSumera Priyadarsini
34282c2d813SSumera Priyadarsini@script:python ruletwo_report depends on report@
34382c2d813SSumera Priyadarsinii << r.i;
34482c2d813SSumera Priyadarsinij0 << ruletwo_context.j0;
34582c2d813SSumera Priyadarsinij2 << ruletwo_context.j2;
34682c2d813SSumera Priyadarsini@@
34782c2d813SSumera Priyadarsini
34882c2d813SSumera Priyadarsinimsg = "WARNING: Function \"%s\" should have of_node_put() before break around line %s." % (i,j2[0].line)
34982c2d813SSumera Priyadarsinicoccilib.report.print_report(j0[0], msg)
35082c2d813SSumera Priyadarsini
35182c2d813SSumera Priyadarsini@script:python rulethree_report depends on report@
35282c2d813SSumera Priyadarsinii << r.i;
35382c2d813SSumera Priyadarsinij0 << rulethree_context.j0;
35482c2d813SSumera Priyadarsinij3 << rulethree_context.j3;
35582c2d813SSumera Priyadarsini@@
35682c2d813SSumera Priyadarsini
35782c2d813SSumera Priyadarsinimsg = "WARNING: Function \"%s\" should have of_node_put() before goto around lines %s." % (i,j3[0].line)
35882c2d813SSumera Priyadarsinicoccilib.report.print_report(j0[0], msg)
359