Skip to content

Commit

Permalink
scripts/coccinelle: improve the coverage of some semantic patches
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Julia Lawall authored and Michal Marek committed Jan 14, 2012
1 parent fb3f8af commit 29a36d4
Show file tree
Hide file tree
Showing 11 changed files with 351 additions and 76 deletions.
75 changes: 70 additions & 5 deletions scripts/coccinelle/api/kstrdup.cocci
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
/// Use kstrdup rather than duplicating its implementation
///
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
// 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.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual patch
virtual context
virtual org
virtual report

@@
@depends on patch@
expression from,to;
expression flag,E1,E2;
statement S;
Expand All @@ -23,7 +26,7 @@ statement S;
... when != \(from = E2 \| to = E2 \)
- strcpy(to, from);

@@
@depends on patch@
expression x,from,to;
expression flag,E1,E2,E3;
statement S;
Expand All @@ -37,3 +40,65 @@ statement S;
if (to==NULL || ...) S
... when != \(x = E3 \| from = E3 \| to = E3 \)
- memcpy(to, from, x);

// ---------------------------------------------------------------------

@r1 depends on !patch exists@
expression from,to;
expression flag,E1,E2;
statement S;
position p1,p2;
@@

* to = kmalloc@p1(strlen(from) + 1,flag);
... when != \(from = E1 \| to = E1 \)
if (to==NULL || ...) S
... when != \(from = E2 \| to = E2 \)
* strcpy@p2(to, from);

@r2 depends on !patch exists@
expression x,from,to;
expression flag,E1,E2,E3;
statement S;
position p1,p2;
@@

* x = strlen(from) + 1;
... when != \( x = E1 \| from = E1 \)
* to = \(kmalloc@p1\|kzalloc@p2\)(x,flag);
... when != \(x = E2 \| from = E2 \| to = E2 \)
if (to==NULL || ...) S
... when != \(x = E3 \| from = E3 \| to = E3 \)
* memcpy@p2(to, from, x);

@script:python depends on org@
p1 << r1.p1;
p2 << r1.p2;
@@
cocci.print_main("WARNING opportunity for kstrdep",p1)
cocci.print_secs("strcpy",p2)
@script:python depends on org@
p1 << r2.p1;
p2 << r2.p2;
@@
cocci.print_main("WARNING opportunity for kstrdep",p1)
cocci.print_secs("memcpy",p2)
@script:python depends on report@
p1 << r1.p1;
p2 << r1.p2;
@@
msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line)
coccilib.report.print_report(p1[0], msg)
@script:python depends on report@
p1 << r2.p1;
p2 << r2.p2;
@@
msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line)
coccilib.report.print_report(p1[0], msg)
34 changes: 30 additions & 4 deletions scripts/coccinelle/api/memdup.cocci
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
/// Use kmemdup rather than duplicating its implementation
///
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
// 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.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual patch
virtual context
virtual org
virtual report

@r1@
expression from,to;
Expand All @@ -28,7 +31,7 @@ position p;
... when != \( x = E1 \| from = E1 \)
to = \(kmalloc@p\|kzalloc@p\)(x,flag);

@@
@depends on patch@
expression from,to,size,flag;
position p != {r1.p,r2.p};
statement S;
Expand All @@ -38,3 +41,26 @@ statement S;
+ to = kmemdup(from,size,flag);
if (to==NULL || ...) S
- memcpy(to, from, size);

@r depends on !patch@
expression from,to,size,flag;
position p != {r1.p,r2.p};
statement S;
@@

* to = \(kmalloc@p\|kzalloc@p\)(size,flag);
to = kmemdup(from,size,flag);
if (to==NULL || ...) S
* memcpy(to, from, size);

@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING opportunity for kmemdep")
@script:python depends on report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING opportunity for kmemdep")
39 changes: 32 additions & 7 deletions scripts/coccinelle/api/memdup_user.cocci
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
/// Use kmemdup_user rather than duplicating its implementation
/// Use memdup_user rather than duplicating its implementation
/// This is a little bit restricted to reduce false positives
///
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
// 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.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual patch
virtual context
virtual org
virtual report

@@
@depends on patch@
expression from,to,size,flag;
position p;
identifier l1,l2;
@@

- to = \(kmalloc@p\|kzalloc@p\)(size,flag);
- to = \(kmalloc\|kzalloc\)(size,flag);
+ to = memdup_user(from,size);
if (
- to==NULL
Expand All @@ -33,3 +35,26 @@ identifier l1,l2;
- -EFAULT
- ...+>
- }

@r depends on !patch@
expression from,to,size,flag;
position p;
statement S1,S2;
@@

* to = \(kmalloc@p\|kzalloc@p\)(size,flag);
if (to==NULL || ...) S1
if (copy_from_user(to, from, size) != 0)
S2

@script:python depends on org@
p << r.p;
@@
coccilib.org.print_todo(p[0], "WARNING opportunity for memdep_user")
@script:python depends on report@
p << r.p;
@@
coccilib.report.print_report(p[0], "WARNING opportunity for memdep_user")
14 changes: 9 additions & 5 deletions scripts/coccinelle/free/kfree.cocci
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
///
// Confidence: Moderate
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
// 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.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers
Expand All @@ -23,7 +23,7 @@ position p1;
kfree@p1(E)

@print expression@
constant char *c;
constant char [] c;
expression free.E,E2;
type T;
position p;
Expand All @@ -36,6 +36,10 @@ identifier f;
E@p == E2
|
E@p != E2
|
E2 == E@p
|
E2 != E@p
|
!E@p
|
Expand Down Expand Up @@ -113,5 +117,5 @@ p1 << free.p1;
p2 << r.p2;
@@
msg = "reference preceded by free on line %s" % (p1[0].line)
msg = "ERROR: reference preceded by free on line %s" % (p1[0].line)
coccilib.report.print_report(p2[0],msg)
73 changes: 66 additions & 7 deletions scripts/coccinelle/iterators/fen.cocci
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@
/// is no point to call of_node_put on the final value.
///
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
// 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.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual patch
virtual context
virtual org
virtual report

@@
@depends on patch@
iterator name for_each_node_by_name;
expression np,E;
identifier l;
Expand All @@ -24,7 +27,7 @@ for_each_node_by_name(np,...) {
... when != np = E
- of_node_put(np);

@@
@depends on patch@
iterator name for_each_node_by_type;
expression np,E;
identifier l;
Expand All @@ -37,7 +40,7 @@ for_each_node_by_type(np,...) {
... when != np = E
- of_node_put(np);

@@
@depends on patch@
iterator name for_each_compatible_node;
expression np,E;
identifier l;
Expand All @@ -50,7 +53,7 @@ for_each_compatible_node(np,...) {
... when != np = E
- of_node_put(np);

@@
@depends on patch@
iterator name for_each_matching_node;
expression np,E;
identifier l;
Expand All @@ -62,3 +65,59 @@ for_each_matching_node(np,...) {
}
... when != np = E
- of_node_put(np);

// ----------------------------------------------------------------------

@r depends on !patch forall@
//iterator name for_each_node_by_name;
//iterator name for_each_node_by_type;
//iterator name for_each_compatible_node;
//iterator name for_each_matching_node;
expression np,E;
identifier l;
position p1,p2;
@@

(
*for_each_node_by_name@p1(np,...)
{
... when != break;
when != goto l;
}
|
*for_each_node_by_type@p1(np,...)
{
... when != break;
when != goto l;
}
|
*for_each_compatible_node@p1(np,...)
{
... when != break;
when != goto l;
}
|
*for_each_matching_node@p1(np,...)
{
... when != break;
when != goto l;
}
)
... when != np = E
* of_node_put@p2(np);

@script:python depends on org@
p1 << r.p1;
p2 << r.p2;
@@
cocci.print_main("unneeded of_node_put",p2)
cocci.print_secs("iterator",p1)
@script:python depends on report@
p1 << r.p1;
p2 << r.p2;
@@
msg = "ERROR: of_node_put not needed after iterator on line %s" % (p1[0].line)
coccilib.report.print_report(p2[0], msg)
Loading

0 comments on commit 29a36d4

Please sign in to comment.