Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
[linux/fpc-iii.git] / scripts / coccinelle / free / kfree.cocci
blobac438da4fd7b183d9a6eeec255a6672856d1c1f6
1 /// Find a use after free.
2 //# Values of variables may imply that some
3 //# execution paths are not possible, resulting in false positives.
4 //# Another source of false positives are macros such as
5 //# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
6 ///
7 // Confidence: Moderate
8 // Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
9 // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
10 // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
11 // URL: http://coccinelle.lip6.fr/
12 // Comments:
13 // Options: --no-includes --include-headers
15 virtual org
16 virtual report
18 @free@
19 expression E;
20 position p1;
24 * kfree@p1(E)
26 * kzfree@p1(E)
29 @print expression@
30 constant char [] c;
31 expression free.E,E2;
32 type T;
33 position p;
34 identifier f;
38  f(...,c,...,(T)E@p,...)
40  E@p == E2
42  E@p != E2
44  E2 == E@p
46  E2 != E@p
48  !E@p
50  E@p || ...
53 @sz@
54 expression free.E;
55 position p;
58  sizeof(<+...E@p...+>)
60 @loop exists@
61 expression E;
62 identifier l;
63 position ok;
66 while (1) { ...
68 * kfree@ok(E)
70 * kzfree@ok(E)
72   ... when != break;
73       when != goto l;
74       when forall
77 @r exists@
78 expression free.E, subE<=free.E, E2;
79 expression E1;
80 iterator iter;
81 statement S;
82 position free.p1!=loop.ok,p2!={print.p,sz.p};
86 * kfree@p1(E,...)
88 * kzfree@p1(E,...)
90 ...
92  iter(...,subE,...) S // no use
94  list_remove_head(E1,subE,...)
96  subE = E2
98  subE++
100  ++subE
102  --subE
104  subE--
106  &subE
108  BUG(...)
110  BUG_ON(...)
112  return_VALUE(...)
114  return_ACPI_STATUS(...)
116  E@p2 // bad use
119 @script:python depends on org@
120 p1 << free.p1;
121 p2 << r.p2;
124 cocci.print_main("kfree",p1)
125 cocci.print_secs("ref",p2)
127 @script:python depends on report@
128 p1 << free.p1;
129 p2 << r.p2;
132 msg = "ERROR: reference preceded by free on line %s" % (p1[0].line)
133 coccilib.report.print_report(p2[0],msg)