xref: /openbmc/linux/scripts/coccinelle/free/iounmap.cocci (revision cd0207a7bfd29016a4eeb0b0203fa900b41e4eee)
1*cd0207a7SJulia Lawall/// Find missing iounmaps.
2*cd0207a7SJulia Lawall///
3*cd0207a7SJulia Lawall//# This only signals a missing iounmap when there is an iounmap later
4*cd0207a7SJulia Lawall//# in the same function.
5*cd0207a7SJulia Lawall//# False positives can be due to loops.
6*cd0207a7SJulia Lawall//
7*cd0207a7SJulia Lawall// Confidence: Moderate
8*cd0207a7SJulia Lawall// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
9*cd0207a7SJulia Lawall// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.
10*cd0207a7SJulia Lawall// URL: http://coccinelle.lip6.fr/
11*cd0207a7SJulia Lawall// Comments:
12*cd0207a7SJulia Lawall// Options:
13*cd0207a7SJulia Lawall
14*cd0207a7SJulia Lawallvirtual context
15*cd0207a7SJulia Lawallvirtual org
16*cd0207a7SJulia Lawallvirtual report
17*cd0207a7SJulia Lawall
18*cd0207a7SJulia Lawall@iom@
19*cd0207a7SJulia Lawallexpression e;
20*cd0207a7SJulia Lawallstatement S,S1;
21*cd0207a7SJulia Lawallint ret;
22*cd0207a7SJulia Lawallposition p1,p2,p3;
23*cd0207a7SJulia Lawall@@
24*cd0207a7SJulia Lawall
25*cd0207a7SJulia Lawalle = \(ioremap@p1\|ioremap_nocache@p1\)(...)
26*cd0207a7SJulia Lawall... when != iounmap(e)
27*cd0207a7SJulia Lawallif (<+...e...+>) S
28*cd0207a7SJulia Lawall... when any
29*cd0207a7SJulia Lawall    when != iounmap(e)
30*cd0207a7SJulia Lawall    when != if (...) { ... iounmap(e); ... }
31*cd0207a7SJulia Lawall(
32*cd0207a7SJulia Lawall if (ret == 0) S1
33*cd0207a7SJulia Lawall|
34*cd0207a7SJulia Lawallif (...)
35*cd0207a7SJulia Lawall   { ...
36*cd0207a7SJulia Lawall     return 0; }
37*cd0207a7SJulia Lawall|
38*cd0207a7SJulia Lawallif (...)
39*cd0207a7SJulia Lawall   { ...
40*cd0207a7SJulia Lawall     return <+...e...+>; }
41*cd0207a7SJulia Lawall|
42*cd0207a7SJulia Lawall*if@p2 (...)
43*cd0207a7SJulia Lawall   { ... when != iounmap(e)
44*cd0207a7SJulia Lawall         when forall
45*cd0207a7SJulia Lawall     return@p3 ...; }
46*cd0207a7SJulia Lawall)
47*cd0207a7SJulia Lawall... when any
48*cd0207a7SJulia Lawalliounmap(e);
49*cd0207a7SJulia Lawall
50*cd0207a7SJulia Lawall@script:python depends on org@
51*cd0207a7SJulia Lawallp1 << iom.p1;
52*cd0207a7SJulia Lawallp2 << iom.p2;
53*cd0207a7SJulia Lawallp3 << iom.p3;
54*cd0207a7SJulia Lawall@@
55*cd0207a7SJulia Lawall
56*cd0207a7SJulia Lawallcocci.print_main("ioremap",p1)
57*cd0207a7SJulia Lawallcocci.print_secs("if",p2)
58*cd0207a7SJulia Lawallcocci.print_secs("needed iounmap",p3)
59*cd0207a7SJulia Lawall
60*cd0207a7SJulia Lawall@script:python depends on report@
61*cd0207a7SJulia Lawallp1 << iom.p1;
62*cd0207a7SJulia Lawallp2 << iom.p2;
63*cd0207a7SJulia Lawallp3 << iom.p3;
64*cd0207a7SJulia Lawall@@
65*cd0207a7SJulia Lawall
66*cd0207a7SJulia Lawallmsg = "ERROR: missing iounmap; ioremap on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line)
67*cd0207a7SJulia Lawallcoccilib.report.print_report(p3[0],msg)
68