4.2.代码检查工具¶

至少目前,编写无错误代码仍然是我们中很少人能达到的理想状态。不过,我们希望做

的是,在代码进入主线内核之前,尽可能多地捕获并修复这些错误。为此,内核开发人

员已经组装了一系列令人印象深刻的工具,可以自动捕获各种各样的模糊问题。计算机

发现的任何问题都是一个以后不会困扰用户的问题,因此,只要有可能,就应该使用

自动化工具。

第一步只是注意编译器产生的警告。当代版本的GCC可以检测(并警告)大量潜在错误。

通常,这些警告都指向真正的问题。提交以供审阅的代码通常不会产生任何编译器警告。

在消除警告时,注意了解真正的原因,并尽量避免“修复”,使警告消失而不解决其原因。

请注意,并非所有编译器警告都默认启用。使用“make KCFLAGS=-W”构建内核以

获得完整集合。

内核提供了几个配置选项,可以打开调试功能;大多数配置选项位于“kernel hacking”

子菜单中。对于任何用于开发或测试目的的内核,都应该启用其中几个选项。特别是,

您应该打开:

启用 ENABLE_MUST_CHECK and FRAME_WARN 以获得一组额外的警告,以解决使用不

推荐使用的接口或忽略函数的重要返回值等问题。这些警告生成的输出可能是冗长

的,但您不必担心来自内核其他部分的警告。

DEBUG_OBJECTS 将添加代码,以跟踪内核创建的各种对象的生存期,并在出现问题时

发出警告。如果要添加创建(和导出)自己的复杂对象的子系统,请考虑添加对对象

调试基础结构的支持。

DEBUG_SLAB 可以发现各种内存分配和使用错误;它应该用于大多数开发内核。

DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP and DEBUG_MUTEXES 会发现许多常见的

锁定错误.

还有很多其他调试选项,其中一些将在下面讨论。其中一些具有显著的性能影响,不应

一直使用。但是,在学习可用选项上花费的一些时间可能会在短期内得到多次回报。

其中一个较重的调试工具是锁定检查器或“lockdep”。该工具将跟踪系统中每个锁

(spinlock或mutex)的获取和释放、获取锁的相对顺序、当前中断环境等等。然后,

它可以确保总是以相同的顺序获取锁,相同的中断假设适用于所有情况,等等。换句话

说,lockdep可以找到许多场景,在这些场景中,系统很少会死锁。在部署的系统中,

这种问题可能会很痛苦(对于开发人员和用户而言);LockDep允许提前以自动方式

发现问题。具有任何类型的非普通锁定的代码在提交包含前应在启用lockdep的情况

下运行。

作为一个勤奋的内核程序员,毫无疑问,您将检查任何可能失败的操作(如内存分配)

的返回状态。然而,事实上,最终的故障恢复路径可能完全没有经过测试。未测试的

代码往往会被破坏;如果所有这些错误处理路径都被执行了几次,那么您可能对代码

更有信心。

内核提供了一个可以做到这一点的错误注入框架,特别是在涉及内存分配的情况下。

启用故障注入后,内存分配的可配置百分比将失败;这些失败可以限制在特定的代码

范围内。在启用了故障注入的情况下运行,程序员可以看到当情况恶化时代码如何响

应。有关如何使用此工具的详细信息,请参阅

Fault injection capabilities infrastructure。

使用“sparse”静态分析工具可以发现其他类型的错误。对于sparse,可以警告程序员

用户空间和内核空间地址之间的混淆、big endian和small endian数量的混合、在需

要一组位标志的地方传递整数值等等。sparse必须单独安装(如果您的分发服务器没

有将其打包,可以在 https://sparse.wiki.kernel.org/index.php/Main_page)找到,

然后可以通过在make命令中添加“C=1”在代码上运行它。

“Coccinelle”工具 http://coccinelle.lip6.fr/

能够发现各种潜在的编码问题;它还可以为这些问题提出修复方案。在

scripts/coccinelle目录下已经打包了相当多的内核“语义补丁”;运行

“make coccicheck”将运行这些语义补丁并报告发现的任何问题。有关详细信息,请参阅

其他类型的可移植性错误最好通过为其他体系结构编译代码来发现。如果没有S/390系统

或Blackfin开发板,您仍然可以执行编译步骤。可以在以下位置找到一组用于x86系统的

大型交叉编译器:

花一些时间安装和使用这些编译器将有助于避免以后的尴尬。

linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation相关推荐

  1. 【Linux 】内核签名(签名内核模块)、linux 驱动签名、安装特定版本的 kernel-devel

    Linux 内核签名 Linux 内核签名(签名内核模块).linux 驱动签名_西京刀客-CSDN博客_linux内核签名 安装特定版本的 kernel-devel 两种方法. 一.yum 安装 查 ...

  2. linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  3. linux编译内核时出现问题:recipe for target ‘kernel/timeconst.h‘ failed

    百度上有很多解决办法,说的是将/timeconst.ql文件中第373行的defined()去掉 但是我找遍了整个目录都没有看见有.ql的文件 后来我发现其实只需要安装bc就可以完成编译了 sudo ...

  4. 如何阅读linux软件程序代码,如何阅读linux源代码

    如何阅读linux源代码 随着linux的逐步普及,现在有不少人对于Linux的安装已经比较熟悉了.与Linux的蓬勃发展相适应,想深入了解Linux的也越来越多.而要想深入了解Linux,就需要阅读 ...

  5. linux 的内核参数优化,Linux服务器内核参数优化

    Linux服务器内核参数优化 cat >> /etc/sysctl.conf << EOF #kernel optimization net.ipv4.tcp_fin_time ...

  6. Linux 编译内核且增加一个系统调用

    Linux 编译内核且增加一个系统调用 文章目录 Linux 编译内核且增加一个系统调用 一.在添加系统调用之前需要先编译一个Linux的内核. 解压 安装依赖 编译 安装内核 二.系统调用 声名和定 ...

  7. 初识Linux操作系统,Linux的特点与其他操作系统的区别,及Linux版本划分

    操作系统 操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控制输入设备与输出设备.操作网络与管理文件系统等 ...

  8. 浅谈Linux内核编程规范与代码风格

    1 缩进 Tab的宽度是八个字符,因此缩进的宽度也是八个字符.有些异教徒想让缩进变成四个字符,甚至是两个字符的宽度,这些人和那些把 PI 定义为 3 的人是一个路子的. 注意:缩进的全部意义在于清晰地 ...

  9. 2012-Linux-18(使U-BOOT能正确引导LINUX for 1_20 error,but...)-1

    1.为了能使得U-BOOT正确引导linux内核.必须传递合适的参数给内核. 修改include/configs/zj2410.h如下: -- -- /************************ ...

最新文章

  1. MySQL group replication
  2. linq调用mysql函数_如何为linq对象制作一个展平函数(Linq To Entities for mysql)?
  3. 云炬金融每日一题20210906
  4. 微信小程序开发系列教程三:微信小程序的调试方法
  5. Java 7中对String.substring的更改
  6. C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string
  7. LeetCode 1305. 两棵二叉搜索树中的所有元素(二叉树迭代器)
  8. 标签页 html实现,htmlcssjs实现tab标签页示例代码.pdf
  9. postgresql9.1_gaussdb200_解析表结构
  10. fragment类中的点击事件空指针异常
  11. android - 小技巧合集(不断更新)
  12. weka API,创建线性回归时出现缺少no.uib.cipr.matrix和org.netlib.blas的解决方案
  13. 都说发展存储产业一定要走IDM模式,你怎么看?
  14. 各种定律(心理学定律、思考定律)
  15. C#实现程序一次打开两个窗口,两个窗口分别放置在两个屏幕
  16. Android MVP伴侣,Nucleus框架使用简介
  17. 判断方阵是否沿主对角线对称
  18. windows功能_Windows新功能全在这,新系统确实强大!
  19. 【魔方攻略】SQ1魔方教程(原创)
  20. 【T3】打印单据(非新打印)表头显示不全

热门文章

  1. 【Python3网络爬虫开发实战】1.3.1-lxml的安装
  2. 【技术角度看问题之一】ARM到底是个啥?
  3. 不会吧不会吧!不会有人还有没有用CSDN的浏览器插件吧!
  4. python3 循环语句 for语句和while语句
  5. 微信开发---微信网页授权、JS-SDK和微信公众号的基本设置
  6. mongodb更新操作符$min,$max
  7. android开发,加法,上课写的demo
  8. android socket 代理服务器,Android 使用Socket进行服务器通信
  9. 普通路由器改4g路由器_4G宽带随心用,办公娱乐更自由,蒲公英X4C路由器体验|路由器|蒲公英|宽带|wifi|sim...
  10. Java基础01 1个和2个区别比较