Commit 29a36d4dec6cf7ad72e6e3337bf954096cbbb4cf

Authored by Julia Lawall
Committed by Michal Marek
1 parent fb3f8af4ff

scripts/coccinelle: improve the coverage of some semantic patches

This patch ensures that all semantic patches in the scripts/coccinelle
directory provide the report option.  Report messages that include line
numbers now have the line number preceded by "line" for easier subsequent
processing.

Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: Michal Marek <mmarek@suse.cz>

Showing 11 changed files with 351 additions and 76 deletions Side-by-side Diff

scripts/coccinelle/api/kstrdup.cocci
1 1 /// Use kstrdup rather than duplicating its implementation
2 2 ///
3 3 // Confidence: High
4   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
5   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
6   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  4 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  5 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  6 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
7 7 // URL: http://coccinelle.lip6.fr/
8 8 // Comments:
9 9 // Options: -no_includes -include_headers
10 10  
11 11 virtual patch
  12 +virtual context
  13 +virtual org
  14 +virtual report
12 15  
13   -@@
  16 +@depends on patch@
14 17 expression from,to;
15 18 expression flag,E1,E2;
16 19 statement S;
... ... @@ -23,7 +26,7 @@
23 26 ... when != \(from = E2 \| to = E2 \)
24 27 - strcpy(to, from);
25 28  
26   -@@
  29 +@depends on patch@
27 30 expression x,from,to;
28 31 expression flag,E1,E2,E3;
29 32 statement S;
... ... @@ -37,4 +40,66 @@
37 40 if (to==NULL || ...) S
38 41 ... when != \(x = E3 \| from = E3 \| to = E3 \)
39 42 - memcpy(to, from, x);
  43 +
  44 +// ---------------------------------------------------------------------
  45 +
  46 +@r1 depends on !patch exists@
  47 +expression from,to;
  48 +expression flag,E1,E2;
  49 +statement S;
  50 +position p1,p2;
  51 +@@
  52 +
  53 +* to = kmalloc@p1(strlen(from) + 1,flag);
  54 + ... when != \(from = E1 \| to = E1 \)
  55 + if (to==NULL || ...) S
  56 + ... when != \(from = E2 \| to = E2 \)
  57 +* strcpy@p2(to, from);
  58 +
  59 +@r2 depends on !patch exists@
  60 +expression x,from,to;
  61 +expression flag,E1,E2,E3;
  62 +statement S;
  63 +position p1,p2;
  64 +@@
  65 +
  66 +* x = strlen(from) + 1;
  67 + ... when != \( x = E1 \| from = E1 \)
  68 +* to = \(kmalloc@p1\|kzalloc@p2\)(x,flag);
  69 + ... when != \(x = E2 \| from = E2 \| to = E2 \)
  70 + if (to==NULL || ...) S
  71 + ... when != \(x = E3 \| from = E3 \| to = E3 \)
  72 +* memcpy@p2(to, from, x);
  73 +
  74 +@script:python depends on org@
  75 +p1 << r1.p1;
  76 +p2 << r1.p2;
  77 +@@
  78 +
  79 +cocci.print_main("WARNING opportunity for kstrdep",p1)
  80 +cocci.print_secs("strcpy",p2)
  81 +
  82 +@script:python depends on org@
  83 +p1 << r2.p1;
  84 +p2 << r2.p2;
  85 +@@
  86 +
  87 +cocci.print_main("WARNING opportunity for kstrdep",p1)
  88 +cocci.print_secs("memcpy",p2)
  89 +
  90 +@script:python depends on report@
  91 +p1 << r1.p1;
  92 +p2 << r1.p2;
  93 +@@
  94 +
  95 +msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line)
  96 +coccilib.report.print_report(p1[0], msg)
  97 +
  98 +@script:python depends on report@
  99 +p1 << r2.p1;
  100 +p2 << r2.p2;
  101 +@@
  102 +
  103 +msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line)
  104 +coccilib.report.print_report(p1[0], msg)
scripts/coccinelle/api/memdup.cocci
1 1 /// Use kmemdup rather than duplicating its implementation
2 2 ///
3 3 // Confidence: High
4   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
5   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
6   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  4 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  5 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  6 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
7 7 // URL: http://coccinelle.lip6.fr/
8 8 // Comments:
9 9 // Options: -no_includes -include_headers
10 10  
11 11 virtual patch
  12 +virtual context
  13 +virtual org
  14 +virtual report
12 15  
13 16 @r1@
14 17 expression from,to;
... ... @@ -28,7 +31,7 @@
28 31 ... when != \( x = E1 \| from = E1 \)
29 32 to = \(kmalloc@p\|kzalloc@p\)(x,flag);
30 33  
31   -@@
  34 +@depends on patch@
32 35 expression from,to,size,flag;
33 36 position p != {r1.p,r2.p};
34 37 statement S;
... ... @@ -38,4 +41,27 @@
38 41 + to = kmemdup(from,size,flag);
39 42 if (to==NULL || ...) S
40 43 - memcpy(to, from, size);
  44 +
  45 +@r depends on !patch@
  46 +expression from,to,size,flag;
  47 +position p != {r1.p,r2.p};
  48 +statement S;
  49 +@@
  50 +
  51 +* to = \(kmalloc@p\|kzalloc@p\)(size,flag);
  52 + to = kmemdup(from,size,flag);
  53 + if (to==NULL || ...) S
  54 +* memcpy(to, from, size);
  55 +
  56 +@script:python depends on org@
  57 +p << r.p;
  58 +@@
  59 +
  60 +coccilib.org.print_todo(p[0], "WARNING opportunity for kmemdep")
  61 +
  62 +@script:python depends on report@
  63 +p << r.p;
  64 +@@
  65 +
  66 +coccilib.report.print_report(p[0], "WARNING opportunity for kmemdep")
scripts/coccinelle/api/memdup_user.cocci
1   -/// Use kmemdup_user rather than duplicating its implementation
  1 +/// Use memdup_user rather than duplicating its implementation
2 2 /// This is a little bit restricted to reduce false positives
3 3 ///
4 4 // Confidence: High
5   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
6   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
7   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  5 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  6 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  7 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
8 8 // URL: http://coccinelle.lip6.fr/
9 9 // Comments:
10 10 // Options: -no_includes -include_headers
11 11  
12 12 virtual patch
  13 +virtual context
  14 +virtual org
  15 +virtual report
13 16  
14   -@@
  17 +@depends on patch@
15 18 expression from,to,size,flag;
16   -position p;
17 19 identifier l1,l2;
18 20 @@
19 21  
20   -- to = \(kmalloc@p\|kzalloc@p\)(size,flag);
  22 +- to = \(kmalloc\|kzalloc\)(size,flag);
21 23 + to = memdup_user(from,size);
22 24 if (
23 25 - to==NULL
... ... @@ -33,4 +35,27 @@
33 35 - -EFAULT
34 36 - ...+>
35 37 - }
  38 +
  39 +@r depends on !patch@
  40 +expression from,to,size,flag;
  41 +position p;
  42 +statement S1,S2;
  43 +@@
  44 +
  45 +* to = \(kmalloc@p\|kzalloc@p\)(size,flag);
  46 + if (to==NULL || ...) S1
  47 + if (copy_from_user(to, from, size) != 0)
  48 + S2
  49 +
  50 +@script:python depends on org@
  51 +p << r.p;
  52 +@@
  53 +
  54 +coccilib.org.print_todo(p[0], "WARNING opportunity for memdep_user")
  55 +
  56 +@script:python depends on report@
  57 +p << r.p;
  58 +@@
  59 +
  60 +coccilib.report.print_report(p[0], "WARNING opportunity for memdep_user")
scripts/coccinelle/free/kfree.cocci
... ... @@ -5,9 +5,9 @@
5 5 //# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
6 6 ///
7 7 // Confidence: Moderate
8   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
9   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
10   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  8 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  9 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  10 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
11 11 // URL: http://coccinelle.lip6.fr/
12 12 // Comments:
13 13 // Options: -no_includes -include_headers
... ... @@ -23,7 +23,7 @@
23 23 kfree@p1(E)
24 24  
25 25 @print expression@
26   -constant char *c;
  26 +constant char [] c;
27 27 expression free.E,E2;
28 28 type T;
29 29 position p;
... ... @@ -37,6 +37,10 @@
37 37 |
38 38 E@p != E2
39 39 |
  40 + E2 == E@p
  41 +|
  42 + E2 != E@p
  43 +|
40 44 !E@p
41 45 |
42 46 E@p || ...
... ... @@ -113,6 +117,6 @@
113 117 p2 << r.p2;
114 118 @@
115 119  
116   -msg = "reference preceded by free on line %s" % (p1[0].line)
  120 +msg = "ERROR: reference preceded by free on line %s" % (p1[0].line)
117 121 coccilib.report.print_report(p2[0],msg)
scripts/coccinelle/iterators/fen.cocci
... ... @@ -2,16 +2,19 @@
2 2 /// is no point to call of_node_put on the final value.
3 3 ///
4 4 // Confidence: High
5   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
6   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
7   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  5 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  6 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  7 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
8 8 // URL: http://coccinelle.lip6.fr/
9 9 // Comments:
10 10 // Options: -no_includes -include_headers
11 11  
12 12 virtual patch
  13 +virtual context
  14 +virtual org
  15 +virtual report
13 16  
14   -@@
  17 +@depends on patch@
15 18 iterator name for_each_node_by_name;
16 19 expression np,E;
17 20 identifier l;
... ... @@ -24,7 +27,7 @@
24 27 ... when != np = E
25 28 - of_node_put(np);
26 29  
27   -@@
  30 +@depends on patch@
28 31 iterator name for_each_node_by_type;
29 32 expression np,E;
30 33 identifier l;
... ... @@ -37,7 +40,7 @@
37 40 ... when != np = E
38 41 - of_node_put(np);
39 42  
40   -@@
  43 +@depends on patch@
41 44 iterator name for_each_compatible_node;
42 45 expression np,E;
43 46 identifier l;
... ... @@ -50,7 +53,7 @@
50 53 ... when != np = E
51 54 - of_node_put(np);
52 55  
53   -@@
  56 +@depends on patch@
54 57 iterator name for_each_matching_node;
55 58 expression np,E;
56 59 identifier l;
... ... @@ -62,4 +65,60 @@
62 65 }
63 66 ... when != np = E
64 67 - of_node_put(np);
  68 +
  69 +// ----------------------------------------------------------------------
  70 +
  71 +@r depends on !patch forall@
  72 +//iterator name for_each_node_by_name;
  73 +//iterator name for_each_node_by_type;
  74 +//iterator name for_each_compatible_node;
  75 +//iterator name for_each_matching_node;
  76 +expression np,E;
  77 +identifier l;
  78 +position p1,p2;
  79 +@@
  80 +
  81 +(
  82 +*for_each_node_by_name@p1(np,...)
  83 +{
  84 + ... when != break;
  85 + when != goto l;
  86 +}
  87 +|
  88 +*for_each_node_by_type@p1(np,...)
  89 +{
  90 + ... when != break;
  91 + when != goto l;
  92 +}
  93 +|
  94 +*for_each_compatible_node@p1(np,...)
  95 +{
  96 + ... when != break;
  97 + when != goto l;
  98 +}
  99 +|
  100 +*for_each_matching_node@p1(np,...)
  101 +{
  102 + ... when != break;
  103 + when != goto l;
  104 +}
  105 +)
  106 +... when != np = E
  107 +* of_node_put@p2(np);
  108 +
  109 +@script:python depends on org@
  110 +p1 << r.p1;
  111 +p2 << r.p2;
  112 +@@
  113 +
  114 +cocci.print_main("unneeded of_node_put",p2)
  115 +cocci.print_secs("iterator",p1)
  116 +
  117 +@script:python depends on report@
  118 +p1 << r.p1;
  119 +p2 << r.p2;
  120 +@@
  121 +
  122 +msg = "ERROR: of_node_put not needed after iterator on line %s" % (p1[0].line)
  123 +coccilib.report.print_report(p2[0], msg)
scripts/coccinelle/iterators/itnull.cocci
1 1 /// Many iterators have the property that the first argument is always bound
2   -/// to a real list element, never NULL. False positives arise for some
3   -/// iterators that do not have this property, or in cases when the loop
4   -/// cursor is reassigned. The latter should only happen when the matched
5   -/// code is on the way to a loop exit (break, goto, or return).
  2 +/// to a real list element, never NULL.
  3 +//# False positives arise for some iterators that do not have this property,
  4 +//# or in cases when the loop cursor is reassigned. The latter should only
  5 +//# happen when the matched code is on the way to a loop exit (break, goto,
  6 +//# or return).
6 7 ///
7 8 // Confidence: Moderate
8   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
9   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
10   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  9 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  10 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  11 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
11 12 // URL: http://coccinelle.lip6.fr/
12 13 // Comments:
13 14 // Options: -no_includes -include_headers
14 15  
15 16 virtual patch
  17 +virtual context
  18 +virtual org
  19 +virtual report
16 20  
17   -@@
  21 +@depends on patch@
18 22 iterator I;
19 23 expression x,E,E1,E2;
20 24 statement S,S1,S2;
... ... @@ -56,4 +60,36 @@
56 60 + )
57 61 )
58 62 ...> }
  63 +
  64 +@r depends on !patch exists@
  65 +iterator I;
  66 +expression x,E;
  67 +position p1,p2;
  68 +@@
  69 +
  70 +*I@p1(x,...)
  71 +{ ... when != x = E
  72 +(
  73 +* x@p2 == NULL
  74 +|
  75 +* x@p2 != NULL
  76 +)
  77 + ... when any
  78 +}
  79 +
  80 +@script:python depends on org@
  81 +p1 << r.p1;
  82 +p2 << r.p2;
  83 +@@
  84 +
  85 +cocci.print_main("iterator-bound variable",p1)
  86 +cocci.print_secs("useless NULL test",p2)
  87 +
  88 +@script:python depends on report@
  89 +p1 << r.p1;
  90 +p2 << r.p2;
  91 +@@
  92 +
  93 +msg = "ERROR: iterator variable bound on line %s cannot be NULL" % (p1[0].line)
  94 +coccilib.report.print_report(p2[0], msg)
scripts/coccinelle/locks/call_kern.cocci
1 1 /// Find functions that refer to GFP_KERNEL but are called with locks held.
2   -/// The proposed change of converting the GFP_KERNEL is not necessarily the
3   -/// correct one. It may be desired to unlock the lock, or to not call the
4   -/// function under the lock in the first place.
  2 +//# The proposed change of converting the GFP_KERNEL is not necessarily the
  3 +//# correct one. It may be desired to unlock the lock, or to not call the
  4 +//# function under the lock in the first place.
5 5 ///
6 6 // Confidence: Moderate
7   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
8   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
9   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  7 +// Copyright: (C) 2012 Nicolas Palix. GPLv2.
  8 +// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2.
  9 +// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2.
10 10 // URL: http://coccinelle.lip6.fr/
11 11 // Comments:
12 12 // Options: -no_includes -include_headers
13 13  
14 14 virtual patch
  15 +virtual context
  16 +virtual org
  17 +virtual report
15 18  
16 19 @gfp exists@
17 20 identifier fn;
18 21  
19 22  
20 23  
21 24  
22 25  
23 26  
24 27  
25 28  
26 29  
27 30  
... ... @@ -32,28 +35,29 @@
32 35 ... when any
33 36 }
34 37  
35   -@locked@
  38 +@locked exists@
36 39 identifier gfp.fn;
  40 +position p1,p2;
37 41 @@
38 42  
39 43 (
40   -read_lock_irq
  44 +read_lock_irq@p1
41 45 |
42   -write_lock_irq
  46 +write_lock_irq@p1
43 47 |
44   -read_lock_irqsave
  48 +read_lock_irqsave@p1
45 49 |
46   -write_lock_irqsave
  50 +write_lock_irqsave@p1
47 51 |
48   -spin_lock
  52 +spin_lock@p1
49 53 |
50   -spin_trylock
  54 +spin_trylock@p1
51 55 |
52   -spin_lock_irq
  56 +spin_lock_irq@p1
53 57 |
54   -spin_lock_irqsave
  58 +spin_lock_irqsave@p1
55 59 |
56   -local_irq_disable
  60 +local_irq_disable@p1
57 61 )
58 62 (...)
59 63 ... when != read_unlock_irq(...)
60 64  
61 65  
... ... @@ -64,12 +68,39 @@
64 68 when != spin_unlock_irq(...)
65 69 when != spin_unlock_irqrestore(...)
66 70 when != local_irq_enable(...)
67   -fn(...)
  71 +fn@p2(...)
68 72  
69   -@depends on locked@
  73 +@depends on locked && patch@
70 74 position gfp.p;
71 75 @@
72 76  
73 77 - GFP_KERNEL@p
74 78 + GFP_ATOMIC
  79 +
  80 +@depends on locked && !patch@
  81 +position gfp.p;
  82 +@@
  83 +
  84 +* GFP_KERNEL@p
  85 +
  86 +@script:python depends on !patch && org@
  87 +p << gfp.p;
  88 +fn << gfp.fn;
  89 +p1 << locked.p1;
  90 +p2 << locked.p2;
  91 +@@
  92 +
  93 +cocci.print_main("lock",p1)
  94 +cocci.print_secs("call",p2)
  95 +cocci.print_secs("GFP_KERNEL",p)
  96 +
  97 +@script:python depends on !patch && report@
  98 +p << gfp.p;
  99 +fn << gfp.fn;
  100 +p1 << locked.p1;
  101 +p2 << locked.p2;
  102 +@@
  103 +
  104 +msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line)
  105 +coccilib.report.print_report(p[0], msg)
scripts/coccinelle/locks/flags.cocci
1 1 /// Find nested lock+irqsave functions that use the same flags variables
2 2 ///
3 3 // Confidence: High
4   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
5   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
6   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  4 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  5 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  6 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
7 7 // URL: http://coccinelle.lip6.fr/
8 8 // Comments:
9 9 // Options: -no_includes -include_headers
... ... @@ -12,7 +12,7 @@
12 12 virtual org
13 13 virtual report
14 14  
15   -@r@
  15 +@r exists@
16 16 expression lock1,lock2,flags;
17 17 position p1,p2;
18 18 @@
... ... @@ -39,7 +39,7 @@
39 39 write_lock_irqsave@p2(lock2,flags)
40 40 )
41 41  
42   -@d@
  42 +@d exists@
43 43 expression f <= r.flags;
44 44 expression lock1,lock2,flags;
45 45 position r.p1, r.p2;
... ... @@ -76,6 +76,6 @@
76 76 p2 << r.p2;
77 77 @@
78 78  
79   -msg="ERROR: nested lock+irqsave that reuses flags from %s." % (p1[0].line)
  79 +msg="ERROR: nested lock+irqsave that reuses flags from line %s." % (p1[0].line)
80 80 coccilib.report.print_report(p2[0], msg)
scripts/coccinelle/locks/mini_lock.cocci
... ... @@ -6,13 +6,14 @@
6 6 /// function call that releases the lock.
7 7 ///
8 8 // Confidence: Moderate
9   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
10   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
11   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  9 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  10 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  11 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
12 12 // URL: http://coccinelle.lip6.fr/
13 13 // Comments:
14 14 // Options: -no_includes -include_headers
15 15  
  16 +virtual context
16 17 virtual org
17 18 virtual report
18 19  
... ... @@ -57,7 +58,7 @@
57 58  
58 59 for(...;...;...) { <+... return@r ...; ...+> }
59 60  
60   -@err@
  61 +@err exists@
61 62 expression E1;
62 63 position prelocked.p;
63 64 position up != prelocked.p1;
64 65  
65 66  
... ... @@ -65,14 +66,14 @@
65 66 identifier lock,unlock;
66 67 @@
67 68  
68   -lock(E1@p,...);
  69 +*lock(E1@p,...);
69 70 <+... when != E1
70 71 if (...) {
71 72 ... when != E1
72   - return@r ...;
  73 +* return@r ...;
73 74 }
74 75 ...+>
75   -unlock@up(E1,...);
  76 +*unlock@up(E1,...);
76 77  
77 78 @script:python depends on org@
78 79 p << prelocked.p1;
scripts/coccinelle/misc/doubleinit.cocci
... ... @@ -3,9 +3,9 @@
3 3 /// initialization.
4 4 ///
5 5 // Confidence: Low
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.
  6 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  7 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  8 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
9 9 // URL: http://coccinelle.lip6.fr/
10 10 // Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
11 11 // Options: -no_includes -include_headers
... ... @@ -49,6 +49,6 @@
49 49 @@
50 50  
51 51 if int(ps[0].line) < int(pr[0].line) or (int(ps[0].line) == int(pr[0].line) and int(ps[0].column) < int(pr[0].column)):
52   - msg = "%s: first occurrence %s, second occurrence %s" % (fld,ps[0].line,pr[0].line)
  52 + msg = "%s: first occurrence line %s, second occurrence line %s" % (fld,ps[0].line,pr[0].line)
53 53 coccilib.report.print_report(p0[0],msg)
scripts/coccinelle/null/eno.cocci
1 1 /// The various basic memory allocation functions don't return ERR_PTR
2 2 ///
3 3 // Confidence: High
4   -// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
5   -// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
6   -// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
  4 +// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2.
  5 +// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2.
  6 +// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2.
7 7 // URL: http://coccinelle.lip6.fr/
8 8 // Comments:
9 9 // Options: -no_includes -include_headers
10 10  
11 11 virtual patch
  12 +virtual context
  13 +virtual org
  14 +virtual report
12 15  
13   -@@
  16 +@depends on patch@
14 17 expression x,E;
15 18 @@
16 19  
... ... @@ -18,4 +21,29 @@
18 21 ... when != x = E
19 22 - IS_ERR(x)
20 23 + !x
  24 +
  25 +@r depends on !patch exists@
  26 +expression x,E;
  27 +position p1,p2;
  28 +@@
  29 +
  30 +*x = \(kmalloc@p1\|kzalloc@p1\|kcalloc@p1\|kmem_cache_alloc@p1\|kmem_cache_zalloc@p1\|kmem_cache_alloc_node@p1\|kmalloc_node@p1\|kzalloc_node@p1\)(...)
  31 +... when != x = E
  32 +* IS_ERR@p2(x)
  33 +
  34 +@script:python depends on org@
  35 +p1 << r.p1;
  36 +p2 << r.p2;
  37 +@@
  38 +
  39 +cocci.print_main("alloc call",p1)
  40 +cocci.print_secs("IS_ERR that should be NULL tests",p2)
  41 +
  42 +@script:python depends on report@
  43 +p1 << r.p1;
  44 +p2 << r.p2;
  45 +@@
  46 +
  47 +msg = "ERROR: allocation function on line %s returns NULL not ERR_PTR on failure" % (p1[0].line)
  48 +coccilib.report.print_report(p2[0], msg)