天天看点

sparse 工具的介绍及简单应用 __context__

Sparse - a Semantic Parser for C

sparse 是用于 C 语言的语法分析器,用以对 C 代码进行静态检查,它不但可以检查 ANSI C 而且还能检查具有 gcc 扩展的 C 。在 Linux 中,不但可以检查用户端代码,还可以检查内核代码。起初它由 linus 编写,后来交给其他人维护。

可以从下面的网址获得该工具:

引用 http://www.kernel.org/pub/software/devel/sparse/dist/
也可以通过 GIT 工具获得:
引用 git clone git://git.kernel.org/pub/scm/devel/sparse/sparse.git
要获得最新的开发版还可以从下面的网址获得:
引用 http://www.codemonkey.org.uk/projects/git-snapshots/sparse/
要么直接最新的下载压缩包:
引用 wget http://www.codemonkey.org.uk/projects/git-snapshots/sparse/sparse-latest.tar.gz
下载 sparse 并解压缩后,可以在其源码目录下简单执行以下命令编译安装:

引用 make

make install

简单使用示例:

程序一:

?

1 2 3 4 5 6

#include <stdio.h>

int

main()

{

printf

(

"hello world\n"

);

return

0;

}

使用 sparse 检查这个程序:

引用 [[email protected] sparse]$ ./sparse /home/beyes/C/gcc/context.c

/home/beyes/C/gcc/context.c:6:10: warning: non-ANSI function declaration of function 'main'

警告提示我们这个程序中的 main 函数不符合 ANSI 函数的声明标准。

改进方法是为 main() 函数添加上参数,即:

复制代码

  1. main(int argc, char **argv)

这样修改后再次检查时,则不会出现此警告。

程序二:

?

1 2 3 4 5 6 7 8 9 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 检查上面的程序会发现:

引用 [[email protected] sparse]$ ./sparse /home/beyes/C/gcc/context.c

/home/beyes/C/gcc/context.c:6:5: warning: context imbalance in 'main' - wrong count at exit

如果将 __release() 加上和 __acquire() 匹配的话,则警告消除。
本帖最近评分记录: 共 条评分 隐藏

相关话题

继续阅读