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