162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/// Remove casting the values returned by memory allocation functions
362306a36Sopenharmony_ci/// like kmalloc, kzalloc, kmem_cache_alloc, kmem_cache_zalloc etc.
462306a36Sopenharmony_ci///
562306a36Sopenharmony_ci//# This makes an effort to find cases of casting of values returned by
662306a36Sopenharmony_ci//# kmalloc, kzalloc, kcalloc, kmem_cache_alloc, kmem_cache_zalloc,
762306a36Sopenharmony_ci//# kmem_cache_alloc_node, kmalloc_node and kzalloc_node and removes
862306a36Sopenharmony_ci//# the casting as it is not required. The result in the patch case may
962306a36Sopenharmony_ci//# need some reformatting.
1062306a36Sopenharmony_ci//
1162306a36Sopenharmony_ci// Confidence: High
1262306a36Sopenharmony_ci// Copyright: (C) 2014 Himangi Saraogi
1362306a36Sopenharmony_ci// Copyright: (C) 2017 Himanshu Jha
1462306a36Sopenharmony_ci// Comments:
1562306a36Sopenharmony_ci// Options: --no-includes --include-headers
1662306a36Sopenharmony_ci//
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_civirtual context
1962306a36Sopenharmony_civirtual patch
2062306a36Sopenharmony_civirtual org
2162306a36Sopenharmony_civirtual report
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci@initialize:python@
2462306a36Sopenharmony_ci@@
2562306a36Sopenharmony_ciimport re
2662306a36Sopenharmony_cipattern = '__'
2762306a36Sopenharmony_cim = re.compile(pattern)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci@r1 depends on context || patch@
3062306a36Sopenharmony_citype T;
3162306a36Sopenharmony_ci@@
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci  (T *)
3462306a36Sopenharmony_ci  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
3562306a36Sopenharmony_ci   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
3662306a36Sopenharmony_ci   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
3762306a36Sopenharmony_ci   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
3862306a36Sopenharmony_ci   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
3962306a36Sopenharmony_ci   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci//----------------------------------------------------------
4262306a36Sopenharmony_ci//  For context mode
4362306a36Sopenharmony_ci//----------------------------------------------------------
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci@script:python depends on context@
4662306a36Sopenharmony_cit << r1.T;
4762306a36Sopenharmony_ci@@
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciif m.search(t) != None:
5062306a36Sopenharmony_ci        cocci.include_match(False)
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci@depends on context && r1@
5362306a36Sopenharmony_citype r1.T;
5462306a36Sopenharmony_ci@@
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci* (T *)
5762306a36Sopenharmony_ci  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
5862306a36Sopenharmony_ci   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
5962306a36Sopenharmony_ci   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
6062306a36Sopenharmony_ci   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
6162306a36Sopenharmony_ci   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
6262306a36Sopenharmony_ci   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci//----------------------------------------------------------
6562306a36Sopenharmony_ci//  For patch mode
6662306a36Sopenharmony_ci//----------------------------------------------------------
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci@script:python depends on patch@
6962306a36Sopenharmony_cit << r1.T;
7062306a36Sopenharmony_ci@@
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciif m.search(t) != None:
7362306a36Sopenharmony_ci        cocci.include_match(False)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci@depends on patch && r1@
7662306a36Sopenharmony_citype r1.T;
7762306a36Sopenharmony_ci@@
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci- (T *)
8062306a36Sopenharmony_ci  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
8162306a36Sopenharmony_ci   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
8262306a36Sopenharmony_ci   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
8362306a36Sopenharmony_ci   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
8462306a36Sopenharmony_ci   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
8562306a36Sopenharmony_ci   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci//----------------------------------------------------------
8862306a36Sopenharmony_ci//  For org and report mode
8962306a36Sopenharmony_ci//----------------------------------------------------------
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci@r2 depends on org || report@
9262306a36Sopenharmony_citype T;
9362306a36Sopenharmony_ciposition p;
9462306a36Sopenharmony_ci@@
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci (T@p *)
9762306a36Sopenharmony_ci  \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|
9862306a36Sopenharmony_ci   kmem_cache_alloc_node\|kmalloc_node\|kzalloc_node\|vmalloc\|vzalloc\|
9962306a36Sopenharmony_ci   dma_alloc_coherent\|devm_kmalloc\|devm_kzalloc\|
10062306a36Sopenharmony_ci   kvmalloc\|kvzalloc\|kvmalloc_node\|kvzalloc_node\|pci_alloc_consistent\|
10162306a36Sopenharmony_ci   pci_zalloc_consistent\|kmem_alloc\|kmem_zalloc\|kmem_zone_alloc\|
10262306a36Sopenharmony_ci   kmem_zone_zalloc\|vmalloc_node\|vzalloc_node\)(...)
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci@script:python depends on org@
10562306a36Sopenharmony_cip << r2.p;
10662306a36Sopenharmony_cit << r2.T;
10762306a36Sopenharmony_ci@@
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciif m.search(t) != None:
11062306a36Sopenharmony_ci	cocci.include_match(False)
11162306a36Sopenharmony_cielse:
11262306a36Sopenharmony_ci	coccilib.org.print_safe_todo(p[0], t)
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci@script:python depends on report@
11562306a36Sopenharmony_cip << r2.p;
11662306a36Sopenharmony_cit << r2.T;
11762306a36Sopenharmony_ci@@
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciif m.search(t) != None:
12062306a36Sopenharmony_ci	cocci.include_match(False)
12162306a36Sopenharmony_cielse:
12262306a36Sopenharmony_ci	msg="WARNING: casting value returned by memory allocation function to (%s *) is useless." % (t)
12362306a36Sopenharmony_ci	coccilib.report.print_report(p[0], msg)
124