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