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

Commit 408e0578 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  scripts/coccinelle: improve the coverage of some semantic patches
  coccinelle: semantic patches related to devm_ functions (part 2)
  coccinelle: semantic patches related to devm_ functions (part 1)
  coccinelle.txt: update documentation to include M= option
  coccicheck: add M= option to control which dir is processed
  ctags: remove struct forward declarations
  scripts/tags.sh: Add Page flag function magic
parents 287b901d 29a36d4d
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -102,8 +102,14 @@ or
	make coccicheck COCCI=<my_SP.cocci> MODE=report
	make coccicheck COCCI=<my_SP.cocci> MODE=report




 Using Coccinelle on (modified) files
 Controlling Which Files are Processed by Coccinelle
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By default the entire kernel source tree is checked.

To apply Coccinelle to a specific directory, M= can be used.
For example, to check drivers/net/wireless/ one may write:

    make coccicheck M=drivers/net/wireless/
    
    
To apply Coccinelle on a file basis, instead of a directory basis, the
To apply Coccinelle on a file basis, instead of a directory basis, the
following command may be used:
following command may be used:
+14 −5
Original line number Original line Diff line number Diff line
@@ -9,14 +9,23 @@ if [ "$C" = "1" -o "$C" = "2" ]; then
#    FLAGS="-ignore_unknown_options -very_quiet"
#    FLAGS="-ignore_unknown_options -very_quiet"
#    OPTIONS=$*
#    OPTIONS=$*


    if [ "$KBUILD_EXTMOD" = "" ] ; then
        # Workaround for Coccinelle < 0.2.3
        # Workaround for Coccinelle < 0.2.3
        FLAGS="-I $srctree/include -very_quiet"
        FLAGS="-I $srctree/include -very_quiet"
        shift $(( $# - 1 ))
        shift $(( $# - 1 ))
        OPTIONS=$1
        OPTIONS=$1
    else
	echo M= is not currently supported when C=1 or C=2
	exit 1
    fi
else
else
    ONLINE=0
    ONLINE=0
    FLAGS="-very_quiet"
    FLAGS="-very_quiet"
    if [ "$KBUILD_EXTMOD" = "" ] ; then
        OPTIONS="-dir $srctree"
        OPTIONS="-dir $srctree"
    else
        OPTIONS="-dir $KBUILD_EXTMOD -patch $srctree -I $srctree/include -I $KBUILD_EXTMOD/include"
    fi
fi
fi


if [ ! -x "$SPATCH" ]; then
if [ ! -x "$SPATCH" ]; then
+105 −0
Original line number Original line Diff line number Diff line
/// Reimplement a call to devm_request_mem_region followed by a call to ioremap
/// or ioremap_nocache by a call to devm_request_and_ioremap.
/// Devm_request_and_ioremap was introduced in
/// 72f8c0bfa0de64c68ee59f40eb9b2683bffffbb0.  It makes the code much more
/// concise.
///
///
// Confidence: High
// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual patch
virtual org
virtual report
virtual context

@nm@
expression myname;
identifier i;
@@

struct platform_driver i = { .driver = { .name = myname } };

@depends on patch@
expression dev,res,size;
@@

-if (!devm_request_mem_region(dev, res->start, size,
-                              \(res->name\|dev_name(dev)\))) {
-   ...
-   return ...;
-}
... when != res->start
(
-devm_ioremap(dev,res->start,size)
+devm_request_and_ioremap(dev,res)
|
-devm_ioremap_nocache(dev,res->start,size)
+devm_request_and_ioremap(dev,res)
)
... when any
    when != res->start

// this rule is separate from the previous one, because a single file can
// have multiple values of myname
@depends on patch@
expression dev,res,size;
expression nm.myname;
@@

-if (!devm_request_mem_region(dev, res->start, size,myname)) {
-   ...
-   return ...;
-}
... when != res->start
(
-devm_ioremap(dev,res->start,size)
+devm_request_and_ioremap(dev,res)
|
-devm_ioremap_nocache(dev,res->start,size)
+devm_request_and_ioremap(dev,res)
)
... when any
    when != res->start


@pb depends on org || report || context@
expression dev,res,size;
expression nm.myname;
position p1,p2;
@@

*if
  (!devm_request_mem_region@p1(dev, res->start, size,
                              \(res->name\|dev_name(dev)\|myname\))) {
   ...
   return ...;
}
... when != res->start
(
*devm_ioremap@p2(dev,res->start,size)
|
*devm_ioremap_nocache@p2(dev,res->start,size)
)
... when any
    when != res->start

@script:python depends on org@
p1 << pb.p1;
p2 << pb.p2;
@@

cocci.print_main("INFO: replace by devm_request_and_ioremap",p1)
cocci.print_secs("",p2)

@script:python depends on report@
p1 << pb.p1;
p2 << pb.p2;
@@

msg = "INFO: devm_request_mem_region followed by ioremap on line %s can be replaced by devm_request_and_ioremap" % (p2[0].line)
coccilib.report.print_report(p1[0],msg)
+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")
Loading