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)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.