Linux内核代码的静态检查

嵌入式ARM 2023-05-22 12:03

1、Sparse介绍

Linus在2004年开发了kernel代码静态检查工具,可以检查出kernel中潜在的风险代码,Sparse通过 gcc 的扩展属性__attribute__ 以及自己定义的 __context__来对代码进行静态检查,重点检查kernel代码中的变量类型和各类锁。

具体可以参考kernel文档
Documentation/dev-tools/sparse.rst

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

#ifdef __CHECKER__
define __user  __attribute__((noderef, address_space(1)))
define __kernel __attribute__((address_space(0)))
define __safe  __attribute__((safe))
define __force __attribute__((force))
define __nocast __attribute__((nocast))
define __iomem __attribute__((noderef, address_space(2)))
define __must_hold(x) __attribute__((context(x,1,1)))
define __acquires(x) __attribute__((context(x,0,1)))
define __releases(x) __attribute__((context(x,1,0)))
define __acquire(x) __context__(x,1)
define __release(x) __context__(x,-1)
define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0)
define __percpu __attribute__((noderef, address_space(3)))
define __rcu  __attribute__((noderef, address_space(4)))
define __private __attribute__((noderef))
extern void __chk_user_ptr(const volatile void __user *);
extern void __chk_io_ptr(const volatile void __iomem *);
define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
#else /* __CHECKER__ */
ifdef STRUCTLEAK_PLUGIN
#  define __user __attribute__((user))
else
#  define __user
endif
define __kernel
define __safe
define __force
define __nocast
define __iomem
define __chk_user_ptr(x) (void)0
define __chk_io_ptr(x) (void)0
define __builtin_warning(x, y...) (1)
define __must_hold(x)
define __acquires(x)
define __releases(x)
define __acquire(x) (void)0
define __release(x) (void)0
define __cond_lock(x,c) (c)
define __percpu
define __rcu
define __private
define ACCESS_PRIVATE(p, member) ((p)->member)
#endif /* __CHECKER__ */

2、安装Sparse工具

通常来说,开发环境中没有Sparse工具,需要手动安装,否则报如下错误:

ubuntu16@ubuntu16:linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 C=2
  CHECK   scripts/mod/empty.c
/bin/sh: 1: sparse: not found
scripts/Makefile.build:261: recipe for target 'scripts/mod/empty.o' failed
  1. 获取Sparse代码
ubuntu16@ubuntu16:~$ git clone git://git.kernel.org/pub/scm/devel/sparse/sparse.git
Cloning into 'sparse'...
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 20026 (delta 6), reused 0 (delta 0), pack-reused 20009
Receiving objects: 100% (20026/20026), 4.29 MiB | 924.00 KiB/s, done.
Resolving deltas: 100% (14035/14035), done.
Checking connectivity... done.
  1. 编译Sparse
ubuntu16@ubuntu16:~$ cd sparse/
ubuntu16@ubuntu16:sparse$ make
Makefile:152: Your system does not have libxml, disabling c2xml
Makefile:170: Your system does not have sqlite3, disabling semind
Makefile:192: Your system does not have gtk3/gtk2, disabling test-inspect
Makefile:226: Your system does not have llvm, disabling sparse-llvm
  1. 安装Sparse
ubuntu16@ubuntu16:sparse$ make install
Makefile:152: Your system does not have libxml, disabling c2xml
Makefile:170: Your system does not have sqlite3, disabling semind
Makefile:192: Your system does not have gtk3/gtk2, disabling test-inspect
Makefile:226: Your system does not have llvm, disabling sparse-llvm
INSTALL /home/ubuntu16/bin/sparse
INSTALL /home/ubuntu16/bin/cgcc
INSTALL /home/ubuntu16/share/man/man1/sparse.1
INSTALL /home/ubuntu16/share/man/man1/cgcc.1
ubuntu16@ubuntu16:sparse$ 

3、执行Sparse静态检查

从kernel顶层Makefile中可以看出,当编译kernel时通过指定C=1C=2,可以调用到Sparse进行代码静态检查。

192 # Call a source code checker (by default, "sparse") as part of the
193 # C compilation.
194 #
195 # Use 'make C=1' to enable checking of only re-compiled files.
196 # Use 'make C=2' to enable checking of *all* source files, regardless
197 # of whether they are re-compiled or not.
198 #
199 # See the file "Documentation/dev-tools/sparse.rst" for more details,
200 # including where to get the "sparse" utility.

执行结果:

ubuntu16@ubuntu16:linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 C=2
  CHECK   scripts/mod/empty.c
  CALL    scripts/atomic/check-atomics.sh
  CALL    scripts/checksyscalls.sh
  CHECK   arch/arm/vfp/vfpmodule.c
  CHECK   init/main.c
arch/arm/vfp/vfpmodule.c:38:17: warning: symbol 'vfp_vector' was not declared. Should it be static?
arch/arm/vfp/vfpmodule.c:56:17: warning: symbol 'vfp_current_hw_state' was not declared. Should it be static?
arch/arm/vfp/vfpmodule.c:323:6: warning: symbol 'VFP_bounce' was not declared. Should it be static?
arch/arm/vfp/vfpmodule.c:714:6: warning: symbol 'kernel_neon_begin' was not declared. Should it be static?
arch/arm/vfp/vfpmodule.c:745:6: warning: symbol 'kernel_neon_end' was not declared. Should it be static?
...

END

来源:Linux与SoC

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
嵌入式开发成本有多高?
【非常C结构】简单而不失强大的表格
状态机——单片机的万能语言(附代码)

→点关注,不迷路←

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论 (0)
  • 《哪吒2》票房破百亿背后的科技密码:解码中国动画产业的技术跃迁与制造底气2024年夏季,国产动画电影《哪吒2》以雷霆之势席卷全球院线,不仅成为中国影史第二部票房突破百亿的现象级作品,更以多项技术突破刷新行业纪录。这些成就背后,不仅是中国动画工业的崛起,更是中国科技创新与高端制造业协同突破的缩影。作为深耕PCB行业多年的捷多邦小编,今天带您从技术视角,解读这场银幕奇迹背后的制造密码。一、从“数字造神”到“算力革命”:动画技术背后的硬核突破《哪吒2》的视觉革命始于AI工业化管道的深度应用。影片中大量
    捷多邦 2025-02-15 17:57 457浏览
  •  电磁铁的磁芯材质:软铁还是硬铁电磁铁的磁芯通常采用软铁材质,因其具有高磁导率和低矫顽力,使得电磁铁能够在通电时迅速产生强磁场,断电后磁场又能迅速消失。一、电磁铁与磁芯材质电磁铁是一种利用电流产生磁场的装置。其核心部件——磁芯,对电磁铁的性能有着至关重要的影响。在选择磁芯材质时,需要考虑多种因素,如磁导率、矫顽力、饱和磁化强度等。这些因素直接关系到电磁铁的工作效率、响应速度和能耗等方面。二、软铁与硬铁的特性软铁和硬铁是两种常见的磁性材料。软铁具有高磁导率和低矫顽力的特点,这意味着它容易
    锦正茂科技 2025-02-18 10:32 38浏览
  • 在设备间通信日益增长的需求中,对于十几米甚至更长距离的高速外设数据传输变得尤为重要。RS-232C接口,凭借其仅需简单的接收、发送及地线配置,以及成本效益高的双绞线连接,凭借其卓越性能,成为了连接通信接口芯片的关键纽带。为了在这种长距离高速通信场景下实现线路的可靠隔离,并有效抵御外部噪声对通信信号的干扰,虽然上一期介绍的晶体管类型输出系列光耦能够满足100kbps速率的隔离传输需求,但面对更高的速率稳定性和性能要求,业界更倾向于采用速率可达300Kbps的KL6N138和KL6N139达林顿高速
    晶台光耦 2025-02-14 13:40 68浏览
  • 清晨,闹钟准时响起,窗帘自动拉开,床灯随之亮起,音箱中则自动传出每日的早间新闻,从而唤醒熟睡中的你,而这只是智能家居中的冰山一角。作为人类群体追求更高生活品质的居住空间,智能家居正飞速普及至我们的日常生活之中,极大地提升了生活的便利性与舒适度。然而,随着单品智能向全屋智能的快速发展,不同智能家居设备的工作电压与通信频率等运行参数存在差异,它们共同运行在一个智能家居系统之中,其所产生的电气噪声与电磁干扰会互相影响,并形成潜在的安全隐患。例如,电气噪声可能导致线路过热,增加电气火灾的发生风险;电磁干
    华普微HOPERF 2025-02-18 10:48 51浏览
  •  探针台是半导体测试领域的重要设备,用于支撑和固定待测芯片,以便进行jing确的电气测试。在使用过程中,探针台可能会出现位置偏移,这时就需要进行复位操作。下面,我们将详细介绍探针台复位的zui简单三个步骤。  一、确定复位基准点复位操作的di一步是确定复位基准点。通常,探针台会配备有明确的复位标记或感应点。用户需要仔细查找并确认这些标记,确保复位操作的准确性。找到基准点后,将探针台移动到该位置附近,准备进行下一步操作。二、执行复位动作在确认基准点后,接下来需要执行复
    锦正茂科技 2025-02-15 09:36 97浏览
  • 2025,新一轮汽车行业“战争”开始,但这一次不是过往的“价格战”,而是新一轮的“智驾战”。近期,比亚迪董事长兼总裁王传福在比亚迪智能化战略发布会上表示:“比亚迪将全系搭载“天神之眼”高阶智驾系统,其中首批21款车型将陆续上市,包括秦家族、元家族、宋家族、海豹家族等。”具体来看,20万元以上、15万元至20万元、10万元至15万元级别的车型将全系标配“天神之眼”。10万元以下的车型多数将搭载“天神之眼”,包括海鸥、海豹05DM-i和第二代秦PLUS DM-i。智驾不是什么新鲜技术,但是在比亚迪之
    刘旷 2025-02-18 10:19 58浏览
  • 近日,紫光展锐蜂窝物联网芯片V8850荣获国密一级认证,标志着展锐V8850在安全能力方面获得权威认可,位居行业领先水平。这是紫光展锐继短距物联网芯片V5663在2020获得ARM PSA Level 2认证,蜂窝物联网芯片V8811在2021年获得ARM PSA Level 1 认证后,第三次荣获安全行业权威认证。荣获国密一级安全认证,意味着紫光展锐V8850能支持智能支付、共享经济、定位追踪、安防监控、智能表计、工业DTU、公网对讲,以及车载通信终端设备上的国密升级改造,可为移动支付、短信
    紫光展锐 2025-02-14 19:26 80浏览
  • 导读:2025年1月6日,在 ChatGPT 诞生两周年之际,OpenAI 的核心人物 Sam Altman 回顾了一段波澜壮阔且充满挑战的历程。九年前,怀揣着对通用人工智能(AGI)的坚定信念,OpenAI 踏上征程。彼时,质疑声不绝于耳,多数人认为这毫无成功的可能。但他们未曾动摇,毅然投身这一充满未知的领域。直至 2022 年 ChatGPT 的推出,如同在科技领域投入巨石,引发轩然大波,开启了前所未有的发展态势。然而,荣耀背后是难以想象的艰难。围绕新技术构建公司,犹如在黑暗中摸索前行,每一
    用户1739588245528 2025-02-15 11:03 160浏览
  • 电磁铁通电时会产生磁场,磁力随电流增强而增强,表现出吸引铁磁性物质的特性。电磁铁是一种能够产生磁场的装置,其特性在于可以通过通电来控制磁场的产生和消失。那么,当电磁铁通电时,它具体会表现出哪些特性和现象呢?一、产生磁场通电是电磁铁产生磁场的关键。当电流通过电磁铁的线圈时,线圈周围就会产生磁场。这个磁场与电流的大小和方向密切相关,电流越大,产生的磁场也越强。同时,磁场的方向可以通过改变电流的方向来改变,这是电磁铁灵活性的重要体现。二、磁力变化随着电流的增强,电磁铁产生的磁力也会相应增强。这种磁力的
    锦正茂科技 2025-02-15 09:59 138浏览
  • 概述        TC10 为OPEN Alliance 中的一个技术委员会小组,专注于研究基于车载以太网的休眠唤醒机制,旨在为汽车应用场景提供灵活的休眠唤醒解决方案。该小组提出的休眠唤醒规范(《TC10 Sleep/Wake-up Specification》,以下简称TC10规范)作为对IEEE 802.3系列规范的补充,详细定义了以太网PHY的休眠唤醒过程、新增服务原语和接口、时间参数、指令描述等内容。目前,TC10已经发布了适配10Ba
    经纬恒润 2025-02-18 14:30 79浏览
  •         电磁铁作为一种能够利用电流产生磁性的装置,在现代社会的生产和生活中发挥着越来越重要的作用。其应用范围广泛,不仅局限于工业制造领域,还深入到交通运输、医疗健康以及我们的日常生活之中。一、电磁铁在工业制造中的应用       在工业制造领域,电磁铁的应用可谓是举足轻重。它们被广泛应用于各种机械设备和生产线中,起着自动化控制、物料搬运等关键作用。例如,在重型机械中,电磁铁用于吸附和移动大型金属构件
    锦正茂科技 2025-02-18 10:05 57浏览
  • 嘿,大家好!在高压电子世界里摸爬滚打的朋友们,你们有没有遇到过这样的难题?那就是,如何选择适合高压环境的光颉精密电阻? 这可不是一个简单的问题,毕竟在高压环境下,电阻不仅要顶得住电压的“压力”,还得保证精度和稳定性,这要求可真不低。想想看,如果选错了电阻,就像给跑车装了个自行车轮,那能行吗?肯定不行!轻则电路性能大打折扣,重则电阻直接“罢工”,甚至引发更严重的后果。所以说,在高压应用中,选择一款靠谱的光颉精密电阻,那可是至关重要的。别担心,今天咱们就来好好聊聊,如何选择适合高压环境的光
    贞光科技 2025-02-18 17:28 76浏览
  •                           春天来了,我们中国的传统节日--春节到了,随着国家富强,人们民族文化自信心的增强,这个中国年过的还挺热闹,挺红火。一段山村过新年的快乐时光,即兴而发赋了两首新诗。《渔家乐·山村新春》白发垂髫同喜乐,新春佳节意情奢。烟花璀璨腾空起,山村美景醉心涯。晓雾轻笼林野静,晚云淡抹岫峰斜。自然恩赐千般好,福满人间岁月嘉
    广州铁金刚 2025-02-17 15:59 117浏览
  • 随着国内市场的逐渐稳固,华为将目光投向了广阔的海外市场,开启了一段充满挑战与机遇的国际化征程。然而,华为在拓展海外市场时,遭遇了重重困难。文化差异带来的挑战不同国家和地区有着不同的文化背景、商业习惯和价值观,这使得华为在与当地客户、合作伙伴沟通和合作时面临诸多障碍。在欧洲,一些客户对产品的认证标准和售后服务有着非常严格的要求,并且注重商务活动中的礼仪和沟通方式。在机上欧洲通信市场竞争激烈,爱立信、诺基亚等本土企业在技术、品牌和市场份额上具有优势。而且欧洲各国的通信标准和监管政策不同,华为需要满足
    韭菜财经 2025-02-18 14:11 131浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦