mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 16:52:06 +10:00 
			
		
		
		
	Adding documentation for the new M= option which limits Coccinelle to a specific set of directories. Signed-off-by: Greg Dietsche <Gregory.Dietsche@cuw.edu> Acked-by: Julia Lawall <julia.lawall@lip6.fr> Signed-off-by: Michal Marek <mmarek@suse.cz>
		
			
				
	
	
		
			297 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Copyright 2010 Nicolas Palix <npalix@diku.dk>
 | 
						|
Copyright 2010 Julia Lawall <julia@diku.dk>
 | 
						|
Copyright 2010 Gilles Muller <Gilles.Muller@lip6.fr>
 | 
						|
 | 
						|
 | 
						|
 Getting Coccinelle
 | 
						|
~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The semantic patches included in the kernel use the 'virtual rule'
 | 
						|
feature which was introduced in Coccinelle version 0.1.11.
 | 
						|
 | 
						|
Coccinelle (>=0.2.0) is available through the package manager
 | 
						|
of many distributions, e.g. :
 | 
						|
 | 
						|
 - Debian (>=squeeze)
 | 
						|
 - Fedora (>=13)
 | 
						|
 - Ubuntu (>=10.04 Lucid Lynx)
 | 
						|
 - OpenSUSE
 | 
						|
 - Arch Linux
 | 
						|
 - NetBSD
 | 
						|
 - FreeBSD
 | 
						|
 | 
						|
 | 
						|
You can get the latest version released from the Coccinelle homepage at
 | 
						|
http://coccinelle.lip6.fr/
 | 
						|
 | 
						|
Information and tips about Coccinelle are also provided on the wiki
 | 
						|
pages at http://cocci.ekstranet.diku.dk/wiki/doku.php
 | 
						|
 | 
						|
Once you have it, run the following command:
 | 
						|
 | 
						|
     	./configure
 | 
						|
        make
 | 
						|
 | 
						|
as a regular user, and install it with
 | 
						|
 | 
						|
        sudo make install
 | 
						|
 | 
						|
The semantic patches in the kernel will work best with Coccinelle version
 | 
						|
0.2.4 or later.  Using earlier versions may incur some parse errors in the
 | 
						|
semantic patch code, but any results that are obtained should still be
 | 
						|
correct.
 | 
						|
 | 
						|
 Using Coccinelle on the Linux kernel
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
A Coccinelle-specific target is defined in the top level
 | 
						|
Makefile. This target is named 'coccicheck' and calls the 'coccicheck'
 | 
						|
front-end in the 'scripts' directory.
 | 
						|
 | 
						|
Four modes are defined: patch, report, context, and org. The mode to
 | 
						|
use is specified by setting the MODE variable with 'MODE=<mode>'.
 | 
						|
 | 
						|
'patch' proposes a fix, when possible.
 | 
						|
 | 
						|
'report' generates a list in the following format:
 | 
						|
  file:line:column-column: message
 | 
						|
 | 
						|
'context' highlights lines of interest and their context in a
 | 
						|
diff-like style.Lines of interest are indicated with '-'.
 | 
						|
 | 
						|
'org' generates a report in the Org mode format of Emacs.
 | 
						|
 | 
						|
Note that not all semantic patches implement all modes. For easy use
 | 
						|
of Coccinelle, the default mode is "chain" which tries the previous
 | 
						|
modes in the order above until one succeeds.
 | 
						|
 | 
						|
To make a report for every semantic patch, run the following command:
 | 
						|
 | 
						|
	make coccicheck MODE=report
 | 
						|
 | 
						|
NB: The 'report' mode is the default one.
 | 
						|
 | 
						|
To produce patches, run:
 | 
						|
 | 
						|
	make coccicheck MODE=patch
 | 
						|
 | 
						|
 | 
						|
The coccicheck target applies every semantic patch available in the
 | 
						|
sub-directories of 'scripts/coccinelle' to the entire Linux kernel.
 | 
						|
 | 
						|
For each semantic patch, a commit message is proposed.  It gives a
 | 
						|
description of the problem being checked by the semantic patch, and
 | 
						|
includes a reference to Coccinelle.
 | 
						|
 | 
						|
As any static code analyzer, Coccinelle produces false
 | 
						|
positives. Thus, reports must be carefully checked, and patches
 | 
						|
reviewed.
 | 
						|
 | 
						|
 | 
						|
 Using Coccinelle with a single semantic patch
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The optional make variable COCCI can be used to check a single
 | 
						|
semantic patch. In that case, the variable must be initialized with
 | 
						|
the name of the semantic patch to apply.
 | 
						|
 | 
						|
For instance:
 | 
						|
 | 
						|
	make coccicheck COCCI=<my_SP.cocci> MODE=patch
 | 
						|
or
 | 
						|
	make coccicheck COCCI=<my_SP.cocci> MODE=report
 | 
						|
 | 
						|
 | 
						|
 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
 | 
						|
following command may be used:
 | 
						|
 | 
						|
    make C=1 CHECK="scripts/coccicheck"
 | 
						|
 | 
						|
To check only newly edited code, use the value 2 for the C flag, i.e.
 | 
						|
 | 
						|
    make C=2 CHECK="scripts/coccicheck"
 | 
						|
 | 
						|
This runs every semantic patch in scripts/coccinelle by default. The
 | 
						|
COCCI variable may additionally be used to only apply a single
 | 
						|
semantic patch as shown in the previous section.
 | 
						|
 | 
						|
The "chain" mode is the default. You can select another one with the
 | 
						|
MODE variable explained above.
 | 
						|
 | 
						|
In this mode, there is no information about semantic patches
 | 
						|
displayed, and no commit message proposed.
 | 
						|
 | 
						|
 | 
						|
 Proposing new semantic patches
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
New semantic patches can be proposed and submitted by kernel
 | 
						|
developers. For sake of clarity, they should be organized in the
 | 
						|
sub-directories of 'scripts/coccinelle/'.
 | 
						|
 | 
						|
 | 
						|
 Detailed description of the 'report' mode
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
'report' generates a list in the following format:
 | 
						|
  file:line:column-column: message
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
Running
 | 
						|
 | 
						|
	make coccicheck MODE=report COCCI=scripts/coccinelle/api/err_cast.cocci
 | 
						|
 | 
						|
will execute the following part of the SmPL script.
 | 
						|
 | 
						|
<smpl>
 | 
						|
@r depends on !context && !patch && (org || report)@
 | 
						|
expression x;
 | 
						|
position p;
 | 
						|
@@
 | 
						|
 | 
						|
 ERR_PTR@p(PTR_ERR(x))
 | 
						|
 | 
						|
@script:python depends on report@
 | 
						|
p << r.p;
 | 
						|
x << r.x;
 | 
						|
@@
 | 
						|
 | 
						|
msg="ERR_CAST can be used with %s" % (x)
 | 
						|
coccilib.report.print_report(p[0], msg)
 | 
						|
</smpl>
 | 
						|
 | 
						|
This SmPL excerpt generates entries on the standard output, as
 | 
						|
illustrated below:
 | 
						|
 | 
						|
/home/user/linux/crypto/ctr.c:188:9-16: ERR_CAST can be used with alg
 | 
						|
/home/user/linux/crypto/authenc.c:619:9-16: ERR_CAST can be used with auth
 | 
						|
/home/user/linux/crypto/xts.c:227:9-16: ERR_CAST can be used with alg
 | 
						|
 | 
						|
 | 
						|
 Detailed description of the 'patch' mode
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
When the 'patch' mode is available, it proposes a fix for each problem
 | 
						|
identified.
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
Running
 | 
						|
	make coccicheck MODE=patch COCCI=scripts/coccinelle/api/err_cast.cocci
 | 
						|
 | 
						|
will execute the following part of the SmPL script.
 | 
						|
 | 
						|
<smpl>
 | 
						|
@ depends on !context && patch && !org && !report @
 | 
						|
expression x;
 | 
						|
@@
 | 
						|
 | 
						|
- ERR_PTR(PTR_ERR(x))
 | 
						|
+ ERR_CAST(x)
 | 
						|
</smpl>
 | 
						|
 | 
						|
This SmPL excerpt generates patch hunks on the standard output, as
 | 
						|
illustrated below:
 | 
						|
 | 
						|
diff -u -p a/crypto/ctr.c b/crypto/ctr.c
 | 
						|
--- a/crypto/ctr.c 2010-05-26 10:49:38.000000000 +0200
 | 
						|
+++ b/crypto/ctr.c 2010-06-03 23:44:49.000000000 +0200
 | 
						|
@@ -185,7 +185,7 @@ static struct crypto_instance *crypto_ct
 | 
						|
 	alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
 | 
						|
 				  CRYPTO_ALG_TYPE_MASK);
 | 
						|
 	if (IS_ERR(alg))
 | 
						|
-		return ERR_PTR(PTR_ERR(alg));
 | 
						|
+		return ERR_CAST(alg);
 | 
						|
 
 | 
						|
 	/* Block size must be >= 4 bytes. */
 | 
						|
 	err = -EINVAL;
 | 
						|
 | 
						|
 Detailed description of the 'context' mode
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
'context' highlights lines of interest and their context
 | 
						|
in a diff-like style.
 | 
						|
 | 
						|
NOTE: The diff-like output generated is NOT an applicable patch. The
 | 
						|
      intent of the 'context' mode is to highlight the important lines
 | 
						|
      (annotated with minus, '-') and gives some surrounding context
 | 
						|
      lines around. This output can be used with the diff mode of
 | 
						|
      Emacs to review the code.
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
Running
 | 
						|
	make coccicheck MODE=context COCCI=scripts/coccinelle/api/err_cast.cocci
 | 
						|
 | 
						|
will execute the following part of the SmPL script.
 | 
						|
 | 
						|
<smpl>
 | 
						|
@ depends on context && !patch && !org && !report@
 | 
						|
expression x;
 | 
						|
@@
 | 
						|
 | 
						|
* ERR_PTR(PTR_ERR(x))
 | 
						|
</smpl>
 | 
						|
 | 
						|
This SmPL excerpt generates diff hunks on the standard output, as
 | 
						|
illustrated below:
 | 
						|
 | 
						|
diff -u -p /home/user/linux/crypto/ctr.c /tmp/nothing
 | 
						|
--- /home/user/linux/crypto/ctr.c	2010-05-26 10:49:38.000000000 +0200
 | 
						|
+++ /tmp/nothing
 | 
						|
@@ -185,7 +185,6 @@ static struct crypto_instance *crypto_ct
 | 
						|
 	alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
 | 
						|
 				  CRYPTO_ALG_TYPE_MASK);
 | 
						|
 	if (IS_ERR(alg))
 | 
						|
-		return ERR_PTR(PTR_ERR(alg));
 | 
						|
 
 | 
						|
 	/* Block size must be >= 4 bytes. */
 | 
						|
 	err = -EINVAL;
 | 
						|
 | 
						|
 Detailed description of the 'org' mode
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
'org' generates a report in the Org mode format of Emacs.
 | 
						|
 | 
						|
Example:
 | 
						|
 | 
						|
Running
 | 
						|
	make coccicheck MODE=org COCCI=scripts/coccinelle/api/err_cast.cocci
 | 
						|
 | 
						|
will execute the following part of the SmPL script.
 | 
						|
 | 
						|
<smpl>
 | 
						|
@r depends on !context && !patch && (org || report)@
 | 
						|
expression x;
 | 
						|
position p;
 | 
						|
@@
 | 
						|
 | 
						|
 ERR_PTR@p(PTR_ERR(x))
 | 
						|
 | 
						|
@script:python depends on org@
 | 
						|
p << r.p;
 | 
						|
x << r.x;
 | 
						|
@@
 | 
						|
 | 
						|
msg="ERR_CAST can be used with %s" % (x)
 | 
						|
msg_safe=msg.replace("[","@(").replace("]",")")
 | 
						|
coccilib.org.print_todo(p[0], msg_safe)
 | 
						|
</smpl>
 | 
						|
 | 
						|
This SmPL excerpt generates Org entries on the standard output, as
 | 
						|
illustrated below:
 | 
						|
 | 
						|
* TODO [[view:/home/user/linux/crypto/ctr.c::face=ovl-face1::linb=188::colb=9::cole=16][ERR_CAST can be used with alg]]
 | 
						|
* TODO [[view:/home/user/linux/crypto/authenc.c::face=ovl-face1::linb=619::colb=9::cole=16][ERR_CAST can be used with auth]]
 | 
						|
* TODO [[view:/home/user/linux/crypto/xts.c::face=ovl-face1::linb=227::colb=9::cole=16][ERR_CAST can be used with alg]]
 |