1 // SPDX-License-Identifier: GPL-2.0-only 2 /// list_for_each_entry uses its first argument to get from one element of 3 /// the list to the next, so it is usually not a good idea to reassign it. 4 /// The first rule finds such a reassignment and the second rule checks 5 /// that there is a path from the reassignment back to the top of the loop. 6 /// 7 // Confidence: High 8 // Copyright: (C) 2010 Nicolas Palix, DIKU. 9 // Copyright: (C) 2010 Julia Lawall, DIKU. 10 // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. 11 // URL: https://coccinelle.gitlabpages.inria.fr/website 12 // Comments: 13 // Options: --no-includes --include-headers 14 15 virtual context 16 virtual org 17 virtual report 18 19 @r exists@ 20 iterator name list_for_each_entry; 21 expression x,E; 22 position p1,p2; 23 @@ 24 25 list_for_each_entry@p1(x,...) { <... x =@p2 E ...> } 26 27 @depends on context && !org && !report@ 28 expression x,E; 29 position r.p1,r.p2; 30 statement S; 31 @@ 32 33 *x =@p2 E 34 ... 35 list_for_each_entry@p1(x,...) S 36 37 // ------------------------------------------------------------------------ 38 39 @back depends on (org || report) && !context exists@ 40 expression x,E; 41 position r.p1,r.p2; 42 statement S; 43 @@ 44 45 x =@p2 E 46 ... 47 list_for_each_entry@p1(x,...) S 48 49 @script:python depends on back && org@ 50 p1 << r.p1; 51 p2 << r.p2; 52 @@ 53 54 cocci.print_main("iterator",p1) 55 cocci.print_secs("update",p2) 56 57 @script:python depends on back && report@ 58 p1 << r.p1; 59 p2 << r.p2; 60 @@ 61 62 msg = "iterator with update on line %s" % (p2[0].line) 63 coccilib.report.print_report(p1[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.