Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29a36d4d authored by Julia Lawall's avatar Julia Lawall Committed by Michal Marek
Browse files

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: default avatarJulia Lawall <Julia.Lawall@lip6.fr>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent fb3f8af4
Loading
Loading
Loading
Loading
+70 −5
Original line number Original line Diff line number Diff line
/// Use kstrdup rather than duplicating its implementation
/// Use kstrdup rather than duplicating its implementation
///
///
// Confidence: High
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// URL: http://coccinelle.lip6.fr/
// Comments:
// Comments:
// Options: -no_includes -include_headers
// Options: -no_includes -include_headers


virtual patch
virtual patch
virtual context
virtual org
virtual report


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


@@
@depends on patch@
expression x,from,to;
expression x,from,to;
expression flag,E1,E2,E3;
expression flag,E1,E2,E3;
statement S;
statement S;
@@ -37,3 +40,65 @@ statement S;
    if (to==NULL || ...) S
    if (to==NULL || ...) S
    ... when != \(x = E3 \| from = E3 \| to = E3 \)
    ... when != \(x = E3 \| from = E3 \| to = E3 \)
-   memcpy(to, from, x);
-   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)
+30 −4
Original line number Original line Diff line number Diff line
/// Use kmemdup rather than duplicating its implementation
/// Use kmemdup rather than duplicating its implementation
///
///
// Confidence: High
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// URL: http://coccinelle.lip6.fr/
// Comments:
// Comments:
// Options: -no_includes -include_headers
// Options: -no_includes -include_headers


virtual patch
virtual patch
virtual context
virtual org
virtual report


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


@@
@depends on patch@
expression from,to,size,flag;
expression from,to,size,flag;
position p != {r1.p,r2.p};
position p != {r1.p,r2.p};
statement S;
statement S;
@@ -38,3 +41,26 @@ statement S;
+  to = kmemdup(from,size,flag);
+  to = kmemdup(from,size,flag);
   if (to==NULL || ...) S
   if (to==NULL || ...) S
-  memcpy(to, from, size);
-  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")
+32 −7
Original line number Original line Diff line number Diff line
/// 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
/// This is a little bit restricted to reduce false positives
///
///
// Confidence: High
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// URL: http://coccinelle.lip6.fr/
// Comments:
// Comments:
// Options: -no_includes -include_headers
// Options: -no_includes -include_headers


virtual patch
virtual patch
virtual context
virtual org
virtual report


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


-  to = \(kmalloc@p\|kzalloc@p\)(size,flag);
-  to = \(kmalloc\|kzalloc\)(size,flag);
+  to = memdup_user(from,size);
+  to = memdup_user(from,size);
   if (
   if (
-      to==NULL
-      to==NULL
@@ -33,3 +35,26 @@ identifier l1,l2;
-    -EFAULT
-    -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")
+9 −5
Original line number Original line Diff line number Diff line
@@ -5,9 +5,9 @@
//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
///
///
// Confidence: Moderate
// Confidence: Moderate
// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// URL: http://coccinelle.lip6.fr/
// Comments:
// Comments:
// Options: -no_includes -include_headers
// Options: -no_includes -include_headers
@@ -23,7 +23,7 @@ position p1;
kfree@p1(E)
kfree@p1(E)


@print expression@
@print expression@
constant char *c;
constant char [] c;
expression free.E,E2;
expression free.E,E2;
type T;
type T;
position p;
position p;
@@ -36,6 +36,10 @@ identifier f;
 E@p == E2
 E@p == E2
|
|
 E@p != E2
 E@p != E2
|
 E2 == E@p
|
 E2 != E@p
|
|
 !E@p
 !E@p
|
|
@@ -113,5 +117,5 @@ p1 << free.p1;
p2 << r.p2;
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)
coccilib.report.print_report(p2[0],msg)
+66 −7
Original line number Original line Diff line number Diff line
@@ -2,16 +2,19 @@
/// is no point to call of_node_put on the final value.
/// is no point to call of_node_put on the final value.
///
///
// Confidence: High
// Confidence: High
// Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Nicolas Palix.  GPLv2.
// Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// URL: http://coccinelle.lip6.fr/
// Comments:
// Comments:
// Options: -no_includes -include_headers
// Options: -no_includes -include_headers


virtual patch
virtual patch
virtual context
virtual org
virtual report


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


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


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


@@
@depends on patch@
iterator name for_each_matching_node;
iterator name for_each_matching_node;
expression np,E;
expression np,E;
identifier l;
identifier l;
@@ -62,3 +65,59 @@ for_each_matching_node(np,...) {
}
}
... when != np = E
... when != np = E
- of_node_put(np);
- 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