Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / scripts / coccinelle / locks / double_lock.cocci
blob002752f97dcab4265173fb5205db3ff393e9bc1d
1 /// Find double locks.  False positives may occur when some paths cannot
2 /// occur at execution, due to the values of variables, and when there is
3 /// an intervening function call that releases the lock.
4 ///
5 // Confidence: Moderate
6 // Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
7 // Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
8 // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
9 // URL: http://coccinelle.lip6.fr/
10 // Comments:
11 // Options: --no-includes --include-headers
13 virtual org
14 virtual report
16 @locked@
17 position p1;
18 expression E1;
19 position p;
23 mutex_lock@p1
25 mutex_trylock@p1
27 spin_lock@p1
29 spin_trylock@p1
31 read_lock@p1
33 read_trylock@p1
35 write_lock@p1
37 write_trylock@p1
38 ) (E1@p,...);
40 @balanced@
41 position p1 != locked.p1;
42 position locked.p;
43 identifier lock,unlock;
44 expression x <= locked.E1;
45 expression E,locked.E1;
46 expression E2;
49 if (E) {
50  <+... when != E1
51  lock(E1@p,...)
52  ...+>
54 ... when != E1
55     when != \(x = E2\|&x\)
56     when forall
57 if (E) {
58  <+... when != E1
59  unlock@p1(E1,...)
60  ...+>
63 @r depends on !balanced exists@
64 expression x <= locked.E1;
65 expression locked.E1;
66 expression E2;
67 identifier lock;
68 position locked.p,p1,p2;
71 lock@p1 (E1@p,...);
72 ... when != E1
73     when != \(x = E2\|&x\)
74 lock@p2 (E1,...);
76 @script:python depends on org@
77 p1 << r.p1;
78 p2 << r.p2;
79 lock << r.lock;
82 cocci.print_main(lock,p1)
83 cocci.print_secs("second lock",p2)
85 @script:python depends on report@
86 p1 << r.p1;
87 p2 << r.p2;
88 lock << r.lock;
91 msg = "second lock on line %s" % (p2[0].line)
92 coccilib.report.print_report(p1[0],msg)