scripts/coccinelle: add some more coccinelle tests
[oweals/u-boot.git] / scripts / coccinelle / null / badzero.cocci
1 /// Compare pointer-typed values to NULL rather than 0
2 ///
3 //# This makes an effort to choose between !x and x == NULL.  !x is used
4 //# if it has previously been used with the function used to initialize x.
5 //# This relies on type information.  More type information can be obtained
6 //# using the option -all_includes and the option -I to specify an
7 //# include path.
8 //
9 // Confidence: High
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 // Requires: 1.0.0
14 // Options:
15 //
16 // SPDX-License-Identifier:     GPL-2.0
17 //
18
19 virtual patch
20 virtual context
21 virtual org
22 virtual report
23
24 @initialize:ocaml@
25 @@
26 let negtable = Hashtbl.create 101
27
28 @depends on patch@
29 expression *E;
30 identifier f;
31 @@
32
33 (
34   (E = f(...)) ==
35 - 0
36 + NULL
37 |
38   (E = f(...)) !=
39 - 0
40 + NULL
41 |
42 - 0
43 + NULL
44   == (E = f(...))
45 |
46 - 0
47 + NULL
48   != (E = f(...))
49 )
50
51
52 @t1 depends on !patch@
53 expression *E;
54 identifier f;
55 position p;
56 @@
57
58 (
59   (E = f(...)) ==
60 * 0@p
61 |
62   (E = f(...)) !=
63 * 0@p
64 |
65 * 0@p
66   == (E = f(...))
67 |
68 * 0@p
69   != (E = f(...))
70 )
71
72 @script:python depends on org@
73 p << t1.p;
74 @@
75
76 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
77
78 @script:python depends on report@
79 p << t1.p;
80 @@
81
82 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
83
84 // Tests of returned values
85
86 @s@
87 identifier f;
88 expression E,E1;
89 @@
90
91  E = f(...)
92  ... when != E = E1
93  !E
94
95 @script:ocaml depends on s@
96 f << s.f;
97 @@
98
99 try let _ = Hashtbl.find negtable f in ()
100 with Not_found -> Hashtbl.add negtable f ()
101
102 @ r disable is_zero,isnt_zero exists @
103 expression *E;
104 identifier f;
105 @@
106
107 E = f(...)
108 ...
109 (E == 0
110 |E != 0
111 |0 == E
112 |0 != E
113 )
114
115 @script:ocaml@
116 f << r.f;
117 @@
118
119 try let _ = Hashtbl.find negtable f in ()
120 with Not_found -> include_match false
121
122 // This rule may lead to inconsistent path problems, if E is defined in two
123 // places
124 @ depends on patch disable is_zero,isnt_zero @
125 expression *E;
126 expression E1;
127 identifier r.f;
128 @@
129
130 E = f(...)
131 <...
132 (
133 - E == 0
134 + !E
135 |
136 - E != 0
137 + E
138 |
139 - 0 == E
140 + !E
141 |
142 - 0 != E
143 + E
144 )
145 ...>
146 ?E = E1
147
148 @t2 depends on !patch disable is_zero,isnt_zero @
149 expression *E;
150 expression E1;
151 identifier r.f;
152 position p1;
153 position p2;
154 @@
155
156 E = f(...)
157 <...
158 (
159 * E == 0@p1
160 |
161 * E != 0@p2
162 |
163 * 0@p1 == E
164 |
165 * 0@p1 != E
166 )
167 ...>
168 ?E = E1
169
170 @script:python depends on org@
171 p << t2.p1;
172 @@
173
174 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0, suggest !E")
175
176 @script:python depends on org@
177 p << t2.p2;
178 @@
179
180 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
181
182 @script:python depends on report@
183 p << t2.p1;
184 @@
185
186 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0, suggest !E")
187
188 @script:python depends on report@
189 p << t2.p2;
190 @@
191
192 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")
193
194 @ depends on patch disable is_zero,isnt_zero @
195 expression *E;
196 @@
197
198 (
199   E ==
200 - 0
201 + NULL
202 |
203   E !=
204 - 0
205 + NULL
206 |
207 - 0
208 + NULL
209   == E
210 |
211 - 0
212 + NULL
213   != E
214 )
215
216 @ t3 depends on !patch disable is_zero,isnt_zero @
217 expression *E;
218 position p;
219 @@
220
221 (
222 * E == 0@p
223 |
224 * E != 0@p
225 |
226 * 0@p == E
227 |
228 * 0@p != E
229 )
230
231 @script:python depends on org@
232 p << t3.p;
233 @@
234
235 coccilib.org.print_todo(p[0], "WARNING comparing pointer to 0")
236
237 @script:python depends on report@
238 p << t3.p;
239 @@
240
241 coccilib.report.print_report(p[0], "WARNING comparing pointer to 0")