gfp_t gfp参数
typedef unsigned __bitwise__ gfp_t; 摸出了这个瓜——sparse。
Sparse是内核代码静态分析工具, 能够帮助我们找出代码中的隐患.
1. Sparse 介绍
Sparse 诞生于 2004 年, 是由linux之父开发的, 目的就是提供一个静态检查代码的工具, 从而减少linux内核的隐患.
内核代码中有一个简略的关于 Sparse的说明文件: Documentation/sparse.txtSparse通过 gcc 的扩展属性 __attribute__ 以及自己定义的 __context__ 来对代码进行静态检查.
宏名称 | 宏定义 | 检查点 |
__bitwise | __attribute__((bitwise)) | 确保变量是相同的位方式(比如 bit-endian, little-endiandeng) |
__user | __attribute__((noderef, address_space(1))) | 指针地址必须在用户地址空间 |
__kernel | __attribute__((noderef, address_space(0))) | 指针地址必须在内核地址空间 |
__iomem | __attribute__((noderef, address_space(2))) | 指针地址必须在设备地址空间 |
__safe | __attribute__((safe)) | 变量可以为空 |
__force | __attribute__((force)) | 变量可以进行强制转换 |
__nocast | __attribute__((nocast)) | 参数类型与实际参数类型必须一致 |
__acquires(x) | __attribute__((context(x, 0, 1))) | 参数x 在执行前引用计数必须是0,执行后,引用计数必须为1 |
__releases(x) | __attribute__((context(x, 1, 0))) | 与 __acquires(x) 相反 |
__acquire(x) | __context__(x, 1) | 参数x 的引用计数 + 1 |
__release(x) | __context__(x, -1) | 与 __acquire(x) 相反 |
__cond_lock(x,c) | ((c) ? ({ __acquire(x); 1; }) : 0) | 参数c 不为0时,引用计数 + 1, 并返回1 |
其中 __acquires(x) 和 __releases(x), __acquire(x) 和 __release(x) 必须配对使用, 否则 Sparse 会给出警告
2. Sparse 使用方法
2.1 __bitwise 的使用
主要作用就是确保内核使用的整数是在同样的位方式下.
在内核代码根目录下 grep -r '__bitwise', 会发现内核代码中很多地方都使用了这个宏.
对于使用了这个宏的变量, Sparse 会检查这个变量是否一直在同一种位方式(big-endian, little-endian或其他)下被使用,
如果此变量在多个位方式下被使用了, Sparse 会给出警告.
F:types.h include/linux/ P157typedef unsigned __bitwise__ gfp_t;
3. Sparse 在编译内核中的使用
用 Sparse 对内核进行静态分析非常简单.
# 检查所有内核代码 make C=1 检查所有重新编译的代码 make C=2 检查所有代码, 不管是不是被重新编译
文章参考:
http://www.cnblogs.com/wang_yb/p/3575039.html