xref: /linux/scripts/coccinelle/api/alloc/alloc_cast.cocci (revision a53cbd149844cbde80f6adfc7f4233b8f230f664)
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\|pci_alloc_consistent\|
57   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
58   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
59
60//----------------------------------------------------------
61//  For context mode
62//----------------------------------------------------------
63
64@script:python depends on context@
65t << r1.T;
66@@
67
68if m.search(t) != None:
69        cocci.include_match(False)
70
71@depends on context && r1@
72type r1.T;
73@@
74
75* (T *)
76  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
77   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
78   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
79   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
80   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
81   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
82
83//----------------------------------------------------------
84//  For patch mode
85//----------------------------------------------------------
86
87@script:python depends on patch@
88t << r1.T;
89@@
90
91if m.search(t) != None:
92        cocci.include_match(False)
93
94@depends on patch && r1@
95type r1.T;
96@@
97
98- (T *)
99  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
100   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
101   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
102   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
103   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
104   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
105
106//----------------------------------------------------------
107//  For org and report mode
108//----------------------------------------------------------
109
110@r2 depends on org || report@
111type T;
112position p != {m1.p1,m2.p2};
113@@
114
115 (T@p *)
116  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
117   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
118   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
119   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
120   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
121   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
122
123@script:python depends on org@
124p << r2.p;
125t << r2.T;
126@@
127
128if m.search(t) != None:
129	cocci.include_match(False)
130else:
131	coccilib.org.print_safe_todo(p[0], t)
132
133@script:python depends on report@
134p << r2.p;
135t << r2.T;
136@@
137
138if m.search(t) != None:
139	cocci.include_match(False)
140else:
141	msg="WARNING: casting value returned by memory allocation function to (%s *) is useless." % (t)
142	coccilib.report.print_report(p[0], msg)
143