xref: /utopia/UTPA2-700.0.x/projects/build/scripts/coccinelle/free/kfree.cocci (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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