Sparse | |
Author: | Linus Torvalds |
Developer: | Josh Triplett, Christopher Li, Luc Van Oostenryck |
Released: | 2003 |
Latest Release Version: | 0.6.4 |
Latest Release Date: | [1] |
Programming Language: | C |
Operating System: | Linux, BSD, macOS, MinGW, Cygwin |
Genre: | Static code analysis |
License: | MIT License |
Sparse is a computer software tool designed to find possible coding faults in the Linux kernel.[2] Unlike other such tools, this static analysis tool was initially designed to only flag constructs that were likely to be of interest to kernel developers, such as the mixing of pointers to user and kernel address spaces.
Sparse checks for known problems and allows the developer to include annotations in the code that convey information about data types, such as the address space that pointers point to and the locks that a function acquires or releases.
Linus Torvalds started writing Sparse in 2003. Josh Triplett was its maintainer from 2006, a role taken over by Christopher Li in 2009[3] and by Luc Van Oostenryck in November 2018.Sparse is released under the MIT License.
Some of the checks performed by Sparse require annotating the source code using the __attribute__
GCC extension, or the Sparse-specific __context__
specifier.[4] Sparse defines the following list of attributes:
address_space(''num'')
bitwise
force
context(''expression'',''in_context'',''out_context'')
When an API is defined with a macro, the specifier __attribute__((context(''...'')))
can be replaced by __context__(''...'')
.
The Linux kernel defines the following short forms as pre-processor macros in files linux/compiler.h and linux/types.h (when building without the __CHECKER__
flag, all these annotations are removed from the code):
extern void __chk_user_ptr(const volatile void __user *);extern void __chk_io_ptr(const volatile void __iomem *);
The types __le32
and __be32
represent 32-bit integer types with different endianness. However, the C language does not allow to specify that variables of these types should not be mixed. The bitwise
attribute is used to mark these types as restricted, so Sparse will give a warning if variables of these types or other integer variables are mixed:force
attribute is used to avoid Sparse giving a warning.