xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/free/clk_put.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun/// Find missing clk_puts.
3*4882a593Smuzhiyun///
4*4882a593Smuzhiyun//# This only signals a missing clk_put when there is a clk_put 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@clk@
20*4882a593Smuzhiyunexpression e;
21*4882a593Smuzhiyunstatement S,S1;
22*4882a593Smuzhiyunint ret;
23*4882a593Smuzhiyunposition p1,p2,p3;
24*4882a593Smuzhiyun@@
25*4882a593Smuzhiyun
26*4882a593Smuzhiyune = clk_get@p1(...)
27*4882a593Smuzhiyun... when != clk_put(e)
28*4882a593Smuzhiyunif (<+...e...+>) S
29*4882a593Smuzhiyun... when any
30*4882a593Smuzhiyun    when != clk_put(e)
31*4882a593Smuzhiyun    when != if (...) { ... clk_put(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 != clk_put(e)
45*4882a593Smuzhiyun         when forall
46*4882a593Smuzhiyun     return@p3 ...; }
47*4882a593Smuzhiyun)
48*4882a593Smuzhiyun... when any
49*4882a593Smuzhiyunclk_put(e);
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun@script:python depends on org@
52*4882a593Smuzhiyunp1 << clk.p1;
53*4882a593Smuzhiyunp2 << clk.p2;
54*4882a593Smuzhiyunp3 << clk.p3;
55*4882a593Smuzhiyun@@
56*4882a593Smuzhiyun
57*4882a593Smuzhiyuncocci.print_main("clk_get",p1)
58*4882a593Smuzhiyuncocci.print_secs("if",p2)
59*4882a593Smuzhiyuncocci.print_secs("needed clk_put",p3)
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun@script:python depends on report@
62*4882a593Smuzhiyunp1 << clk.p1;
63*4882a593Smuzhiyunp2 << clk.p2;
64*4882a593Smuzhiyunp3 << clk.p3;
65*4882a593Smuzhiyun@@
66*4882a593Smuzhiyun
67*4882a593Smuzhiyunmsg = "ERROR: missing clk_put; clk_get 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