【开发工具】【sparse】Linux下代码检测工具(sparse)的使用

2023-11-13

获取更多相关的嵌入式开发工具,可收藏系列博文,持续更新中:
【开发工具】嵌入式常用开发工具汇总帖


Linux内核源码里其实包含了相应的代码检测工具【sparse】,位置在:

Documentation/dev-tools/sparse.rst

Documentation/translations/zh_CN/sparse.txt

Documentation/dev-tools/sparse.rst 的中文翻译

以下为正文

---------------------------------------------------------------------

使用 sparse 工具做类型检查

~~~~~~~~~~~~~~~~~~~~~~~~~~

"__bitwise" 是一种类型属性,所以你应该这样使用它:

typedef int __bitwise pm_request_t;

enum pm_request {
        PM_SUSPEND = (__force pm_request_t) 1,
        PM_RESUME = (__force pm_request_t) 2
};

这样会使 PM_SUSPEND 和 PM_RESUME 成为位方式(bitwise)整数(使用"__force"

是因为 sparse 会抱怨改变位方式的类型转换,但是这里我们确实需要强制进行转

换)。而且因为所有枚举值都使用了相同的类型,这里的"enum pm_request"也将

会使用那个类型做为底层实现。

而且使用 gcc 编译的时候,所有的 __bitwise/__force 都会消失,最后在 gcc

看来它们只不过是普通的整数。

坦白来说,你并不需要使用枚举类型。上面那些实际都可以浓缩成一个特殊的"int

__bitwise"类型。

所以更简单的办法只要这样做:

typedef int __bitwise pm_request_t;

#define PM_SUSPEND ((__force pm_request_t) 1)
#define PM_RESUME ((__force pm_request_t) 2)

现在你就有了严格的类型检查所需要的所有基础架构。

一个小提醒:常数整数"0"是特殊的。你可以直接把常数零当作位方式整数使用而

不用担心 sparse 会抱怨。这是因为"bitwise"(恰如其名)是用来确保不同位方

式类型不会被弄混(小尾模式,大尾模式,cpu尾模式,或者其他),对他们来说

常数"0"确实是特殊的。

获取 sparse 工具

~~~~~~~~~~~~~~~~

你可以从 Sparse 的主页获取最新的发布版本:

http://www.kernel.org/pub/linux/kernel/people/josh/sparse/

或者,你也可以使用 git 克隆最新的 sparse 开发版本:

git://git.kernel.org/pub/scm/linux/kernel/git/josh/sparse.git

DaveJ 把每小时自动生成的 git 源码树 tar 包放在以下地址:

http://www.codemonkey.org.uk/projects/git-snapshots/sparse/

一旦你下载了源码,只要以普通用户身份运行:

make

make install

它将会被自动安装到你的 ~/bin 目录下。

使用 sparse 工具

~~~~~~~~~~~~~~~~

用"make C=1"命令来编译内核,会对所有重新编译的 C 文件使用 sparse 工具

或者使用"make C=2"命令,无论文件是否被重新编译都会对其使用 sparse 工具

如果你已经编译了内核,用后一种方式可以很快地检查整个源码树。

make 的可选变量 CHECKFLAGS 可以用来向 sparse 工具传递参数。编译系统会自

动向 sparse 工具传递 -Wbitwise 参数。

或者使用sparse工具编译普通的代码:

root@ubuntu:~# gcc test.c
root@ubuntu:~# 
root@ubuntu:~# sparse test.c
test.c:35:6: warning: symbol 'run' was not declared. Should it be static?
test.c:35:6: warning: context imbalance in 'run' - wrong count at exit

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【开发工具】【sparse】Linux下代码检测工具(sparse)的使用 的相关文章

  • 一文拿下弱网测试:3大弱网模拟工具的配置、场景弱网原因分析、面试题目……

    软件质量不是口头说说 要实际做起来 正文开始 如果app没有对各种网络异常进行兼容处理 那么用户可能在日常生活中遇到APP闪退 ANR 数据丢失等问题 因此 app网络测试 特别是弱网测试尤为重要 本文梳理了app网络测试要点和弱网测试常用
  • 2023年1月16日--2023年1月22日(osg+glsl+socket+ue, 本周20小时,合计1879小时,剩余8121小时)

    目前 ue视频教程进行到了zccs 预1 mysql 7 1 tf1 4 11 o s s 12 2 蓝图反射 1 9 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 57 Opengl 5 9 GL
  • 十三、传智书城项目设计

    项目源代码及sql脚本 一 项目概述 近年来 随着Internet的迅速崛起 互联网已成为收集信息的最佳渠道并逐步进入传统的流通领域 于是电子商务开始流行起来 越来越多的商家在网上建起在线商店 向消费者展示出一种新颖的购物理念 网上购物系统
  • yolo中iou_thres的含义及作用

    yolo中iou thres的含义及作用 iou thres 参数用于控制非极大值抑制 NMS 中的边界框合并阈值 较大的 iou thres 值会导致更多的边界框被合并 从而减少最终输出的边界框数量 是否将 iou thres 设置得更大
  • 图论进阶指南-银河(差分约束/DAG/tarjan)

    测评地址 题目大意 第一行给出两个整数N和M 之后M行 每行三个整数T A B 表示一对恒星 A B 之间的亮度关系 恒星的编号从1开始 如果T 1 说明A和B亮度相等 如果T 2 说明A的亮度小于B的亮度 如果T 3 说明A的亮度不小于B
  • 【STM32】串口初步使用

    本文只作为学习笔记 对串口进行一个简单的介绍 正确的使用方式还需要进行实际的调试 通信的类型 同步 异步 单工 双工 串行 并行 STM32的串口通信 配置片上外设的控制寄存器 通信双方进行相同的配置 约定共同的起始位 停止位 校验位 使得
  • Postman接口测试 —— 设置全局变量、参数传递、断言

    在能熟练使用postman运行接口请求后 会遇到一些问题 例如 我们的web网站一共有几十个接口 测试的时候如果要切换环境 这个时候要每个接口都要修改url的根路径 一个一个的改也太麻烦了 还有时候我们经常需要用到上一个接口的返回值 来作为
  • jQuery隔行变色

随机推荐

  • vant d的地址组件中文操作手册

    vant d的 学习手册 中文操作文档 开发指南 快速上手 基础组件 Empty 空状态 业务组件 地址列表 地址编辑 Area 省市区选择 Card 卡片 Contact 联系人 Coupon 优惠券选择器 GoodsAction 商品导
  • Oracle性能调整的误区

    共享服务器模式 MTS 集群技术 Clustering RAC 分区 并行处理 主要是并行查询 Oracle提供的这些特性确实是用来进行性能改善的 但我们往往忽略了对自身应用特性的分析 它们是否适合于我们 最近 通过对这方面知识的深入了解
  • 简析TCP的三次握手与四次分手原理

    简析TCP的三次握手与四次分手 TCP建立连接过程 第一次握手 建立连接 客户端发送连接请求报文段 将SYN位置为1 Sequence Number为x 然后 客户端进入SYN SEND状态 等待服务器的确认 第二次握手 服务器收到SYN报
  • Linux设备模型4 kobj_attribute

    在上文Linux设备模型 3 Kobject 实例中 我们介绍到如何使用default attribute Default attribute使用很方便 但不够灵活 比如上篇文章在Kobject一节中提到的那个例子 name和val这两个a
  • 单链表的操作(超详细),保证你看完不后悔

    新人小白的博客 希望大家多多关注 一起加油 共同成长 以后会经常更新哒 个人主页 收藏加关注 永远不迷路 数据结构系列 一 顺序表的操作 你真的学会了吗 二 顺序栈的基本操作 三 循环队列的基本操作 你学会了吗 文章目录 数据结构系列 前言
  • 2023浙江省赛“信息安全管理与评估“--Web渗透测试(高职组)

    2022全国职业技能大赛 信息安全管理与评估 高职组 任务书 2022全国职业技能大赛 信息安全管理与评估 任务书 第一阶段竞赛项目试题 第二阶段竞赛项目试题 第三阶段竞赛项目试题 任务2 Web渗透测试 2022全国职业技能大赛 信息安全
  • 发电厂指针仪表检测(YOLOv5训练)

    数据获取 最近在做工业指针仪表检测的项目 自己在网上爬取了3000多张图片 最后经过筛选得到了1214张质量好的图片 自己再进行精心标注 生成VOV格式的xml文件 训练 本人对其用yolov5进行训练后 效果显著 能够精准检测真实场景下仪
  • charles的使用

    一 charles的原理 1 1 Charles的原理 客户端向服务器发起HTTPS请求 Charles拦截客户端的请求 伪装成客户端向服务器进行请求 服务器向 客户端 实际上是Charles 返回服务器的CA证书 Charles拦截服务器
  • SQL学习记录1 --环境搭建, 初识数据库

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 ch00 环境搭建 0 1 MySQL 8 0 的安装 按照提示安装 几乎没遇到问题 有一步显示the specified port is already in use 是和
  • java基础-inputStream两次读取的方法

    场景描述 我们需要对同一个InputStream对象使用多次 比如 客户端从服务器获取数据 利用HttpURLConnection的getInputStream 方法获得Stream对象 需要将InputStream流读取获取相关参数 第一
  • windows消息机制

    windows消息机制 文章目录 windows消息机制 1 创建基本的窗口程序 2 消息传递的原理 1 消息类型 2 消息的传递 3 相应的发送消息的函数SendMessage PostMessage 1 创建基本的窗口程序 基本的窗口程
  • idea项目导入eclipse中步骤

    1 打开eclipse 右键import 找到需要导入的项目 2 重新配置tomcat 已经配置好了建议移除后重新添加 window preference 3 项目上右键 debug AS 发现没有 debug on server 这是没有
  • 【微信小程序】云开发环境的搭建

    准备工作 下载并安装微信开发者工具 微信开发者工具版本 Stable 1 05 2201240 一 双击打开 微信开发者工具 后 点击 新建小程序 二 根据自身项目需求创建小程序项目 注意事项 AppID 即微信小程序的 身份证号码 注册后
  • 初级学习02 Hello world

    1 安装jdk https www oracle com java technologies downloads java8 2 配置环境变量 3 安装notepad https qnw shaid top notepad index ht
  • Gitee搭建自己的图床

    CSDN前段时间的下拉广告和红包雨属实恶心人 现在打算逐步分离文章 而为了避免以后发生更换平台而导致不必要的麻烦 还是把图床单独分离出比较好 图床有商业收费的 如七牛 又拍云 阿里oss数据存储这些 会按空间和流量来收费 高稳定性 适合企业
  • Flutter 使用pageview无缝隙自动轮播教程

    导入要使用的轮播图片 List
  • win10安装cuda11.4及cudnn

    查看nvidia驱动版本 在windows终端键入nvidia smi 查看nvidia显卡驱动 显卡驱动的版本决定了CUDA的版本下限 如果出现上述的问题 则终端进入C Program Files NVIDIA Corporation N
  • Java实现简单的台球桌游戏

    Java实现简单台球桌问题 需求 使小球可以在桌面上移动 移动到桌面边缘将被弹回 显示小区的移动 素材 小球照片 桌球照片 程序源代码 package 桌球游戏 import java awt import javax swing publ
  • Qt--事件分发器

    写在前面 在 Qt 中 事件分发器 Event Dispatcher 是一个核心概念 用于处理 GUI 应用程序中的事件 事件分发器负责将事件从一个对象传递到另一个对象 直到事件被处理或被取消 每个继承自QObject或QObject的类都
  • 【开发工具】【sparse】Linux下代码检测工具(sparse)的使用

    获取更多相关的嵌入式开发工具 可收藏系列博文 持续更新中 开发工具 嵌入式常用开发工具汇总帖 Linux内核源码里其实包含了相应的代码检测工具 sparse 位置在 Documentation dev tools sparse rst Do