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