]>
Commit | Line | Data |
---|---|---|
af56e3f0 CR |
1 | /// Make sure calls to d_find_alias() have a corresponding call to dput(). |
2 | // | |
3 | // Keywords: d_find_alias, dput | |
4 | // | |
5 | // Confidence: Moderate | |
6 | // URL: http://coccinelle.lip6.fr/ | |
93f14468 | 7 | // Options: --include-headers |
af56e3f0 CR |
8 | |
9 | virtual context | |
10 | virtual org | |
11 | virtual patch | |
12 | virtual report | |
13 | ||
14 | @r exists@ | |
15 | local idexpression struct dentry *dent; | |
16 | expression E, E1; | |
17 | statement S1, S2; | |
18 | position p1, p2; | |
19 | @@ | |
20 | ( | |
21 | if (!(dent@p1 = d_find_alias(...))) S1 | |
22 | | | |
23 | dent@p1 = d_find_alias(...) | |
24 | ) | |
25 | ||
26 | <...when != dput(dent) | |
27 | when != if (...) { <+... dput(dent) ...+> } | |
28 | when != true !dent || ... | |
29 | when != dent = E | |
30 | when != E = dent | |
31 | if (!dent || ...) S2 | |
32 | ...> | |
33 | ( | |
34 | return <+...dent...+>; | |
35 | | | |
36 | return @p2 ...; | |
37 | | | |
38 | dent@p2 = E1; | |
39 | | | |
40 | E1 = dent; | |
41 | ) | |
42 | ||
43 | @depends on context@ | |
44 | local idexpression struct dentry *r.dent; | |
45 | position r.p1,r.p2; | |
46 | @@ | |
47 | * dent@p1 = ... | |
48 | ... | |
49 | ( | |
50 | * return@p2 ...; | |
51 | | | |
52 | * dent@p2 | |
53 | ) | |
54 | ||
55 | ||
56 | @script:python depends on org@ | |
57 | p1 << r.p1; | |
58 | p2 << r.p2; | |
59 | @@ | |
60 | cocci.print_main("Missing call to dput()",p1) | |
61 | cocci.print_secs("",p2) | |
62 | ||
63 | @depends on patch@ | |
64 | local idexpression struct dentry *r.dent; | |
65 | position r.p2; | |
66 | @@ | |
67 | ( | |
68 | + dput(dent); | |
69 | return @p2 ...; | |
70 | | | |
71 | + dput(dent); | |
72 | dent@p2 = ...; | |
73 | ) | |
74 | ||
75 | @script:python depends on report@ | |
76 | p1 << r.p1; | |
77 | p2 << r.p2; | |
78 | @@ | |
79 | msg = "Missing call to dput() at line %s." | |
80 | coccilib.report.print_report(p1[0], msg % (p2[0].line)) |