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)
