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