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