xref: /linux/scripts/coccinelle/api/alloc/alloc_cast.cocci (revision f83b8a58695cbf419beaa3f63b9d3e264792d8ea)
1// SPDX-License-Identifier: GPL-2.0-only
2/// Remove casting the values returned by memory allocation functions
3/// like kmalloc, kzalloc, kmem_cache_alloc, kmem_cache_zalloc etc.
4///
5//# This makes an effort to find cases of casting of values returned by
6//# kmalloc, kzalloc, kcalloc, kmem_cache_alloc, kmem_cache_zalloc,
7//# kmem_cache_alloc_node, kmalloc_node and kzalloc_node and removes
8//# the casting as it is not required. The result in the patch case may
9//# need some reformatting.
10//
11// Confidence: High
12// Copyright: (C) 2014 Himangi Saraogi
13// Copyright: (C) 2017 Himanshu Jha
14// Comments:
15// Options: --no-includes --include-headers
16//
17
18virtual context
19virtual patch
20virtual org
21virtual report
22
23@m1@
24identifier i;
25expression e;
26type T;
27position p1;
28@@
29
30#define i (T@p1 *)e
31
32@m2@
33identifier i;
34expression e;
35type T;
36position p2;
37@@
38
39#define i(...) (T@p2 *)e
40
41@initialize:python@
42@@
43import re
44pattern = '__'
45m = re.compile(pattern)
46
47@r1 depends on context || patch@
48type T;
49position p != {m1.p1,m2.p2};
50@@
51
52  (T@p *)
53  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
54   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
55   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
56   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|
57   vmalloc_node\|vzalloc_node\)(...)
58
59//----------------------------------------------------------
60//  For context mode
61//----------------------------------------------------------
62
63@script:python depends on context@
64t << r1.T;
65@@
66
67if m.search(t) != None:
68        cocci.include_match(False)
69
70@depends on context && r1@
71type r1.T;
72@@
73
74* (T *)
75  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
76   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
77   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
78   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|
79   vmalloc_node\|vzalloc_node\)(...)
80
81//----------------------------------------------------------
82//  For patch mode
83//----------------------------------------------------------
84
85@script:python depends on patch@
86t << r1.T;
87@@
88
89if m.search(t) != None:
90        cocci.include_match(False)
91
92@depends on patch && r1@
93type r1.T;
94@@
95
96- (T *)
97  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
98   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
99   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
100   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|
101   vmalloc_node\|vzalloc_node\)(...)
102
103//----------------------------------------------------------
104//  For org and report mode
105//----------------------------------------------------------
106
107@r2 depends on org || report@
108type T;
109position p != {m1.p1,m2.p2};
110@@
111
112 (T@p *)
113  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
114   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
115   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
116   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|
117   vmalloc_node\|vzalloc_node\)(...)
118
119@script:python depends on org@
120p << r2.p;
121t << r2.T;
122@@
123
124if m.search(t) != None:
125	cocci.include_match(False)
126else:
127	coccilib.org.print_safe_todo(p[0], t)
128
129@script:python depends on report@
130p << r2.p;
131t << r2.T;
132@@
133
134if m.search(t) != None:
135	cocci.include_match(False)
136else:
137	msg="WARNING: casting value returned by memory allocation function to (%s *) is useless." % (t)
138	coccilib.report.print_report(p[0], msg)
139