Merge tag 'block-5.11-2021-01-10' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / scripts / coccinelle / locks / double_lock.cocci
blob9e88a578957c0fc22484127080b1edd33d76feed
1 // SPDX-License-Identifier: GPL-2.0-only
2 /// Find double locks.  False positives may occur when some paths cannot
3 /// occur at execution, due to the values of variables, and when there is
4 /// an intervening function call that releases the lock.
5 ///
6 // Confidence: Moderate
7 // Copyright: (C) 2010 Nicolas Palix, DIKU.
8 // Copyright: (C) 2010 Julia Lawall, DIKU.
9 // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
10 // URL: http://coccinelle.lip6.fr/
11 // Comments:
12 // Options: --no-includes --include-headers
14 virtual org
15 virtual report
17 @locked@
18 position p1;
19 expression E1;
20 position p;
24 mutex_lock@p1
26 mutex_trylock@p1
28 spin_lock@p1
30 spin_trylock@p1
32 read_lock@p1
34 read_trylock@p1
36 write_lock@p1
38 write_trylock@p1
39 ) (E1@p,...);
41 @balanced@
42 position p1 != locked.p1;
43 position locked.p;
44 identifier lock,unlock;
45 expression x <= locked.E1;
46 expression E,locked.E1;
47 expression E2;
50 if (E) {
51  <+... when != E1
52  lock(E1@p,...)
53  ...+>
55 ... when != E1
56     when != \(x = E2\|&x\)
57     when forall
58 if (E) {
59  <+... when != E1
60  unlock@p1(E1,...)
61  ...+>
64 @r depends on !balanced exists@
65 expression x <= locked.E1;
66 expression locked.E1;
67 expression E2;
68 identifier lock;
69 position locked.p,p1,p2;
72 lock@p1 (E1@p,...);
73 ... when != E1
74     when != \(x = E2\|&x\)
75 lock@p2 (E1,...);
77 @script:python depends on org@
78 p1 << r.p1;
79 p2 << r.p2;
80 lock << r.lock;
83 cocci.print_main(lock,p1)
84 cocci.print_secs("second lock",p2)
86 @script:python depends on report@
87 p1 << r.p1;
88 p2 << r.p2;
89 lock << r.lock;
92 msg = "second lock on line %s" % (p2[0].line)
93 coccilib.report.print_report(p1[0],msg)