xref: /openbmc/u-boot/scripts/coccinelle/iterators/use_after_iter.cocci (revision 06feb5d0bf9953c6918d0e35feef64521c5236c4)
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