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