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