- 论坛徽章:
- 0
|
解决问题了,没有删掉该宏,而是把compiler.h头文件加上了(相同内核版本的).
但它的用处我还是不太明白.
我从网上找了一篇文章:
以前在 MSDN 版曾提到过 Windows 的 Prefast,Linux 内核开发也有类似的东西,
叫做 sparse,编译内核的时候 make C=1 或者 make C=2,就会调用 sparse,同时
定义 __CHECKER__ 预处理宏。
检查的方式都很类似,就是加伪关键字,微软加在 __declspec__ 里,sparse 则
加在 __attribute__ 里,异曲同工啊。
include/linux/compiler.h
#ifdef __CHECKER__
7 # define __user __attribute__((noderef, address_space(1)))
8 # define __kernel /* default address space */
9 # define __safe __attribute__((safe))
10 # define __force __attribute__((force))
11 # define __nocast __attribute__((nocast))
12 # define __iomem __attribute__((noderef, address_space(2)))
13 # define __acquires(x) __attribute__((context(0,1)))
14 # define __releases(x) __attribute__((context(1,0)))
15 # define __acquire(x) __context__(1)
16 # define __release(x) __context__(-1)
17 # define __cond_lock(x) ((x) ? ({ __context__(1); 1; }) : 0)
18 extern void __chk_user_ptr(void __user *);
19 extern void __chk_io_ptr(void __iomem *);
20 #else
21 # define __user
22 # define __kernel
23 # define __safe
24 # define __force
25 # define __nocast
26 # define __iomem
27 # define __chk_user_ptr(x) (void)0
28 # define __chk_io_ptr(x) (void)0
29 # define __builtin_warning(x, y...) (1)
30 # define __acquires(x)
31 # define __releases(x)
32 # define __acquire(x) (void)0
33 # define __release(x) (void)0
34 # define __cond_lock(x) (x)
35 #endif
这些陌生的 __attribute__ 里的东西都是 gcc 文档理查不到的,这些就是 sparse
认识的东西了,程序员使用这些新的 __attribute__ 提供更多地语义,sparse 则为
程序员做更多的检查。 |
|