projects/linux·blob master · refs

138 lines · 3.3 KiB

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)