1*53ee8cc1Swenshuai.xi/// Find a use after free. 2*53ee8cc1Swenshuai.xi//# Values of variables may imply that some 3*53ee8cc1Swenshuai.xi//# execution paths are not possible, resulting in false positives. 4*53ee8cc1Swenshuai.xi//# Another source of false positives are macros such as 5*53ee8cc1Swenshuai.xi//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument 6*53ee8cc1Swenshuai.xi/// 7*53ee8cc1Swenshuai.xi// Confidence: Moderate 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 org 16*53ee8cc1Swenshuai.xivirtual report 17*53ee8cc1Swenshuai.xi 18*53ee8cc1Swenshuai.xi@free@ 19*53ee8cc1Swenshuai.xiexpression E; 20*53ee8cc1Swenshuai.xiposition p1; 21*53ee8cc1Swenshuai.xi@@ 22*53ee8cc1Swenshuai.xi 23*53ee8cc1Swenshuai.xikfree@p1(E) 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi@print expression@ 26*53ee8cc1Swenshuai.xiconstant char *c; 27*53ee8cc1Swenshuai.xiexpression free.E,E2; 28*53ee8cc1Swenshuai.xitype T; 29*53ee8cc1Swenshuai.xiposition p; 30*53ee8cc1Swenshuai.xiidentifier f; 31*53ee8cc1Swenshuai.xi@@ 32*53ee8cc1Swenshuai.xi 33*53ee8cc1Swenshuai.xi( 34*53ee8cc1Swenshuai.xi f(...,c,...,(T)E@p,...) 35*53ee8cc1Swenshuai.xi| 36*53ee8cc1Swenshuai.xi E@p == E2 37*53ee8cc1Swenshuai.xi| 38*53ee8cc1Swenshuai.xi E@p != E2 39*53ee8cc1Swenshuai.xi| 40*53ee8cc1Swenshuai.xi !E@p 41*53ee8cc1Swenshuai.xi| 42*53ee8cc1Swenshuai.xi E@p || ... 43*53ee8cc1Swenshuai.xi) 44*53ee8cc1Swenshuai.xi 45*53ee8cc1Swenshuai.xi@sz@ 46*53ee8cc1Swenshuai.xiexpression free.E; 47*53ee8cc1Swenshuai.xiposition p; 48*53ee8cc1Swenshuai.xi@@ 49*53ee8cc1Swenshuai.xi 50*53ee8cc1Swenshuai.xi sizeof(<+...E@p...+>) 51*53ee8cc1Swenshuai.xi 52*53ee8cc1Swenshuai.xi@loop exists@ 53*53ee8cc1Swenshuai.xiexpression E; 54*53ee8cc1Swenshuai.xiidentifier l; 55*53ee8cc1Swenshuai.xiposition ok; 56*53ee8cc1Swenshuai.xi@@ 57*53ee8cc1Swenshuai.xi 58*53ee8cc1Swenshuai.xiwhile (1) { ... 59*53ee8cc1Swenshuai.xi kfree@ok(E) 60*53ee8cc1Swenshuai.xi ... when != break; 61*53ee8cc1Swenshuai.xi when != goto l; 62*53ee8cc1Swenshuai.xi when forall 63*53ee8cc1Swenshuai.xi} 64*53ee8cc1Swenshuai.xi 65*53ee8cc1Swenshuai.xi@r exists@ 66*53ee8cc1Swenshuai.xiexpression free.E, subE<=free.E, E2; 67*53ee8cc1Swenshuai.xiexpression E1; 68*53ee8cc1Swenshuai.xiiterator iter; 69*53ee8cc1Swenshuai.xistatement S; 70*53ee8cc1Swenshuai.xiposition free.p1!=loop.ok,p2!={print.p,sz.p}; 71*53ee8cc1Swenshuai.xi@@ 72*53ee8cc1Swenshuai.xi 73*53ee8cc1Swenshuai.xikfree@p1(E,...) 74*53ee8cc1Swenshuai.xi... 75*53ee8cc1Swenshuai.xi( 76*53ee8cc1Swenshuai.xi iter(...,subE,...) S // no use 77*53ee8cc1Swenshuai.xi| 78*53ee8cc1Swenshuai.xi list_remove_head(E1,subE,...) 79*53ee8cc1Swenshuai.xi| 80*53ee8cc1Swenshuai.xi subE = E2 81*53ee8cc1Swenshuai.xi| 82*53ee8cc1Swenshuai.xi subE++ 83*53ee8cc1Swenshuai.xi| 84*53ee8cc1Swenshuai.xi ++subE 85*53ee8cc1Swenshuai.xi| 86*53ee8cc1Swenshuai.xi --subE 87*53ee8cc1Swenshuai.xi| 88*53ee8cc1Swenshuai.xi subE-- 89*53ee8cc1Swenshuai.xi| 90*53ee8cc1Swenshuai.xi &subE 91*53ee8cc1Swenshuai.xi| 92*53ee8cc1Swenshuai.xi BUG(...) 93*53ee8cc1Swenshuai.xi| 94*53ee8cc1Swenshuai.xi BUG_ON(...) 95*53ee8cc1Swenshuai.xi| 96*53ee8cc1Swenshuai.xi return_VALUE(...) 97*53ee8cc1Swenshuai.xi| 98*53ee8cc1Swenshuai.xi return_ACPI_STATUS(...) 99*53ee8cc1Swenshuai.xi| 100*53ee8cc1Swenshuai.xi E@p2 // bad use 101*53ee8cc1Swenshuai.xi) 102*53ee8cc1Swenshuai.xi 103*53ee8cc1Swenshuai.xi@script:python depends on org@ 104*53ee8cc1Swenshuai.xip1 << free.p1; 105*53ee8cc1Swenshuai.xip2 << r.p2; 106*53ee8cc1Swenshuai.xi@@ 107*53ee8cc1Swenshuai.xi 108*53ee8cc1Swenshuai.xicocci.print_main("kfree",p1) 109*53ee8cc1Swenshuai.xicocci.print_secs("ref",p2) 110*53ee8cc1Swenshuai.xi 111*53ee8cc1Swenshuai.xi@script:python depends on report@ 112*53ee8cc1Swenshuai.xip1 << free.p1; 113*53ee8cc1Swenshuai.xip2 << r.p2; 114*53ee8cc1Swenshuai.xi@@ 115*53ee8cc1Swenshuai.xi 116*53ee8cc1Swenshuai.ximsg = "reference preceded by free on line %s" % (p1[0].line) 117*53ee8cc1Swenshuai.xicoccilib.report.print_report(p2[0],msg) 118