Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /// Remove casting the values returned by memory allocation functions
0003 /// like kmalloc, kzalloc, kmem_cache_alloc, kmem_cache_zalloc etc.
0004 ///
0005 //# This makes an effort to find cases of casting of values returned by
0006 //# kmalloc, kzalloc, kcalloc, kmem_cache_alloc, kmem_cache_zalloc,
0007 //# kmem_cache_alloc_node, kmalloc_node and kzalloc_node and removes
0008 //# the casting as it is not required. The result in the patch case may
0009 //# need some reformatting.
0010 //
0011 // Confidence: High
0012 // Copyright: (C) 2014 Himangi Saraogi
0013 // Copyright: (C) 2017 Himanshu Jha
0014 // Comments:
0015 // Options: --no-includes --include-headers
0016 //
0017 
0018 virtual context
0019 virtual patch
0020 virtual org
0021 virtual report
0022 
0023 @initialize:python@
0024 @@
0025 import re
0026 pattern = '__'
0027 m = re.compile(pattern)
0028 
0029 @r1 depends on context || patch@
0030 type T;
0031 @@
0032 
0033   (T *)
0034   \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
0035    kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
0036    dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
0037    kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
0038    pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
0039    kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
0040 
0041 //----------------------------------------------------------
0042 //  For context mode
0043 //----------------------------------------------------------
0044 
0045 @script:python depends on context@
0046 t << r1.T;
0047 @@
0048 
0049 if m.search(t) != None:
0050         cocci.include_match(False)
0051 
0052 @depends on context && r1@
0053 type r1.T;
0054 @@
0055 
0056 * (T *)
0057   \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
0058    kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
0059    dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
0060    kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
0061    pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
0062    kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
0063 
0064 //----------------------------------------------------------
0065 //  For patch mode
0066 //----------------------------------------------------------
0067 
0068 @script:python depends on patch@
0069 t << r1.T;
0070 @@
0071 
0072 if m.search(t) != None:
0073         cocci.include_match(False)
0074 
0075 @depends on patch && r1@
0076 type r1.T;
0077 @@
0078 
0079 - (T *)
0080   \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
0081    kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
0082    dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
0083    kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
0084    pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
0085    kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
0086 
0087 //----------------------------------------------------------
0088 //  For org and report mode
0089 //----------------------------------------------------------
0090 
0091 @r2 depends on org || report@
0092 type T;
0093 position p;
0094 @@
0095 
0096  (T@p *)
0097   \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
0098    kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
0099    dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
0100    kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
0101    pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
0102    kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
0103 
0104 @script:python depends on org@
0105 p << r2.p;
0106 t << r2.T;
0107 @@
0108 
0109 if m.search(t) != None:
0110         cocci.include_match(False)
0111 else:
0112         coccilib.org.print_safe_todo(p[0], t)
0113 
0114 @script:python depends on report@
0115 p << r2.p;
0116 t << r2.T;
0117 @@
0118 
0119 if m.search(t) != None:
0120         cocci.include_match(False)
0121 else:
0122         msg="WARNING: casting value returned by memory allocation function to (%s *) is useless." % (t)
0123         coccilib.report.print_report(p[0], msg)