Find missing unlocks.  This semantic match considers the specific case
where the unlock is missing from an if branch, and there is a lock
before the if and an unlock after the if.  False positives are due to
cases where the if branch represents a case where the function is
supposed to exit with the lock held, or where there is some preceding
function call that releases the lock.

Signed-off-by: Nicolas Palix <[email protected]>
Signed-off-by: Julia Lawall <[email protected]>
---
 scripts/coccinelle/locks/mini_lock.cocci |   95 ++++++++++++++++++++++++++++++
 1 files changed, 95 insertions(+), 0 deletions(-)
 create mode 100644 scripts/coccinelle/locks/mini_lock.cocci

diff --git a/scripts/coccinelle/locks/mini_lock.cocci 
b/scripts/coccinelle/locks/mini_lock.cocci
new file mode 100644
index 0000000..7641a29
--- /dev/null
+++ b/scripts/coccinelle/locks/mini_lock.cocci
@@ -0,0 +1,95 @@
+/// Find missing unlocks.  This semantic match considers the specific case
+/// where the unlock is missing from an if branch, and there is a lock
+/// before the if and an unlock after the if.  False positives are due to
+/// cases where the if branch represents a case where the function is
+/// supposed to exit with the lock held, or where there is some preceding
+/// function call that releases the lock.
+///
+// Confidence: Moderate
+// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
+// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
+// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
+// URL: http://coccinelle.lip6.fr/
+// Comments:
+// Options: -no_includes -include_headers
+
+virtual org
+virtual report
+
+...@prelocked@
+position p1,p;
+expression E1;
+@@
+
+(
+mutex_l...@p1
+|
+mutex_tryl...@p1
+|
+spin_l...@p1
+|
+spin_tryl...@p1
+|
+read_l...@p1
+|
+read_tryl...@p1
+|
+write_l...@p1
+|
+write_tryl...@p1
+|
+read_lock_...@p1
+|
+write_lock_...@p1
+|
+read_lock_irqs...@p1
+|
+write_lock_irqs...@p1
+|
+spin_lock_...@p1
+|
+spin_lock_irqs...@p1
+) (e...@p,...);
+
+...@looped@
+position r;
+@@
+
+for(...;...;...) { <+... ret...@r ...; ...+> }
+
+...@err@
+expression E1;
+position prelocked.p;
+position up != prelocked.p1;
+position r!=looped.r;
+identifier lock,unlock;
+@@
+
+lock(e...@p,...);
+<+... when != E1
+if (...) {
+  ... when != E1
+  ret...@r ...;
+}
+...+>
+unl...@up(E1,...);
+
+...@script:python depends on org@
+p << prelocked.p1;
+lock << err.lock;
+unlock << err.unlock;
+p2 << err.r;
+@@
+
+cocci.print_main(lock,p)
+cocci.print_secs(unlock,p2)
+
+...@script:python depends on report@
+p << prelocked.p1;
+lock << err.lock;
+unlock << err.unlock;
+p2 << err.r;
+@@
+
+msg = "preceding lock on line %s" % (p[0].line)
+coccilib.report.print_report(p2[0],msg)
-- 
1.7.0.4

_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to