1/// Many iterators have the property that the first argument is always bound
2/// to a real list element, never NULL.  False positives arise for some
3/// iterators that do not have this property, or in cases when the loop
4/// cursor is reassigned.  The latter should only happen when the matched
5/// code is on the way to a loop exit (break, goto, or return).
6///
7// Confidence: Moderate
8// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
9// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
10// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
11// URL: http://coccinelle.lip6.fr/
12// Comments:
13// Options: -no_includes -include_headers
14
15virtual patch
16
17@@
18iterator I;
19expression x,E,E1,E2;
20statement S,S1,S2;
21@@
22
23I(x,...) { <...
24(
25- if (x == NULL && ...) S
26|
27- if (x != NULL || ...)
28  S
29|
30- (x == NULL) ||
31  E
32|
33- (x != NULL) &&
34  E
35|
36- (x == NULL && ...) ? E1 :
37  E2
38|
39- (x != NULL || ...) ?
40  E1
41- : E2
42|
43- if (x == NULL && ...) S1 else
44  S2
45|
46- if (x != NULL || ...)
47  S1
48- else S2
49|
50+ BAD(
51  x == NULL
52+ )
53|
54+ BAD(
55  x != NULL
56+ )
57)
58  ...> }