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