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 12 13virtual org 14virtual report 15 16@locked@ 17position p1; 18expression E1; 19position p; 20@@ 21 22( 23mutex_lock@p1 24| 25mutex_trylock@p1 26| 27spin_lock@p1 28| 29spin_trylock@p1 30| 31read_lock@p1 32| 33read_trylock@p1 34| 35write_lock@p1 36| 37write_trylock@p1 38) (E1@p,...); 39 40@balanced@ 41position p1 != locked.p1; 42position locked.p; 43identifier lock,unlock; 44expression x <= locked.E1; 45expression E,locked.E1; 46expression E2; 47@@ 48 49if (E) { 50 <+... when != E1 51 lock(E1@p,...) 52 ...+> 53} 54... when != E1 55 when != \(x = E2\|&x\) 56 when forall 57if (E) { 58 <+... when != E1 59 unlock@p1(E1,...) 60 ...+> 61} 62 63@r depends on !balanced exists@ 64expression x <= locked.E1; 65expression locked.E1; 66expression E2; 67identifier lock; 68position locked.p,p1,p2; 69@@ 70 71lock@p1 (E1@p,...); 72... when != E1 73 when != \(x = E2\|&x\) 74lock@p2 (E1,...); 75 76@script:python depends on org@ 77p1 << r.p1; 78p2 << r.p2; 79lock << r.lock; 80@@ 81 82cocci.print_main(lock,p1) 83cocci.print_secs("second lock",p2) 84 85@script:python depends on report@ 86p1 << r.p1; 87p2 << r.p2; 88lock << r.lock; 89@@ 90 91msg = "second lock on line %s" % (p2[0].line) 92coccilib.report.print_report(p1[0],msg) 93