123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- ///
- /// Use zeroing allocator rather than allocator followed by memset with 0
- ///
- /// This considers some simple cases that are common and easy to validate
- /// Note in particular that there are no ...s in the rule, so all of the
- /// matched code has to be contiguous
- ///
- // Confidence: High
- // Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU. GPLv2.
- // Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6. GPLv2.
- // Copyright: (C) 2017 Himanshu Jha GPLv2.
- // URL: http://coccinelle.lip6.fr/rules/kzalloc.html
- // Options: --no-includes --include-headers
- //
- // Keywords: kmalloc, kzalloc
- // Version min: < 2.6.12 kmalloc
- // Version min: 2.6.14 kzalloc
- //
- virtual context
- virtual patch
- virtual org
- virtual report
- //----------------------------------------------------------
- // For context mode
- //----------------------------------------------------------
- @depends on context@
- type T, T2;
- expression x;
- expression E1;
- statement S;
- @@
- * x = (T)\(kmalloc(E1, ...)\|vmalloc(E1)\|dma_alloc_coherent(...,E1,...)\|
- kmalloc_node(E1, ...)\|kmem_cache_alloc(...)\|kmem_alloc(E1, ...)\|
- devm_kmalloc(...,E1,...)\|kvmalloc(E1, ...)\|kvmalloc_node(E1,...)\);
- if ((x==NULL) || ...) S
- * memset((T2)x,0,E1);
- //----------------------------------------------------------
- // For patch mode
- //----------------------------------------------------------
- @depends on patch@
- type T, T2;
- expression x;
- expression E1,E2,E3,E4;
- statement S;
- @@
- (
- - x = kmalloc(E1,E2);
- + x = kzalloc(E1,E2);
- |
- - x = (T *)kmalloc(E1,E2);
- + x = kzalloc(E1,E2);
- |
- - x = (T)kmalloc(E1,E2);
- + x = (T)kzalloc(E1,E2);
- |
- - x = vmalloc(E1);
- + x = vzalloc(E1);
- |
- - x = (T *)vmalloc(E1);
- + x = vzalloc(E1);
- |
- - x = (T)vmalloc(E1);
- + x = (T)vzalloc(E1);
- |
- - x = dma_alloc_coherent(E2,E1,E3,E4);
- + x = dma_zalloc_coherent(E2,E1,E3,E4);
- |
- - x = (T *)dma_alloc_coherent(E2,E1,E3,E4);
- + x = dma_zalloc_coherent(E2,E1,E3,E4);
- |
- - x = (T)dma_alloc_coherent(E2,E1,E3,E4);
- + x = (T)dma_zalloc_coherent(E2,E1,E3,E4);
- |
- - x = kmalloc_node(E1,E2,E3);
- + x = kzalloc_node(E1,E2,E3);
- |
- - x = (T *)kmalloc_node(E1,E2,E3);
- + x = kzalloc_node(E1,E2,E3);
- |
- - x = (T)kmalloc_node(E1,E2,E3);
- + x = (T)kzalloc_node(E1,E2,E3);
- |
- - x = kmem_cache_alloc(E3,E4);
- + x = kmem_cache_zalloc(E3,E4);
- |
- - x = (T *)kmem_cache_alloc(E3,E4);
- + x = kmem_cache_zalloc(E3,E4);
- |
- - x = (T)kmem_cache_alloc(E3,E4);
- + x = (T)kmem_cache_zalloc(E3,E4);
- |
- - x = kmem_alloc(E1,E2);
- + x = kmem_zalloc(E1,E2);
- |
- - x = (T *)kmem_alloc(E1,E2);
- + x = kmem_zalloc(E1,E2);
- |
- - x = (T)kmem_alloc(E1,E2);
- + x = (T)kmem_zalloc(E1,E2);
- |
- - x = devm_kmalloc(E2,E1,E3);
- + x = devm_kzalloc(E2,E1,E3);
- |
- - x = (T *)devm_kmalloc(E2,E1,E3);
- + x = devm_kzalloc(E2,E1,E3);
- |
- - x = (T)devm_kmalloc(E2,E1,E3);
- + x = (T)devm_kzalloc(E2,E1,E3);
- |
- - x = kvmalloc(E1,E2);
- + x = kvzalloc(E1,E2);
- |
- - x = (T *)kvmalloc(E1,E2);
- + x = kvzalloc(E1,E2);
- |
- - x = (T)kvmalloc(E1,E2);
- + x = (T)kvzalloc(E1,E2);
- |
- - x = kvmalloc_node(E1,E2,E3);
- + x = kvzalloc_node(E1,E2,E3);
- |
- - x = (T *)kvmalloc_node(E1,E2,E3);
- + x = kvzalloc_node(E1,E2,E3);
- |
- - x = (T)kvmalloc_node(E1,E2,E3);
- + x = (T)kvzalloc_node(E1,E2,E3);
- )
- if ((x==NULL) || ...) S
- - memset((T2)x,0,E1);
- //----------------------------------------------------------
- // For org mode
- //----------------------------------------------------------
- @r depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2;
- statement S;
- position p;
- @@
- x = (T)kmalloc@p(E1,E2);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r.p;
- x << r.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r.p;
- x << r.x;
- @@
- msg="WARNING: kzalloc should be used for %s, instead of kmalloc/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r1 depends on org || report@
- type T, T2;
- expression x;
- expression E1;
- statement S;
- position p;
- @@
- x = (T)vmalloc@p(E1);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r1.p;
- x << r1.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r1.p;
- x << r1.x;
- @@
- msg="WARNING: vzalloc should be used for %s, instead of vmalloc/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r2 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2,E3,E4;
- statement S;
- position p;
- @@
- x = (T)dma_alloc_coherent@p(E2,E1,E3,E4);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r2.p;
- x << r2.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r2.p;
- x << r2.x;
- @@
- msg="WARNING: dma_zalloc_coherent should be used for %s, instead of dma_alloc_coherent/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r3 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2,E3;
- statement S;
- position p;
- @@
- x = (T)kmalloc_node@p(E1,E2,E3);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r3.p;
- x << r3.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r3.p;
- x << r3.x;
- @@
- msg="WARNING: kzalloc_node should be used for %s, instead of kmalloc_node/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r4 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2,E3;
- statement S;
- position p;
- @@
- x = (T)kmem_cache_alloc@p(E2,E3);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r4.p;
- x << r4.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r4.p;
- x << r4.x;
- @@
- msg="WARNING: kmem_cache_zalloc should be used for %s, instead of kmem_cache_alloc/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r5 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2;
- statement S;
- position p;
- @@
- x = (T)kmem_alloc@p(E1,E2);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r5.p;
- x << r5.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r5.p;
- x << r5.x;
- @@
- msg="WARNING: kmem_zalloc should be used for %s, instead of kmem_alloc/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r6 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2,E3;
- statement S;
- position p;
- @@
- x = (T)devm_kmalloc@p(E2,E1,E3);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r6.p;
- x << r6.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r6.p;
- x << r6.x;
- @@
- msg="WARNING: devm_kzalloc should be used for %s, instead of devm_kmalloc/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r7 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2;
- statement S;
- position p;
- @@
- x = (T)kvmalloc@p(E1,E2);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r7.p;
- x << r7.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r7.p;
- x << r7.x;
- @@
- msg="WARNING: kvzalloc should be used for %s, instead of kvmalloc/memset" % (x)
- coccilib.report.print_report(p[0], msg)
- //-----------------------------------------------------------------
- @r9 depends on org || report@
- type T, T2;
- expression x;
- expression E1,E2,E3;
- statement S;
- position p;
- @@
- x = (T)kvmalloc_node@p(E1,E2,E3);
- if ((x==NULL) || ...) S
- memset((T2)x,0,E1);
- @script:python depends on org@
- p << r9.p;
- x << r9.x;
- @@
- msg="%s" % (x)
- msg_safe=msg.replace("[","@(").replace("]",")")
- coccilib.org.print_todo(p[0], msg_safe)
- @script:python depends on report@
- p << r9.p;
- x << r9.x;
- @@
- msg="WARNING: kvzalloc_node should be used for %s, instead of kvmalloc_node/memset" % (x)
- coccilib.report.print_report(p[0], msg)
|