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