123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- 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]]
|