1*06feb5d0SHeinrich Schuchardt/// If list_for_each_entry, etc complete a traversal of the list, the iterator 2*06feb5d0SHeinrich Schuchardt/// variable ends up pointing to an address at an offset from the list head, 3*06feb5d0SHeinrich Schuchardt/// and not a meaningful structure. Thus this value should not be used after 4*06feb5d0SHeinrich Schuchardt/// the end of the iterator. 5*06feb5d0SHeinrich Schuchardt//#False positives arise when there is a goto in the iterator and the 6*06feb5d0SHeinrich Schuchardt//#reported reference is at the label of this goto. Some flag tests 7*06feb5d0SHeinrich Schuchardt//#may also cause a report to be a false positive. 8*06feb5d0SHeinrich Schuchardt/// 9*06feb5d0SHeinrich Schuchardt// Confidence: Moderate 10*06feb5d0SHeinrich Schuchardt// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 11*06feb5d0SHeinrich Schuchardt// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6. GPLv2. 12*06feb5d0SHeinrich Schuchardt// URL: http://coccinelle.lip6.fr/ 13*06feb5d0SHeinrich Schuchardt// Comments: 14*06feb5d0SHeinrich Schuchardt// Options: --no-includes --include-headers 15*06feb5d0SHeinrich Schuchardt 16*06feb5d0SHeinrich Schuchardtvirtual context 17*06feb5d0SHeinrich Schuchardtvirtual org 18*06feb5d0SHeinrich Schuchardtvirtual report 19*06feb5d0SHeinrich Schuchardt 20*06feb5d0SHeinrich Schuchardt@r exists@ 21*06feb5d0SHeinrich Schuchardtidentifier c,member; 22*06feb5d0SHeinrich Schuchardtexpression E,x; 23*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry; 24*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_reverse; 25*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_continue; 26*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_continue_reverse; 27*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_from; 28*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_safe; 29*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_safe_continue; 30*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_safe_from; 31*06feb5d0SHeinrich Schuchardtiterator name list_for_each_entry_safe_reverse; 32*06feb5d0SHeinrich Schuchardtiterator name hlist_for_each_entry; 33*06feb5d0SHeinrich Schuchardtiterator name hlist_for_each_entry_continue; 34*06feb5d0SHeinrich Schuchardtiterator name hlist_for_each_entry_from; 35*06feb5d0SHeinrich Schuchardtiterator name hlist_for_each_entry_safe; 36*06feb5d0SHeinrich Schuchardtstatement S; 37*06feb5d0SHeinrich Schuchardtposition p1,p2; 38*06feb5d0SHeinrich Schuchardt@@ 39*06feb5d0SHeinrich Schuchardt 40*06feb5d0SHeinrich Schuchardt( 41*06feb5d0SHeinrich Schuchardtlist_for_each_entry@p1(c,...,member) { ... when != break; 42*06feb5d0SHeinrich Schuchardt when forall 43*06feb5d0SHeinrich Schuchardt when strict 44*06feb5d0SHeinrich Schuchardt} 45*06feb5d0SHeinrich Schuchardt| 46*06feb5d0SHeinrich Schuchardtlist_for_each_entry_reverse@p1(c,...,member) { ... when != break; 47*06feb5d0SHeinrich Schuchardt when forall 48*06feb5d0SHeinrich Schuchardt when strict 49*06feb5d0SHeinrich Schuchardt} 50*06feb5d0SHeinrich Schuchardt| 51*06feb5d0SHeinrich Schuchardtlist_for_each_entry_continue@p1(c,...,member) { ... when != break; 52*06feb5d0SHeinrich Schuchardt when forall 53*06feb5d0SHeinrich Schuchardt when strict 54*06feb5d0SHeinrich Schuchardt} 55*06feb5d0SHeinrich Schuchardt| 56*06feb5d0SHeinrich Schuchardtlist_for_each_entry_continue_reverse@p1(c,...,member) { ... when != break; 57*06feb5d0SHeinrich Schuchardt when forall 58*06feb5d0SHeinrich Schuchardt when strict 59*06feb5d0SHeinrich Schuchardt} 60*06feb5d0SHeinrich Schuchardt| 61*06feb5d0SHeinrich Schuchardtlist_for_each_entry_from@p1(c,...,member) { ... when != break; 62*06feb5d0SHeinrich Schuchardt when forall 63*06feb5d0SHeinrich Schuchardt when strict 64*06feb5d0SHeinrich Schuchardt} 65*06feb5d0SHeinrich Schuchardt| 66*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe@p1(c,...,member) { ... when != break; 67*06feb5d0SHeinrich Schuchardt when forall 68*06feb5d0SHeinrich Schuchardt when strict 69*06feb5d0SHeinrich Schuchardt} 70*06feb5d0SHeinrich Schuchardt| 71*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_continue@p1(c,...,member) { ... when != break; 72*06feb5d0SHeinrich Schuchardt when forall 73*06feb5d0SHeinrich Schuchardt when strict 74*06feb5d0SHeinrich Schuchardt} 75*06feb5d0SHeinrich Schuchardt| 76*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_from@p1(c,...,member) { ... when != break; 77*06feb5d0SHeinrich Schuchardt when forall 78*06feb5d0SHeinrich Schuchardt when strict 79*06feb5d0SHeinrich Schuchardt} 80*06feb5d0SHeinrich Schuchardt| 81*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_reverse@p1(c,...,member) { ... when != break; 82*06feb5d0SHeinrich Schuchardt when forall 83*06feb5d0SHeinrich Schuchardt when strict 84*06feb5d0SHeinrich Schuchardt} 85*06feb5d0SHeinrich Schuchardt) 86*06feb5d0SHeinrich Schuchardt... 87*06feb5d0SHeinrich Schuchardt( 88*06feb5d0SHeinrich Schuchardtlist_for_each_entry(c,...) S 89*06feb5d0SHeinrich Schuchardt| 90*06feb5d0SHeinrich Schuchardtlist_for_each_entry_reverse(c,...) S 91*06feb5d0SHeinrich Schuchardt| 92*06feb5d0SHeinrich Schuchardtlist_for_each_entry_continue(c,...) S 93*06feb5d0SHeinrich Schuchardt| 94*06feb5d0SHeinrich Schuchardtlist_for_each_entry_continue_reverse(c,...) S 95*06feb5d0SHeinrich Schuchardt| 96*06feb5d0SHeinrich Schuchardtlist_for_each_entry_from(c,...) S 97*06feb5d0SHeinrich Schuchardt| 98*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe(c,...) S 99*06feb5d0SHeinrich Schuchardt| 100*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe(x,c,...) S 101*06feb5d0SHeinrich Schuchardt| 102*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_continue(c,...) S 103*06feb5d0SHeinrich Schuchardt| 104*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_continue(x,c,...) S 105*06feb5d0SHeinrich Schuchardt| 106*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_from(c,...) S 107*06feb5d0SHeinrich Schuchardt| 108*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_from(x,c,...) S 109*06feb5d0SHeinrich Schuchardt| 110*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_reverse(c,...) S 111*06feb5d0SHeinrich Schuchardt| 112*06feb5d0SHeinrich Schuchardtlist_for_each_entry_safe_reverse(x,c,...) S 113*06feb5d0SHeinrich Schuchardt| 114*06feb5d0SHeinrich Schuchardthlist_for_each_entry(c,...) S 115*06feb5d0SHeinrich Schuchardt| 116*06feb5d0SHeinrich Schuchardthlist_for_each_entry_continue(c,...) S 117*06feb5d0SHeinrich Schuchardt| 118*06feb5d0SHeinrich Schuchardthlist_for_each_entry_from(c,...) S 119*06feb5d0SHeinrich Schuchardt| 120*06feb5d0SHeinrich Schuchardthlist_for_each_entry_safe(c,...) S 121*06feb5d0SHeinrich Schuchardt| 122*06feb5d0SHeinrich Schuchardtlist_remove_head(x,c,...) 123*06feb5d0SHeinrich Schuchardt| 124*06feb5d0SHeinrich Schuchardtsizeof(<+...c...+>) 125*06feb5d0SHeinrich Schuchardt| 126*06feb5d0SHeinrich Schuchardt &c->member 127*06feb5d0SHeinrich Schuchardt| 128*06feb5d0SHeinrich Schuchardtc = E 129*06feb5d0SHeinrich Schuchardt| 130*06feb5d0SHeinrich Schuchardt*c@p2 131*06feb5d0SHeinrich Schuchardt) 132*06feb5d0SHeinrich Schuchardt 133*06feb5d0SHeinrich Schuchardt@script:python depends on org@ 134*06feb5d0SHeinrich Schuchardtp1 << r.p1; 135*06feb5d0SHeinrich Schuchardtp2 << r.p2; 136*06feb5d0SHeinrich Schuchardt@@ 137*06feb5d0SHeinrich Schuchardt 138*06feb5d0SHeinrich Schuchardtcocci.print_main("invalid iterator index reference",p2) 139*06feb5d0SHeinrich Schuchardtcocci.print_secs("iterator",p1) 140*06feb5d0SHeinrich Schuchardt 141*06feb5d0SHeinrich Schuchardt@script:python depends on report@ 142*06feb5d0SHeinrich Schuchardtp1 << r.p1; 143*06feb5d0SHeinrich Schuchardtp2 << r.p2; 144*06feb5d0SHeinrich Schuchardt@@ 145*06feb5d0SHeinrich Schuchardt 146*06feb5d0SHeinrich Schuchardtmsg = "ERROR: invalid reference to the index variable of the iterator on line %s" % (p1[0].line) 147*06feb5d0SHeinrich Schuchardtcoccilib.report.print_report(p2[0], msg) 148