|  | /// | 
|  | /// Use kzalloc rather than kmalloc 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. | 
|  | // 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,E2; | 
|  | statement S; | 
|  | @@ | 
|  |  | 
|  | * x = (T)kmalloc(E1,E2); | 
|  | if ((x==NULL) || ...) S | 
|  | * memset((T2)x,0,E1); | 
|  |  | 
|  | //---------------------------------------------------------- | 
|  | //  For patch mode | 
|  | //---------------------------------------------------------- | 
|  |  | 
|  | @depends on patch@ | 
|  | type T, T2; | 
|  | expression x; | 
|  | expression E1,E2; | 
|  | statement S; | 
|  | @@ | 
|  |  | 
|  | - x = (T)kmalloc(E1,E2); | 
|  | + x = kzalloc(E1,E2); | 
|  | 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) |