diff options
author | Jonathan Corbet <corbet@lwn.net> | 2016-08-07 17:09:14 -0400 |
---|---|---|
committer | Jonathan Corbet <corbet@lwn.net> | 2016-08-18 19:39:24 -0400 |
commit | d228af5bcb60fda50f8b3a100c0539c4994df040 (patch) | |
tree | 3d204a825cc0a0555001140e165a7ba7ff11c0d6 /Documentation/dev-tools | |
parent | 4b9033a33494ec9154d63e706e9e47f7eb3fd59e (diff) |
docs: sphinxify sparse.txt and move to dev-tools
Fold the sparse document into the development tools set; no changes to the
text itself beyond formatting.
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Diffstat (limited to 'Documentation/dev-tools')
-rw-r--r-- | Documentation/dev-tools/sparse.rst | 117 | ||||
-rw-r--r-- | Documentation/dev-tools/tools.rst | 1 |
2 files changed, 118 insertions, 0 deletions
diff --git a/Documentation/dev-tools/sparse.rst b/Documentation/dev-tools/sparse.rst new file mode 100644 index 000000000000..8c250e8a2105 --- /dev/null +++ b/Documentation/dev-tools/sparse.rst | |||
@@ -0,0 +1,117 @@ | |||
1 | .. Copyright 2004 Linus Torvalds | ||
2 | .. Copyright 2004 Pavel Machek <pavel@ucw.cz> | ||
3 | .. Copyright 2006 Bob Copeland <me@bobcopeland.com> | ||
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 | |||
13 | |||
14 | Using sparse for typechecking | ||
15 | ----------------------------- | ||
16 | |||
17 | "__bitwise" is a type attribute, so you have to do something like this:: | ||
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 | |||
32 | And with gcc, all the "__bitwise"/"__force stuff" goes away, and it all | ||
33 | ends up looking just like integers to gcc. | ||
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 | |||
38 | So the simpler way is to just do:: | ||
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 | |||
54 | __bitwise__ - to be used for relatively compact stuff (gfp_t, etc.) that | ||
55 | is mostly warning-free and is supposed to stay that way. Warnings will | ||
56 | be generated without __CHECK_ENDIAN__. | ||
57 | |||
58 | __bitwise - noisy stuff; in particular, __le*/__be* are that. We really | ||
59 | don't want to drown in noise unless we'd explicitly asked for it. | ||
60 | |||
61 | Using sparse for lock checking | ||
62 | ------------------------------ | ||
63 | |||
64 | The following macros are undefined for gcc and defined during a sparse | ||
65 | run to use the "context" tracking feature of sparse, applied to | ||
66 | locking. These annotations tell sparse when a lock is held, with | ||
67 | regard to the annotated function's entry and exit. | ||
68 | |||
69 | __must_hold - The specified lock is held on function entry and exit. | ||
70 | |||
71 | __acquires - The specified lock is held on function exit, but not entry. | ||
72 | |||
73 | __releases - The specified lock is held on function entry, but not exit. | ||
74 | |||
75 | If the function enters and exits without the lock held, acquiring and | ||
76 | releasing the lock inside the function in a balanced way, no | ||
77 | annotation is needed. The tree annotations above are for cases where | ||
78 | sparse would otherwise report a context imbalance. | ||
79 | |||
80 | Getting sparse | ||
81 | -------------- | ||
82 | |||
83 | You can get latest released versions from the Sparse homepage at | ||
84 | https://sparse.wiki.kernel.org/index.php/Main_Page | ||
85 | |||
86 | Alternatively, you can get snapshots of the latest development version | ||
87 | of sparse using git to clone:: | ||
88 | |||
89 | git://git.kernel.org/pub/scm/devel/sparse/sparse.git | ||
90 | |||
91 | DaveJ has hourly generated tarballs of the git tree available at:: | ||
92 | |||
93 | http://www.codemonkey.org.uk/projects/git-snapshots/sparse/ | ||
94 | |||
95 | |||
96 | Once you have it, just do:: | ||
97 | |||
98 | make | ||
99 | make install | ||
100 | |||
101 | as a regular user, and it will install sparse in your ~/bin directory. | ||
102 | |||
103 | Using sparse | ||
104 | ------------ | ||
105 | |||
106 | Do a kernel make with "make C=1" to run sparse on all the C files that get | ||
107 | recompiled, or use "make C=2" to run sparse on the files whether they need to | ||
108 | be recompiled or not. The latter is a fast way to check the whole tree if you | ||
109 | have already built it. | ||
110 | |||
111 | The optional make variable CF can be used to pass arguments to sparse. The | ||
112 | build system passes -Wbitwise to sparse automatically. To perform endianness | ||
113 | checks, you may define __CHECK_ENDIAN__:: | ||
114 | |||
115 | make C=2 CF="-D__CHECK_ENDIAN__" | ||
116 | |||
117 | These checks are disabled by default as they generate a host of warnings. | ||
diff --git a/Documentation/dev-tools/tools.rst b/Documentation/dev-tools/tools.rst index ae0c58c784db..d4bbda319e79 100644 --- a/Documentation/dev-tools/tools.rst +++ b/Documentation/dev-tools/tools.rst | |||
@@ -15,3 +15,4 @@ whole; patches welcome! | |||
15 | :maxdepth: 2 | 15 | :maxdepth: 2 |
16 | 16 | ||
17 | coccinelle | 17 | coccinelle |
18 | sparse | ||