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