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 15virtual context 16virtual org 17virtual report 18 19@r exists@ 20iterator name list_for_each_entry; 21expression x,E; 22position p1,p2; 23@@ 24 25list_for_each_entry@p1(x,...) { <... x =@p2 E ...> } 26 27@depends on context && !org && !report@ 28expression x,E; 29position r.p1,r.p2; 30statement S; 31@@ 32 33*x =@p2 E 34... 35list_for_each_entry@p1(x,...) S 36 37// ------------------------------------------------------------------------ 38 39@back depends on (org || report) && !context exists@ 40expression x,E; 41position r.p1,r.p2; 42statement S; 43@@ 44 45x =@p2 E 46... 47list_for_each_entry@p1(x,...) S 48 49@script:python depends on back && org@ 50p1 << r.p1; 51p2 << r.p2; 52@@ 53 54cocci.print_main("iterator",p1) 55cocci.print_secs("update",p2) 56 57@script:python depends on back && report@ 58p1 << r.p1; 59p2 << r.p2; 60@@ 61 62msg = "iterator with update on line %s" % (p2[0].line) 63coccilib.report.print_report(p1[0],msg) 64