1/// Find missing clk_puts. 2/// 3//# This only signals a missing clk_put when there is a clk_put 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@clk@ 19expression e; 20statement S,S1; 21int ret; 22position p1,p2,p3; 23@@ 24 25e = clk_get@p1(...) 26... when != clk_put(e) 27if (<+...e...+>) S 28... when any 29 when != clk_put(e) 30 when != if (...) { ... clk_put(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 != clk_put(e) 44 when forall 45 return@p3 ...; } 46) 47... when any 48clk_put(e); 49 50@script:python depends on org@ 51p1 << clk.p1; 52p2 << clk.p2; 53p3 << clk.p3; 54@@ 55 56cocci.print_main("clk_get",p1) 57cocci.print_secs("if",p2) 58cocci.print_secs("needed clk_put",p3) 59 60@script:python depends on report@ 61p1 << clk.p1; 62p2 << clk.p2; 63p3 << clk.p3; 64@@ 65 66msg = "ERROR: missing clk_put; clk_get on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line) 67coccilib.report.print_report(p3[0],msg) 68