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