Root/
1 | Copyright 2004 Linus Torvalds |
2 | Copyright 2004 Pavel Machek <pavel@suse.cz> |
3 | Copyright 2006 Bob Copeland <me@bobcopeland.com> |
4 | |
5 | Using sparse for typechecking |
6 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
7 | |
8 | "__bitwise" is a type attribute, so you have to do something like this: |
9 | |
10 | typedef int __bitwise pm_request_t; |
11 | |
12 | enum pm_request { |
13 | PM_SUSPEND = (__force pm_request_t) 1, |
14 | PM_RESUME = (__force pm_request_t) 2 |
15 | }; |
16 | |
17 | which makes PM_SUSPEND and PM_RESUME "bitwise" integers (the "__force" is |
18 | there because sparse will complain about casting to/from a bitwise type, |
19 | but in this case we really _do_ want to force the conversion). And because |
20 | the enum values are all the same type, now "enum pm_request" will be that |
21 | type too. |
22 | |
23 | And with gcc, all the __bitwise/__force stuff goes away, and it all ends |
24 | up looking just like integers to gcc. |
25 | |
26 | Quite frankly, you don't need the enum there. The above all really just |
27 | boils down to one special "int __bitwise" type. |
28 | |
29 | So the simpler way is to just do |
30 | |
31 | typedef int __bitwise pm_request_t; |
32 | |
33 | #define PM_SUSPEND ((__force pm_request_t) 1) |
34 | #define PM_RESUME ((__force pm_request_t) 2) |
35 | |
36 | and you now have all the infrastructure needed for strict typechecking. |
37 | |
38 | One small note: the constant integer "0" is special. You can use a |
39 | constant zero as a bitwise integer type without sparse ever complaining. |
40 | This is because "bitwise" (as the name implies) was designed for making |
41 | sure that bitwise types don't get mixed up (little-endian vs big-endian |
42 | vs cpu-endian vs whatever), and there the constant "0" really _is_ |
43 | special. |
44 | |
45 | __bitwise__ - to be used for relatively compact stuff (gfp_t, etc.) that |
46 | is mostly warning-free and is supposed to stay that way. Warnings will |
47 | be generated without __CHECK_ENDIAN__. |
48 | |
49 | __bitwise - noisy stuff; in particular, __le*/__be* are that. We really |
50 | don't want to drown in noise unless we'd explicitly asked for it. |
51 | |
52 | |
53 | Getting sparse |
54 | ~~~~~~~~~~~~~~ |
55 | |
56 | You can get latest released versions from the Sparse homepage at |
57 | http://www.kernel.org/pub/linux/kernel/people/josh/sparse/ |
58 | |
59 | Alternatively, you can get snapshots of the latest development version |
60 | of sparse using git to clone.. |
61 | |
62 | git://git.kernel.org/pub/scm/linux/kernel/git/josh/sparse.git |
63 | |
64 | DaveJ has hourly generated tarballs of the git tree available at.. |
65 | |
66 | http://www.codemonkey.org.uk/projects/git-snapshots/sparse/ |
67 | |
68 | |
69 | Once you have it, just do |
70 | |
71 | make |
72 | make install |
73 | |
74 | as a regular user, and it will install sparse in your ~/bin directory. |
75 | |
76 | Using sparse |
77 | ~~~~~~~~~~~~ |
78 | |
79 | Do a kernel make with "make C=1" to run sparse on all the C files that get |
80 | recompiled, or use "make C=2" to run sparse on the files whether they need to |
81 | be recompiled or not. The latter is a fast way to check the whole tree if you |
82 | have already built it. |
83 | |
84 | The optional make variable CF can be used to pass arguments to sparse. The |
85 | build system passes -Wbitwise to sparse automatically. To perform endianness |
86 | checks, you may define __CHECK_ENDIAN__: |
87 | |
88 | make C=2 CF="-D__CHECK_ENDIAN__" |
89 | |
90 | These checks are disabled by default as they generate a host of warnings. |
91 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9