| Nicolas Palix | 2e1e160 | 2010-08-24 17:38:56 +0200 | [diff] [blame] | 1 | /// This semantic patch looks for kmalloc etc that are not followed by a | 
|  | 2 | /// NULL check.  It only gives a report in the case where there is some | 
|  | 3 | /// error handling code later in the function, which may be helpful | 
|  | 4 | /// in determining what the error handling code for the call to kmalloc etc | 
|  | 5 | /// should be. | 
|  | 6 | /// | 
|  | 7 | // Confidence: High | 
|  | 8 | // Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2. | 
|  | 9 | // Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2. | 
|  | 10 | // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2. | 
|  | 11 | // URL: http://coccinelle.lip6.fr/ | 
|  | 12 | // Comments: | 
|  | 13 | // Options: -no_includes -include_headers | 
|  | 14 |  | 
|  | 15 | virtual context | 
|  | 16 | virtual org | 
|  | 17 | virtual report | 
|  | 18 |  | 
|  | 19 | @withtest@ | 
|  | 20 | expression x; | 
|  | 21 | position p; | 
|  | 22 | identifier f,fld; | 
|  | 23 | @@ | 
|  | 24 |  | 
|  | 25 | x@p = f(...); | 
|  | 26 | ... when != x->fld | 
|  | 27 | \(x == NULL \| x != NULL\) | 
|  | 28 |  | 
|  | 29 | @fixed depends on context && !org && !report@ | 
|  | 30 | expression x,x1; | 
|  | 31 | position p1 != withtest.p; | 
|  | 32 | statement S; | 
|  | 33 | position any withtest.p; | 
|  | 34 | identifier f; | 
|  | 35 | @@ | 
|  | 36 |  | 
|  | 37 | *x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); | 
|  | 38 | ... | 
|  | 39 | *x1@p = f(...); | 
|  | 40 | if (!x1) S | 
|  | 41 |  | 
|  | 42 | // ------------------------------------------------------------------------ | 
|  | 43 |  | 
|  | 44 | @rfixed depends on (org || report) && !context exists@ | 
|  | 45 | expression x,x1; | 
|  | 46 | position p1 != withtest.p; | 
|  | 47 | position p2; | 
|  | 48 | statement S; | 
|  | 49 | position any withtest.p; | 
|  | 50 | identifier f; | 
|  | 51 | @@ | 
|  | 52 |  | 
|  | 53 | x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); | 
|  | 54 | ... | 
|  | 55 | x1@p = f@p2(...); | 
|  | 56 | if (!x1) S | 
|  | 57 |  | 
|  | 58 | @script:python depends on org@ | 
|  | 59 | p1 << rfixed.p1; | 
|  | 60 | p2 << rfixed.p2; | 
|  | 61 | @@ | 
|  | 62 |  | 
|  | 63 | cocci.print_main("alloc call",p1) | 
|  | 64 | cocci.print_secs("possible model",p2) | 
|  | 65 |  | 
|  | 66 | @script:python depends on report@ | 
|  | 67 | p1 << rfixed.p1; | 
|  | 68 | p2 << rfixed.p2; | 
|  | 69 | @@ | 
|  | 70 |  | 
|  | 71 | msg = "alloc with no test, possible model on line %s" % (p2[0].line) | 
|  | 72 | coccilib.report.print_report(p1[0],msg) |