Blame view

scripts/coccinelle/locks/mini_lock.cocci 1.7 KB
54c056280   Nicolas Palix   Coccinelle: Add l...
1
2
3
4
5
6
7
8
  /// 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
29a36d4de   Julia Lawall   scripts/coccinell...
9
10
11
  // Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
  // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
54c056280   Nicolas Palix   Coccinelle: Add l...
12
13
14
  // URL: http://coccinelle.lip6.fr/
  // Comments:
  // Options: -no_includes -include_headers
29a36d4de   Julia Lawall   scripts/coccinell...
15
  virtual context
54c056280   Nicolas Palix   Coccinelle: Add l...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  virtual org
  virtual report
  
  @prelocked@
  position p1,p;
  expression E1;
  @@
  
  (
  mutex_lock@p1
  |
  mutex_trylock@p1
  |
  spin_lock@p1
  |
  spin_trylock@p1
  |
  read_lock@p1
  |
  read_trylock@p1
  |
  write_lock@p1
  |
  write_trylock@p1
  |
  read_lock_irq@p1
  |
  write_lock_irq@p1
  |
  read_lock_irqsave@p1
  |
  write_lock_irqsave@p1
  |
  spin_lock_irq@p1
  |
  spin_lock_irqsave@p1
  ) (E1@p,...);
  
  @looped@
  position r;
  @@
  
  for(...;...;...) { <+... return@r ...; ...+> }
29a36d4de   Julia Lawall   scripts/coccinell...
59
  @err exists@
54c056280   Nicolas Palix   Coccinelle: Add l...
60
61
62
63
64
65
  expression E1;
  position prelocked.p;
  position up != prelocked.p1;
  position r!=looped.r;
  identifier lock,unlock;
  @@
29a36d4de   Julia Lawall   scripts/coccinell...
66
  *lock(E1@p,...);
54c056280   Nicolas Palix   Coccinelle: Add l...
67
68
69
  <+... when != E1
  if (...) {
    ... when != E1
29a36d4de   Julia Lawall   scripts/coccinell...
70
  *  return@r ...;
54c056280   Nicolas Palix   Coccinelle: Add l...
71
72
  }
  ...+>
29a36d4de   Julia Lawall   scripts/coccinell...
73
  *unlock@up(E1,...);
54c056280   Nicolas Palix   Coccinelle: Add l...
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  
  @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)