首页>>科技 >>内容

linux内核代码的静态检查是什么,Linux内核代码的静态检查

发布时间:2023-07-17 20:08:30编辑:温柔的背包来源:

linux内核代码的静态检查是什么,Linux内核代码的静态检查

很多朋友对linux内核代码的静态检查是什么,Linux内核代码的静态检查不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

1. Sparse 简介Linus 在2004 年开发了一种内核代码静态检查工具,可以检测内核中存在潜在风险的代码。 Sparse利用gcc的扩展属性__attribute__和自己定义的__context__来对代码进行静态检查,重点检查变量类型和内核代码中的各种锁。

那么如何指定代码可以被Sparse检查呢?以__iomem为例,可以将要检查的变量类型放在特定的文件中,并用__CHECKER__进行限制。

#ifdef __checker __#define __user __attribute __ ((NodeRef, Address_space (1)))#define __kernel __attribute __((Address_space(0)))#define __saf e __attribute __((Safe))#define __Force __attribute __(( Force))# 定义__nocast __attribute__((nocast))# 定义__iomem __attribute__((noderef, address_space(2)))# 定义__must_hold(x) __attribute__((context(x,1,1)))# 定义__acquires(x ) __attribute__((context( x,0,1)))# 定义__releases(x) __attribute__((context(x,1,0)))# 定义__acquire(x) __context__(x,1)# 定义__release(x ) __context__(x,- 1)#define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0)#define __percpu __attribute__((noderef, address_space(3)))#定义__rcu __attribute__((noderef , address_space(4)))# 定义__private __attribute__((noderef))extern void __chk_user_ptr(const 易失性void __user *);extern void __chk_io_ptr(const 易失性void __iomem *);#define ACCESS_PRIVATE(p, member) (*(( typeof((p)- member) __force *) (p)- member))#else # ifdef STRUCTLEAK_PLUGIN#define __user __attribute__((user))# else#define __user# endif # 定义__kernel# 定义__safe # 定义__force# 定义__nocast# 定义__iomem# 定义__chk_user_ptr(x) (void)0# 定义__chk_io_ptr(x) (void)0# 定义__builtin_warning(x, y.) (1)#定义__must_hold(x)# 定义__acquires(x)# 定义__releases(x)# 定义__acquire(x) (void)0# 定义__release(x) (void)0# 定义__cond_lock(x,c) (c)# 定义__percpu# 定义__rcu# 定义__private# 定义ACCESS_PRIVATE(p, 成员) ((p)- 成员)#endif 2.安装Sparse工具一般来说,开发环境中没有Sparse工具,需要手动安装,否则会报如下错误:

ubuntu16@ubuntu16:linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 C=2 检查脚本/mod/empty.c/bin/sh: 1:稀疏:未找到脚本/Makefile.build:261: t目标'脚本/mod的配方/empty .o '失败获取稀疏代码ubuntu16@ubuntu16: ~ $ git clone git: //git.kernel.org/pub/scm/devel/sparse.gitcloning'sparser '. Remote: 枚举对象: 17, Done.remote: 计数对象: 100%(17/17),done.remote: 压缩对象: 100%(17/17),done.remote: 总计20026(增量6),重用0(增量0),打包重用20009接收对象333 60 100%(20026/20026),4.29 MiB | 924.00 KiB/s,完成。解析deltas: 100% (14035/14035),完成。检查连接.完成。编译Sparseubuntu16@ubuntu16:~$ cd稀疏/ubuntu16@ubuntu16:spar se$ makeMakefile:152: 你的系统没有libxml,禁用c2xmlMakefile:170: 你的系统没有sqlite3,禁用sendMakefile:192: 你的系统没有gtk3/gtk2,禁用test-inspectMakefile:226: 您的系统没有有llvm,禁用稀疏-llvm install Sparseubuntu16@ubuntu16:sparse$ make install Makefile:152: 您的系统没有libxml ,禁用c2xmlMakefile:170: 您的系统没有sqlite3,禁用semindMakefile:192: 您的系统没有gtk3/gtk2,禁用test-inspectMakefile:226: 您的系统没有h ave llvm,禁用稀疏-llvmINSTALL /home/ubuntu16/bin/sparseINSTALL /home/ubuntu16/bin /cgccINSTALL /home/ubuntu16/share/man/man1/sparse.1INSTALL /home/ubuntu16/share/man/man1/cgcc .1ubuntu16@ubuntu16:sparse$3。执行Sparse静态检查从内核的顶层Makefile可以看出,编译内核时通过指定C=1或C=2,就可以调用Sparse进行代码静态检查。

192 # 调用源代码检查器(默认情况下为“稀疏”)作为193 # C 编译的一部分。 194 #195 # 使用'make C=1'来启用仅检查重新编译的文件。 196 # 使用'make C=2'来启用对*所有*源文件的检查,无论197 #它们是否重新编译。198 #199 #请参阅文件'Documentation/dev-tools/sparse.rst'更多详细信息,200 # 包括从哪里获取“稀疏”实用程序。执行结果:

ubuntu16@ubuntu16:linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 C=2 检查脚本/mod/empty.c 调用脚本/atomic/check-atomics.sh 调用脚本/checksyscalls.sh 检查arch/arm/vfp/vfpmodule.c 检查init/main.carch/arm/vfp/vfpmodule.c:38:17: warning: 符号“vfp_vector”未声明。它应该是静态的吗? arch/arm/vfp/vfpmodule.c:56333 6017: warning: 符号“vfp_current_hw_state”未声明。它应该是静态的吗?arch/arm/vfp/vfpmodule.c:323:6: warning: 符号“VFP_bounce”未声明。它应该是静态的吗? arch/arm/vfp/vfpmodule.c:714:63336 0 warning: 符号“kernel_neon_begin”未声明。它应该是静态的吗?arch/arm/vfp/vfpmodule.c:745:6: warning: 符号“kernel_neon_end”未声明。应该是静态的吗?

以上知识分享希望能够帮助到大家!