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