b3d0c3c230c16d3a30f4803b08ac9f2dfb4047ce
[releases.git] / zalloc-simple.cocci
1 // SPDX-License-Identifier: GPL-2.0-only
2 ///
3 /// Use zeroing allocator rather than allocator followed by memset with 0
4 ///
5 /// This considers some simple cases that are common and easy to validate
6 /// Note in particular that there are no ...s in the rule, so all of the
7 /// matched code has to be contiguous
8 ///
9 // Confidence: High
10 // Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.
11 // Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.
12 // Copyright: (C) 2017 Himanshu Jha
13 // URL: http://coccinelle.lip6.fr/rules/kzalloc.html
14 // Options: --no-includes --include-headers
15 //
16 // Keywords: kmalloc, kzalloc
17 // Version min: < 2.6.12 kmalloc
18 // Version min:   2.6.14 kzalloc
19 //
20
21 virtual context
22 virtual patch
23 virtual org
24 virtual report
25
26 //----------------------------------------------------------
27 //  For context mode
28 //----------------------------------------------------------
29
30 @depends on context@
31 type T, T2;
32 expression x;
33 expression E1;
34 statement S;
35 @@
36
37 * x = (T)\(kmalloc(E1, ...)\|vmalloc(E1)\|dma_alloc_coherent(...,E1,...)\|
38   kmalloc_node(E1, ...)\|kmem_cache_alloc(...)\|kmem_alloc(E1, ...)\|
39   devm_kmalloc(...,E1,...)\|kvmalloc(E1, ...)\|kvmalloc_node(E1,...)\);
40   if ((x==NULL) || ...) S
41 * memset((T2)x,0,E1);
42
43 //----------------------------------------------------------
44 //  For patch mode
45 //----------------------------------------------------------
46
47 @depends on patch@
48 type T, T2;
49 expression x;
50 expression E1,E2,E3,E4;
51 statement S;
52 @@
53
54 (
55 - x = kmalloc(E1,E2);
56 + x = kzalloc(E1,E2);
57 |
58 - x = (T *)kmalloc(E1,E2);
59 + x = kzalloc(E1,E2);
60 |
61 - x = (T)kmalloc(E1,E2);
62 + x = (T)kzalloc(E1,E2);
63 |
64 - x = vmalloc(E1);
65 + x = vzalloc(E1);
66 |
67 - x = (T *)vmalloc(E1);
68 + x = vzalloc(E1);
69 |
70 - x = (T)vmalloc(E1);
71 + x = (T)vzalloc(E1);
72 |
73 - x = kmalloc_node(E1,E2,E3);
74 + x = kzalloc_node(E1,E2,E3);
75 |
76 - x = (T *)kmalloc_node(E1,E2,E3);
77 + x = kzalloc_node(E1,E2,E3);
78 |
79 - x = (T)kmalloc_node(E1,E2,E3);
80 + x = (T)kzalloc_node(E1,E2,E3);
81 |
82 - x = kmem_cache_alloc(E3,E4);
83 + x = kmem_cache_zalloc(E3,E4);
84 |
85 - x = (T *)kmem_cache_alloc(E3,E4);
86 + x = kmem_cache_zalloc(E3,E4);
87 |
88 - x = (T)kmem_cache_alloc(E3,E4);
89 + x = (T)kmem_cache_zalloc(E3,E4);
90 |
91 - x = kmem_alloc(E1,E2);
92 + x = kmem_zalloc(E1,E2);
93 |
94 - x = (T *)kmem_alloc(E1,E2);
95 + x = kmem_zalloc(E1,E2);
96 |
97 - x = (T)kmem_alloc(E1,E2);
98 + x = (T)kmem_zalloc(E1,E2);
99 |
100 - x = devm_kmalloc(E2,E1,E3);
101 + x = devm_kzalloc(E2,E1,E3);
102 |
103 - x = (T *)devm_kmalloc(E2,E1,E3);
104 + x = devm_kzalloc(E2,E1,E3);
105 |
106 - x = (T)devm_kmalloc(E2,E1,E3);
107 + x = (T)devm_kzalloc(E2,E1,E3);
108 |
109 - x = kvmalloc(E1,E2);
110 + x = kvzalloc(E1,E2);
111 |
112 - x = (T *)kvmalloc(E1,E2);
113 + x = kvzalloc(E1,E2);
114 |
115 - x = (T)kvmalloc(E1,E2);
116 + x = (T)kvzalloc(E1,E2);
117 |
118 - x = kvmalloc_node(E1,E2,E3);
119 + x = kvzalloc_node(E1,E2,E3);
120 |
121 - x = (T *)kvmalloc_node(E1,E2,E3);
122 + x = kvzalloc_node(E1,E2,E3);
123 |
124 - x = (T)kvmalloc_node(E1,E2,E3);
125 + x = (T)kvzalloc_node(E1,E2,E3);
126 )
127   if ((x==NULL) || ...) S
128 - memset((T2)x,0,E1);
129
130 @depends on patch@
131 type T, T2;
132 expression x;
133 expression E1,E2,E3,E4;
134 statement S;
135 @@
136   x = (T)dma_alloc_coherent(E1, E2, E3, E4);
137   if ((x==NULL) || ...) S
138 - memset((T2)x, 0, E2);
139
140 //----------------------------------------------------------
141 //  For org mode
142 //----------------------------------------------------------
143
144 @r depends on org || report@
145 type T, T2;
146 expression x;
147 expression E1,E2;
148 statement S;
149 position p;
150 @@
151
152  x = (T)kmalloc@p(E1,E2);
153  if ((x==NULL) || ...) S
154  memset((T2)x,0,E1);
155
156 @script:python depends on org@
157 p << r.p;
158 x << r.x;
159 @@
160
161 msg="%s" % (x)
162 msg_safe=msg.replace("[","@(").replace("]",")")
163 coccilib.org.print_todo(p[0], msg_safe)
164
165 @script:python depends on report@
166 p << r.p;
167 x << r.x;
168 @@
169
170 msg="WARNING: kzalloc should be used for %s, instead of kmalloc/memset" % (x)
171 coccilib.report.print_report(p[0], msg)
172
173 //-----------------------------------------------------------------
174 @r1 depends on org || report@
175 type T, T2;
176 expression x;
177 expression E1;
178 statement S;
179 position p;
180 @@
181
182  x = (T)vmalloc@p(E1);
183  if ((x==NULL) || ...) S
184  memset((T2)x,0,E1);
185
186 @script:python depends on org@
187 p << r1.p;
188 x << r1.x;
189 @@
190
191 msg="%s" % (x)
192 msg_safe=msg.replace("[","@(").replace("]",")")
193 coccilib.org.print_todo(p[0], msg_safe)
194
195 @script:python depends on report@
196 p << r1.p;
197 x << r1.x;
198 @@
199
200 msg="WARNING: vzalloc should be used for %s, instead of vmalloc/memset" % (x)
201 coccilib.report.print_report(p[0], msg)
202
203 //-----------------------------------------------------------------
204 @r2 depends on org || report@
205 type T, T2;
206 expression x;
207 expression E1,E2,E3,E4;
208 statement S;
209 position p;
210 @@
211
212  x = (T)dma_alloc_coherent@p(E1,E2,E3,E4);
213  if ((x==NULL) || ...) S
214  memset((T2)x,0,E2);
215
216 @script:python depends on org@
217 p << r2.p;
218 x << r2.x;
219 @@
220
221 msg="%s" % (x)
222 msg_safe=msg.replace("[","@(").replace("]",")")
223 coccilib.org.print_todo(p[0], msg_safe)
224
225 @script:python depends on report@
226 p << r2.p;
227 x << r2.x;
228 @@
229
230 msg="WARNING: dma_alloc_coherent used in %s already zeroes out memory, so memset is not needed" % (x)
231 coccilib.report.print_report(p[0], msg)
232
233 //-----------------------------------------------------------------
234 @r3 depends on org || report@
235 type T, T2;
236 expression x;
237 expression E1,E2,E3;
238 statement S;
239 position p;
240 @@
241
242  x = (T)kmalloc_node@p(E1,E2,E3);
243  if ((x==NULL) || ...) S
244  memset((T2)x,0,E1);
245
246 @script:python depends on org@
247 p << r3.p;
248 x << r3.x;
249 @@
250
251 msg="%s" % (x)
252 msg_safe=msg.replace("[","@(").replace("]",")")
253 coccilib.org.print_todo(p[0], msg_safe)
254
255 @script:python depends on report@
256 p << r3.p;
257 x << r3.x;
258 @@
259
260 msg="WARNING: kzalloc_node should be used for %s, instead of kmalloc_node/memset" % (x)
261 coccilib.report.print_report(p[0], msg)
262
263 //-----------------------------------------------------------------
264 @r4 depends on org || report@
265 type T, T2;
266 expression x;
267 expression E1,E2,E3;
268 statement S;
269 position p;
270 @@
271
272  x = (T)kmem_cache_alloc@p(E2,E3);
273  if ((x==NULL) || ...) S
274  memset((T2)x,0,E1);
275
276 @script:python depends on org@
277 p << r4.p;
278 x << r4.x;
279 @@
280
281 msg="%s" % (x)
282 msg_safe=msg.replace("[","@(").replace("]",")")
283 coccilib.org.print_todo(p[0], msg_safe)
284
285 @script:python depends on report@
286 p << r4.p;
287 x << r4.x;
288 @@
289
290 msg="WARNING: kmem_cache_zalloc should be used for %s, instead of kmem_cache_alloc/memset" % (x)
291 coccilib.report.print_report(p[0], msg)
292
293 //-----------------------------------------------------------------
294 @r5 depends on org || report@
295 type T, T2;
296 expression x;
297 expression E1,E2;
298 statement S;
299 position p;
300 @@
301
302  x = (T)kmem_alloc@p(E1,E2);
303  if ((x==NULL) || ...) S
304  memset((T2)x,0,E1);
305
306 @script:python depends on org@
307 p << r5.p;
308 x << r5.x;
309 @@
310
311 msg="%s" % (x)
312 msg_safe=msg.replace("[","@(").replace("]",")")
313 coccilib.org.print_todo(p[0], msg_safe)
314
315 @script:python depends on report@
316 p << r5.p;
317 x << r5.x;
318 @@
319
320 msg="WARNING: kmem_zalloc should be used for %s, instead of kmem_alloc/memset" % (x)
321 coccilib.report.print_report(p[0], msg)
322
323 //-----------------------------------------------------------------
324 @r6 depends on org || report@
325 type T, T2;
326 expression x;
327 expression E1,E2,E3;
328 statement S;
329 position p;
330 @@
331
332  x = (T)devm_kmalloc@p(E2,E1,E3);
333  if ((x==NULL) || ...) S
334  memset((T2)x,0,E1);
335
336 @script:python depends on org@
337 p << r6.p;
338 x << r6.x;
339 @@
340
341 msg="%s" % (x)
342 msg_safe=msg.replace("[","@(").replace("]",")")
343 coccilib.org.print_todo(p[0], msg_safe)
344
345 @script:python depends on report@
346 p << r6.p;
347 x << r6.x;
348 @@
349
350 msg="WARNING: devm_kzalloc should be used for %s, instead of devm_kmalloc/memset" % (x)
351 coccilib.report.print_report(p[0], msg)
352
353 //-----------------------------------------------------------------
354 @r7 depends on org || report@
355 type T, T2;
356 expression x;
357 expression E1,E2;
358 statement S;
359 position p;
360 @@
361
362  x = (T)kvmalloc@p(E1,E2);
363  if ((x==NULL) || ...) S
364  memset((T2)x,0,E1);
365
366 @script:python depends on org@
367 p << r7.p;
368 x << r7.x;
369 @@
370
371 msg="%s" % (x)
372 msg_safe=msg.replace("[","@(").replace("]",")")
373 coccilib.org.print_todo(p[0], msg_safe)
374
375 @script:python depends on report@
376 p << r7.p;
377 x << r7.x;
378 @@
379
380 msg="WARNING: kvzalloc should be used for %s, instead of kvmalloc/memset" % (x)
381 coccilib.report.print_report(p[0], msg)
382
383 //-----------------------------------------------------------------
384 @r9 depends on org || report@
385 type T, T2;
386 expression x;
387 expression E1,E2,E3;
388 statement S;
389 position p;
390 @@
391
392  x = (T)kvmalloc_node@p(E1,E2,E3);
393  if ((x==NULL) || ...) S
394  memset((T2)x,0,E1);
395
396 @script:python depends on org@
397 p << r9.p;
398 x << r9.x;
399 @@
400
401 msg="%s" % (x)
402 msg_safe=msg.replace("[","@(").replace("]",")")
403 coccilib.org.print_todo(p[0], msg_safe)
404
405 @script:python depends on report@
406 p << r9.p;
407 x << r9.x;
408 @@
409
410 msg="WARNING: kvzalloc_node should be used for %s, instead of kvmalloc_node/memset" % (x)
411 coccilib.report.print_report(p[0], msg)