| /// This semantic patch looks for kmalloc etc that are not followed by a |
| /// NULL check. It only gives a report in the case where there is some |
| /// error handling code later in the function, which may be helpful |
| /// in determining what the error handling code for the call to kmalloc etc |
| /// should be. |
| /// |
| // Confidence: High |
| // Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. |
| // Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. |
| // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. |
| // URL: http://coccinelle.lip6.fr/ |
| // Comments: |
| // Options: --no-includes --include-headers |
| |
| virtual context |
| virtual org |
| virtual report |
| |
| @withtest@ |
| expression x; |
| position p; |
| identifier f,fld; |
| @@ |
| |
| x@p = f(...); |
| ... when != x->fld |
| \(x == NULL \| x != NULL\) |
| |
| @fixed depends on context && !org && !report@ |
| expression x,x1; |
| position p1 != withtest.p; |
| statement S; |
| position any withtest.p; |
| identifier f; |
| @@ |
| |
| *x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); |
| ... |
| *x1@p = f(...); |
| if (!x1) S |
| |
| // ------------------------------------------------------------------------ |
| |
| @rfixed depends on (org || report) && !context exists@ |
| expression x,x1; |
| position p1 != withtest.p; |
| position p2; |
| statement S; |
| position any withtest.p; |
| identifier f; |
| @@ |
| |
| x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); |
| ... |
| x1@p = f@p2(...); |
| if (!x1) S |
| |
| @script:python depends on org@ |
| p1 << rfixed.p1; |
| p2 << rfixed.p2; |
| @@ |
| |
| cocci.print_main("alloc call",p1) |
| cocci.print_secs("possible model",p2) |
| |
| @script:python depends on report@ |
| p1 << rfixed.p1; |
| p2 << rfixed.p2; |
| @@ |
| |
| msg = "alloc with no test, possible model on line %s" % (p2[0].line) |
| coccilib.report.print_report(p1[0],msg) |