xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/api/d_find_alias.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun/// Make sure calls to d_find_alias() have a corresponding call to dput().
3*4882a593Smuzhiyun//
4*4882a593Smuzhiyun// Keywords: d_find_alias, dput
5*4882a593Smuzhiyun//
6*4882a593Smuzhiyun// Confidence: Moderate
7*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/
8*4882a593Smuzhiyun// Options: --include-headers
9*4882a593Smuzhiyun
10*4882a593Smuzhiyunvirtual context
11*4882a593Smuzhiyunvirtual org
12*4882a593Smuzhiyunvirtual patch
13*4882a593Smuzhiyunvirtual report
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun@r exists@
16*4882a593Smuzhiyunlocal idexpression struct dentry *dent;
17*4882a593Smuzhiyunexpression E, E1;
18*4882a593Smuzhiyunstatement S1, S2;
19*4882a593Smuzhiyunposition p1, p2;
20*4882a593Smuzhiyun@@
21*4882a593Smuzhiyun(
22*4882a593Smuzhiyun	if (!(dent@p1 = d_find_alias(...))) S1
23*4882a593Smuzhiyun|
24*4882a593Smuzhiyun	dent@p1 = d_find_alias(...)
25*4882a593Smuzhiyun)
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun<...when != dput(dent)
28*4882a593Smuzhiyun    when != if (...) { <+... dput(dent) ...+> }
29*4882a593Smuzhiyun    when != true !dent || ...
30*4882a593Smuzhiyun    when != dent = E
31*4882a593Smuzhiyun    when != E = dent
32*4882a593Smuzhiyunif (!dent || ...) S2
33*4882a593Smuzhiyun...>
34*4882a593Smuzhiyun(
35*4882a593Smuzhiyun	return <+...dent...+>;
36*4882a593Smuzhiyun|
37*4882a593Smuzhiyun	return @p2 ...;
38*4882a593Smuzhiyun|
39*4882a593Smuzhiyun	dent@p2 = E1;
40*4882a593Smuzhiyun|
41*4882a593Smuzhiyun	E1 = dent;
42*4882a593Smuzhiyun)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun@depends on context@
45*4882a593Smuzhiyunlocal idexpression struct dentry *r.dent;
46*4882a593Smuzhiyunposition r.p1,r.p2;
47*4882a593Smuzhiyun@@
48*4882a593Smuzhiyun* dent@p1 = ...
49*4882a593Smuzhiyun  ...
50*4882a593Smuzhiyun(
51*4882a593Smuzhiyun* return@p2 ...;
52*4882a593Smuzhiyun|
53*4882a593Smuzhiyun* dent@p2
54*4882a593Smuzhiyun)
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun@script:python depends on org@
58*4882a593Smuzhiyunp1 << r.p1;
59*4882a593Smuzhiyunp2 << r.p2;
60*4882a593Smuzhiyun@@
61*4882a593Smuzhiyuncocci.print_main("Missing call to dput()",p1)
62*4882a593Smuzhiyuncocci.print_secs("",p2)
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun@depends on patch@
65*4882a593Smuzhiyunlocal idexpression struct dentry *r.dent;
66*4882a593Smuzhiyunposition r.p2;
67*4882a593Smuzhiyun@@
68*4882a593Smuzhiyun(
69*4882a593Smuzhiyun+ dput(dent);
70*4882a593Smuzhiyun  return @p2 ...;
71*4882a593Smuzhiyun|
72*4882a593Smuzhiyun+ dput(dent);
73*4882a593Smuzhiyun  dent@p2 = ...;
74*4882a593Smuzhiyun)
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun@script:python depends on report@
77*4882a593Smuzhiyunp1 << r.p1;
78*4882a593Smuzhiyunp2 << r.p2;
79*4882a593Smuzhiyun@@
80*4882a593Smuzhiyunmsg = "Missing call to dput() at line %s."
81*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg % (p2[0].line))
82