History

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.

Julia Lawall committed 14 years ago

Commit 29a36d41 parent fb3f8af11 files · +351 −76Browse files

Showing the changes to scripts (11 of 11 files). Show all

Unified · Split

11 files
  1. scripts/coccinelle/api/kstrdup.cocci +70 −5
  2. scripts/coccinelle/api/memdup.cocci +30 −4
  3. scripts/coccinelle/api/memdup_user.cocci +32 −7
  4. scripts/coccinelle/free/kfree.cocci +9 −5
  5. scripts/coccinelle/iterators/fen.cocci +66 −7
  6. scripts/coccinelle/iterators/itnull.cocci +45 −9
  7. scripts/coccinelle/locks/call_kern.cocci +49 −18
  8. scripts/coccinelle/locks/flags.cocci +6 −6
  9. scripts/coccinelle/locks/mini_lock.cocci +8 −7
  10. scripts/coccinelle/misc/doubleinit.cocci +4 −4
  11. scripts/coccinelle/null/eno.cocci +32 −4
scripts/coccinelle/api/kstrdup.cocci+70−5
@@ -1,16 +1,19 @@
11 /// Use kstrdup rather than duplicating its implementation
22 ///
33 // 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.
77 // URL: http://coccinelle.lip6.fr/
88 // Comments:
99 // Options: -no_includes -include_headers
1010
1111 virtual patch
12+virtual context
13+virtual org
14+virtual report
1215
13−@@
16+@depends on patch@
1417 expression from,to;
1518 expression flag,E1,E2;
1619 statement S;
@@ -23,7 +26,7 @@ statement S; · 6 unmodified lines
2326 ... when != \(from = E2 \| to = E2 \)
2427 - strcpy(to, from);
2528
26−@@
29+@depends on patch@
2730 expression x,from,to;
2831 expression flag,E1,E2,E3;
2932 statement S;
@@ -37,3 +40,65 @@ statement S; · 7 unmodified lines
3740 if (to==NULL || ...) S
3841 ... when != \(x = E3 \| from = E3 \| to = E3 \)
3942 - 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+30−4
@@ -1,14 +1,17 @@
11 /// Use kmemdup rather than duplicating its implementation
22 ///
33 // 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.
77 // URL: http://coccinelle.lip6.fr/
88 // Comments:
99 // Options: -no_includes -include_headers
1010
1111 virtual patch
12+virtual context
13+virtual org
14+virtual report
1215
1316 @r1@
1417 expression from,to;
@@ -28,7 +31,7 @@ position p; · 13 unmodified lines
2831 ... when != \( x = E1 \| from = E1 \)
2932 to = \(kmalloc@p\|kzalloc@p\)(x,flag);
3033
31−@@
34+@depends on patch@
3235 expression from,to,size,flag;
3336 position p != {r1.p,r2.p};
3437 statement S;
@@ -38,3 +41,26 @@ statement S; · 3 unmodified lines
3841 + to = kmemdup(from,size,flag);
3942 if (to==NULL || ...) S
4043 - 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+32−7
@@ -1,23 +1,25 @@
1−/// Use kmemdup_user rather than duplicating its implementation
1+/// Use memdup_user rather than duplicating its implementation
22 /// This is a little bit restricted to reduce false positives
33 ///
44 // 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.
88 // URL: http://coccinelle.lip6.fr/
99 // Comments:
1010 // Options: -no_includes -include_headers
1111
1212 virtual patch
13+virtual context
14+virtual org
15+virtual report
1316
14−@@
17+@depends on patch@
1518 expression from,to,size,flag;
16−position p;
1719 identifier l1,l2;
1820 @@
1921
20−- to = \(kmalloc@p\|kzalloc@p\)(size,flag);
22+- to = \(kmalloc\|kzalloc\)(size,flag);
2123 + to = memdup_user(from,size);
2224 if (
2325 - to==NULL
@@ -33,3 +35,26 @@ identifier l1,l2; · 9 unmodified lines
3335 - -EFAULT
3436 - ...+>
3537 - }
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+9−5
@@ -5,9 +5,9 @@ · 4 unmodified lines
55 //# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
66 ///
77 // 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.
1111 // URL: http://coccinelle.lip6.fr/
1212 // Comments:
1313 // Options: -no_includes -include_headers
@@ -23,7 +23,7 @@ position p1; · 9 unmodified lines
2323 kfree@p1(E)
2424
2525 @print expression@
26−constant char *c;
26+constant char [] c;
2727 expression free.E,E2;
2828 type T;
2929 position p;
@@ -36,6 +36,10 @@ identifier f; · 6 unmodified lines
3636 E@p == E2
3737 |
3838 E@p != E2
39+|
40+ E2 == E@p
41+|
42+ E2 != E@p
3943 |
4044 !E@p
4145 |
@@ -113,5 +117,5 @@ p1 << free.p1; · 71 unmodified lines
113117 p2 << r.p2;
114118 @@
115119
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)
117121 coccilib.report.print_report(p2[0],msg)
scripts/coccinelle/iterators/fen.cocci+66−7
@@ -2,16 +2,19 @@ · 1 unmodified line
22 /// is no point to call of_node_put on the final value.
33 ///
44 // 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.
88 // URL: http://coccinelle.lip6.fr/
99 // Comments:
1010 // Options: -no_includes -include_headers
1111
1212 virtual patch
13+virtual context
14+virtual org
15+virtual report
1316
14−@@
17+@depends on patch@
1518 iterator name for_each_node_by_name;
1619 expression np,E;
1720 identifier l;
@@ -24,7 +27,7 @@ for_each_node_by_name(np,...) { · 6 unmodified lines
2427 ... when != np = E
2528 - of_node_put(np);
2629
27−@@
30+@depends on patch@
2831 iterator name for_each_node_by_type;
2932 expression np,E;
3033 identifier l;
@@ -37,7 +40,7 @@ for_each_node_by_type(np,...) { · 6 unmodified lines
3740 ... when != np = E
3841 - of_node_put(np);
3942
40−@@
43+@depends on patch@
4144 iterator name for_each_compatible_node;
4245 expression np,E;
4346 identifier l;
@@ -50,7 +53,7 @@ for_each_compatible_node(np,...) { · 6 unmodified lines
5053 ... when != np = E
5154 - of_node_put(np);
5255
53−@@
56+@depends on patch@
5457 iterator name for_each_matching_node;
5558 expression np,E;
5659 identifier l;
@@ -62,3 +65,59 @@ for_each_matching_node(np,...) { · 5 unmodified lines
6265 }
6366 ... when != np = E
6467 - 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+45−9
@@ -1,20 +1,24 @@
11 /// 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).
67 ///
78 // 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.
1112 // URL: http://coccinelle.lip6.fr/
1213 // Comments:
1314 // Options: -no_includes -include_headers
1415
1516 virtual patch
17+virtual context
18+virtual org
19+virtual report
1620
17−@@
21+@depends on patch@
1822 iterator I;
1923 expression x,E,E1,E2;
2024 statement S,S1,S2;
@@ -55,4 +59,36 @@ I(x,...) { <... · 34 unmodified lines
5559 x != NULL
5660 + )
5761 )
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+49−18
@@ -1,17 +1,20 @@
11 /// 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.
55 ///
66 // 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.
1010 // URL: http://coccinelle.lip6.fr/
1111 // Comments:
1212 // Options: -no_includes -include_headers
1313
1414 virtual patch
15+virtual context
16+virtual org
17+virtual report
1518
1619 @gfp exists@
1720 identifier fn;
@@ -32,28 +35,29 @@ fn(...) { · 14 unmodified lines
3235 ... when any
3336 }
3437
35−@locked@
38+@locked exists@
3639 identifier gfp.fn;
40+position p1,p2;
3741 @@
3842
3943 (
40−read_lock_irq
44+read_lock_irq@p1
4145 |
42−write_lock_irq
46+write_lock_irq@p1
4347 |
44−read_lock_irqsave
48+read_lock_irqsave@p1
4549 |
46−write_lock_irqsave
50+write_lock_irqsave@p1
4751 |
48−spin_lock
52+spin_lock@p1
4953 |
50−spin_trylock
54+spin_trylock@p1
5155 |
52−spin_lock_irq
56+spin_lock_irq@p1
5357 |
54−spin_lock_irqsave
58+spin_lock_irqsave@p1
5559 |
56−local_irq_disable
60+local_irq_disable@p1
5761 )
5862 (...)
5963 ... when != read_unlock_irq(...)
@@ -64,11 +68,38 @@ local_irq_disable · 4 unmodified lines
6468 when != spin_unlock_irq(...)
6569 when != spin_unlock_irqrestore(...)
6670 when != local_irq_enable(...)
67−fn(...)
71+fn@p2(...)
6872
69−@depends on locked@
73+@depends on locked && patch@
7074 position gfp.p;
7175 @@
7276
7377 - GFP_KERNEL@p
7478 + 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+6−6
@@ -1,9 +1,9 @@
11 /// Find nested lock+irqsave functions that use the same flags variables
22 ///
33 // 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.
77 // URL: http://coccinelle.lip6.fr/
88 // Comments:
99 // Options: -no_includes -include_headers
@@ -12,7 +12,7 @@ virtual context · 2 unmodified lines
1212 virtual org
1313 virtual report
1414
15−@r@
15+@r exists@
1616 expression lock1,lock2,flags;
1717 position p1,p2;
1818 @@
@@ -39,7 +39,7 @@ read_lock_irqsave@p2(lock2,flags) · 20 unmodified lines
3939 write_lock_irqsave@p2(lock2,flags)
4040 )
4141
42−@d@
42+@d exists@
4343 expression f <= r.flags;
4444 expression lock1,lock2,flags;
4545 position r.p1, r.p2;
@@ -76,5 +76,5 @@ p1 << r.p1; · 30 unmodified lines
7676 p2 << r.p2;
7777 @@
7878
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)
8080 coccilib.report.print_report(p2[0], msg)
scripts/coccinelle/locks/mini_lock.cocci+8−7
@@ -6,13 +6,14 @@ · 5 unmodified lines
66 /// function call that releases the lock.
77 ///
88 // 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.
1212 // URL: http://coccinelle.lip6.fr/
1313 // Comments:
1414 // Options: -no_includes -include_headers
1515
16+virtual context
1617 virtual org
1718 virtual report
1819
@@ -57,7 +58,7 @@ position r; · 38 unmodified lines
5758
5859 for(...;...;...) { <+... return@r ...; ...+> }
5960
60−@err@
61+@err exists@
6162 expression E1;
6263 position prelocked.p;
6364 position up != prelocked.p1;
@@ -65,14 +66,14 @@ position r!=looped.r; · 1 unmodified line
6566 identifier lock,unlock;
6667 @@
6768
68−lock(E1@p,...);
69+*lock(E1@p,...);
6970 <+... when != E1
7071 if (...) {
7172 ... when != E1
72− return@r ...;
73+* return@r ...;
7374 }
7475 ...+>
75−unlock@up(E1,...);
76+*unlock@up(E1,...);
7677
7778 @script:python depends on org@
7879 p << prelocked.p1;
scripts/coccinelle/misc/doubleinit.cocci+4−4
@@ -3,9 +3,9 @@ · 2 unmodified lines
33 /// initialization.
44 ///
55 // 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.
99 // URL: http://coccinelle.lip6.fr/
1010 // Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
1111 // Options: -no_includes -include_headers
@@ -49,5 +49,5 @@ pr << r.p; · 37 unmodified lines
4949 @@
5050
5151 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)
5353 coccilib.report.print_report(p0[0],msg)
scripts/coccinelle/null/eno.cocci+32−4
@@ -1,16 +1,19 @@
11 /// The various basic memory allocation functions don't return ERR_PTR
22 ///
33 // 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.
77 // URL: http://coccinelle.lip6.fr/
88 // Comments:
99 // Options: -no_includes -include_headers
1010
1111 virtual patch
12+virtual context
13+virtual org
14+virtual report
1215
13−@@
16+@depends on patch@
1417 expression x,E;
1518 @@
1619
@@ -18,3 +21,28 @@ x = \(kmalloc\|kzalloc\|kcalloc\|kmem_cache_alloc\|kmem_cache_zalloc\|kmem_cache · 1 unmodified line
1821 ... when != x = E
1922 - IS_ERR(x)
2023 + !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)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t