Sparse - a Semantic Parser for C
sparse 是用于 C 语言的语法分析器,用以对 C 代码进行静态检查,它不但可以检查 ANSI C 而且还能检查具有 gcc 扩展的 C 。在 Linux 中,不但可以检查用户端代码,还可以检查内核代码。起初它由 linus 编写,后来交给其他人维护。
可以从下面的网址获得该工具:
也可以通过 GIT 工具获得:
要获得最新的开发版还可以从下面的网址获得:
要么直接最新的下载压缩包:
下载 sparse 并解压缩后,可以在其源码目录下简单执行以下命令编译安装:
简单使用示例:
程序一:
使用 sparse 检查这个程序: 警告提示我们这个程序中的 main 函数不符合 ANSI 函数的声明标准。
改进方法是为 main() 函数添加上参数,即:
这样修改后再次检查时,则不会出现此警告。
程序二:
上面从 linux 内核代码中直接拷贝了用以实现 spinlock 的两个宏 __acquire(x) 和 __release(x) 。在这两个宏中,出现了 __context__ 标签,这个 __context__ 是一种 sparse 支持的检查特性。这里,如果函数里单独 __acquire() 而没有使用 __release() 与之匹配的话,sparse 会发出警告。顺便说一下,像自旋锁这种锁,如果忘记释放(不匹配使用),那么会造成整个内核死锁,这时候只能重启系统。使用 sparse 检查上面的程序会发现: 如果将 __release() 加上和 __acquire() 匹配的话,则警告消除。
sparse 是用于 C 语言的语法分析器,用以对 C 代码进行静态检查,它不但可以检查 ANSI C 而且还能检查具有 gcc 扩展的 C 。在 Linux 中,不但可以检查用户端代码,还可以检查内核代码。起初它由 linus 编写,后来交给其他人维护。
可以从下面的网址获得该工具:
也可以通过 GIT 工具获得:
要获得最新的开发版还可以从下面的网址获得:
要么直接最新的下载压缩包:
下载 sparse 并解压缩后,可以在其源码目录下简单执行以下命令编译安装:
简单使用示例:
程序一:
[C++]
纯文本查看
复制代码
1
2
3
4
5
6
|
#include <stdio.h>
int
main()
{
printf
(
"hello world\n"
);
return
0;
}
|
使用 sparse 检查这个程序: 警告提示我们这个程序中的 main 函数不符合 ANSI 函数的声明标准。
改进方法是为 main() 函数添加上参数,即:
[Plain Text]
纯文本查看
复制代码
1
|
main(int argc, char **argv)
|
这样修改后再次检查时,则不会出现此警告。
程序二:
[C++]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
|
#include <stdio.h>
#define __acquire(x) __context__(x,1)
#define __release(x) __context__(x,-1)
int
main(
int
argc,
char
**argv)
{
__acquire(10);
printf
(
"hello world\n"
);
return
0;
}
|
上面从 linux 内核代码中直接拷贝了用以实现 spinlock 的两个宏 __acquire(x) 和 __release(x) 。在这两个宏中,出现了 __context__ 标签,这个 __context__ 是一种 sparse 支持的检查特性。这里,如果函数里单独 __acquire() 而没有使用 __release() 与之匹配的话,sparse 会发出警告。顺便说一下,像自旋锁这种锁,如果忘记释放(不匹配使用),那么会造成整个内核死锁,这时候只能重启系统。使用 sparse 检查上面的程序会发现: 如果将 __release() 加上和 __acquire() 匹配的话,则警告消除。