| Nicolas Palix | cf5842d | 2010-06-06 17:15:04 +0200 | [diff] [blame] | 1 | /// | 
| Nicolas Palix | be8fe9d | 2010-08-24 17:39:10 +0200 | [diff] [blame] | 2 | /// Use kzalloc rather than kmalloc followed by memset with 0 | 
|  | 3 | /// | 
|  | 4 | /// This considers some simple cases that are common and easy to validate | 
|  | 5 | /// Note in particular that there are no ...s in the rule, so all of the | 
|  | 6 | /// matched code has to be contiguous | 
| Nicolas Palix | cf5842d | 2010-06-06 17:15:04 +0200 | [diff] [blame] | 7 | /// | 
|  | 8 | // Confidence: High | 
|  | 9 | // Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.  GPLv2. | 
|  | 10 | // Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.  GPLv2. | 
|  | 11 | // URL: http://coccinelle.lip6.fr/rules/kzalloc.html | 
|  | 12 | // Options: -no_includes -include_headers | 
|  | 13 | // | 
|  | 14 | // Keywords: kmalloc, kzalloc | 
|  | 15 | // Version min: < 2.6.12 kmalloc | 
|  | 16 | // Version min:   2.6.14 kzalloc | 
|  | 17 | // | 
|  | 18 |  | 
|  | 19 | virtual context | 
|  | 20 | virtual patch | 
|  | 21 | virtual org | 
|  | 22 | virtual report | 
|  | 23 |  | 
|  | 24 | //---------------------------------------------------------- | 
|  | 25 | //  For context mode | 
|  | 26 | //---------------------------------------------------------- | 
|  | 27 |  | 
|  | 28 | @depends on context@ | 
|  | 29 | type T, T2; | 
|  | 30 | expression x; | 
|  | 31 | expression E1,E2; | 
|  | 32 | statement S; | 
|  | 33 | @@ | 
|  | 34 |  | 
|  | 35 | * x = (T)kmalloc(E1,E2); | 
|  | 36 | if ((x==NULL) || ...) S | 
|  | 37 | * memset((T2)x,0,E1); | 
|  | 38 |  | 
|  | 39 | //---------------------------------------------------------- | 
|  | 40 | //  For patch mode | 
|  | 41 | //---------------------------------------------------------- | 
|  | 42 |  | 
|  | 43 | @depends on patch@ | 
|  | 44 | type T, T2; | 
|  | 45 | expression x; | 
|  | 46 | expression E1,E2; | 
|  | 47 | statement S; | 
|  | 48 | @@ | 
|  | 49 |  | 
|  | 50 | - x = (T)kmalloc(E1,E2); | 
|  | 51 | + x = kzalloc(E1,E2); | 
|  | 52 | if ((x==NULL) || ...) S | 
|  | 53 | - memset((T2)x,0,E1); | 
|  | 54 |  | 
|  | 55 | //---------------------------------------------------------- | 
|  | 56 | //  For org mode | 
|  | 57 | //---------------------------------------------------------- | 
|  | 58 |  | 
|  | 59 | @r depends on org || report@ | 
|  | 60 | type T, T2; | 
|  | 61 | expression x; | 
|  | 62 | expression E1,E2; | 
|  | 63 | statement S; | 
|  | 64 | position p; | 
|  | 65 | @@ | 
|  | 66 |  | 
|  | 67 | x = (T)kmalloc@p(E1,E2); | 
|  | 68 | if ((x==NULL) || ...) S | 
|  | 69 | memset((T2)x,0,E1); | 
|  | 70 |  | 
|  | 71 | @script:python depends on org@ | 
|  | 72 | p << r.p; | 
|  | 73 | x << r.x; | 
|  | 74 | @@ | 
|  | 75 |  | 
|  | 76 | msg="%s" % (x) | 
|  | 77 | msg_safe=msg.replace("[","@(").replace("]",")") | 
|  | 78 | coccilib.org.print_todo(p[0], msg_safe) | 
|  | 79 |  | 
|  | 80 | @script:python depends on report@ | 
|  | 81 | p << r.p; | 
|  | 82 | x << r.x; | 
|  | 83 | @@ | 
|  | 84 |  | 
|  | 85 | msg="WARNING: kzalloc should be used for %s, instead of kmalloc/memset" % (x) | 
|  | 86 | coccilib.report.print_report(p[0], msg) |