]>
Commit | Line | Data |
---|---|---|
d228af5b JC |
1 | .. Copyright 2004 Linus Torvalds |
2 | .. Copyright 2004 Pavel Machek <[email protected]> | |
3 | .. Copyright 2006 Bob Copeland <[email protected]> | |
4 | ||
5 | Sparse | |
6 | ====== | |
7 | ||
8 | Sparse is a semantic checker for C programs; it can be used to find a | |
9 | number of potential problems with kernel code. See | |
10 | https://lwn.net/Articles/689907/ for an overview of sparse; this document | |
11 | contains some kernel-specific sparse information. | |
12 | ||
1da177e4 LT |
13 | |
14 | Using sparse for typechecking | |
d228af5b | 15 | ----------------------------- |
1da177e4 | 16 | |
d228af5b | 17 | "__bitwise" is a type attribute, so you have to do something like this:: |
1da177e4 LT |
18 | |
19 | typedef int __bitwise pm_request_t; | |
20 | ||
21 | enum pm_request { | |
22 | PM_SUSPEND = (__force pm_request_t) 1, | |
23 | PM_RESUME = (__force pm_request_t) 2 | |
24 | }; | |
25 | ||
26 | which makes PM_SUSPEND and PM_RESUME "bitwise" integers (the "__force" is | |
27 | there because sparse will complain about casting to/from a bitwise type, | |
28 | but in this case we really _do_ want to force the conversion). And because | |
29 | the enum values are all the same type, now "enum pm_request" will be that | |
30 | type too. | |
31 | ||
d228af5b JC |
32 | And with gcc, all the "__bitwise"/"__force stuff" goes away, and it all |
33 | ends up looking just like integers to gcc. | |
1da177e4 LT |
34 | |
35 | Quite frankly, you don't need the enum there. The above all really just | |
36 | boils down to one special "int __bitwise" type. | |
37 | ||
d228af5b | 38 | So the simpler way is to just do:: |
1da177e4 LT |
39 | |
40 | typedef int __bitwise pm_request_t; | |
41 | ||
42 | #define PM_SUSPEND ((__force pm_request_t) 1) | |
43 | #define PM_RESUME ((__force pm_request_t) 2) | |
44 | ||
45 | and you now have all the infrastructure needed for strict typechecking. | |
46 | ||
47 | One small note: the constant integer "0" is special. You can use a | |
48 | constant zero as a bitwise integer type without sparse ever complaining. | |
49 | This is because "bitwise" (as the name implies) was designed for making | |
50 | sure that bitwise types don't get mixed up (little-endian vs big-endian | |
51 | vs cpu-endian vs whatever), and there the constant "0" really _is_ | |
52 | special. | |
53 | ||
6e976631 | 54 | Using sparse for lock checking |
d228af5b | 55 | ------------------------------ |
6e976631 EC |
56 | |
57 | The following macros are undefined for gcc and defined during a sparse | |
58 | run to use the "context" tracking feature of sparse, applied to | |
59 | locking. These annotations tell sparse when a lock is held, with | |
60 | regard to the annotated function's entry and exit. | |
61 | ||
62 | __must_hold - The specified lock is held on function entry and exit. | |
63 | ||
64 | __acquires - The specified lock is held on function exit, but not entry. | |
65 | ||
66 | __releases - The specified lock is held on function entry, but not exit. | |
67 | ||
68 | If the function enters and exits without the lock held, acquiring and | |
69 | releasing the lock inside the function in a balanced way, no | |
3b7ea9f0 | 70 | annotation is needed. The three annotations above are for cases where |
6e976631 | 71 | sparse would otherwise report a context imbalance. |
20375bf8 | 72 | |
e8331951 | 73 | Getting sparse |
d228af5b | 74 | -------------- |
1da177e4 | 75 | |
a55028ff | 76 | You can get latest released versions from the Sparse homepage at |
05be7a86 | 77 | https://sparse.wiki.kernel.org/index.php/Main_Page |
1da177e4 | 78 | |
a55028ff | 79 | Alternatively, you can get snapshots of the latest development version |
d228af5b | 80 | of sparse using git to clone:: |
1da177e4 | 81 | |
05be7a86 | 82 | git://git.kernel.org/pub/scm/devel/sparse/sparse.git |
a55028ff | 83 | |
d228af5b | 84 | Once you have it, just do:: |
1da177e4 LT |
85 | |
86 | make | |
87 | make install | |
88 | ||
e8331951 BC |
89 | as a regular user, and it will install sparse in your ~/bin directory. |
90 | ||
91 | Using sparse | |
d228af5b | 92 | ------------ |
e8331951 BC |
93 | |
94 | Do a kernel make with "make C=1" to run sparse on all the C files that get | |
95 | recompiled, or use "make C=2" to run sparse on the files whether they need to | |
96 | be recompiled or not. The latter is a fast way to check the whole tree if you | |
97 | have already built it. | |
98 | ||
a887a07d | 99 | The optional make variable CF can be used to pass arguments to sparse. The |
dc67a9f7 | 100 | build system passes -Wbitwise to sparse automatically. |