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/


要么直接最新的下载压缩包:
引用


下载 sparse 并解压缩后,可以在其源码目录下简单执行以下命令编译安装:
引用
make
make install


简单使用示例:
程序一:
?
1
2
3
4
5
6
#include <stdio.h>
int main()
{
         printf ( "hello world\n" );
         return 0;
}

使用 sparse 检查这个程序:
引用
[beyes@SLinux 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 检查上面的程序会发现:
引用
[beyes@SLinux 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() 匹配的话,则警告消除。
本帖最近评分记录: 条评分 隐藏
相关话题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值