精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #5 使用checkpatch.pl检查补丁的格式
HACK #5 使用checkpatch.pl检查补丁的格式
本节介绍发布前检查补丁格式的方法。
Linux内核是由多个开发者进行开发的。因此,为了保持补丁评估与源代码的可读性,按照统一的规则进行编写是非常重要的。编写规则写在Linux内核源代码的Documentation/CodingStyle中。所有开发者必须先阅读规则内容,遵照这些规则进行编写后再将补丁发布到论坛上。
话虽如此,但要从一开始就将这些规则完全记住也是不太可能的。因此Linux内核的源码树内准备了用来检查补丁格式的脚本scripts/patchcheck.pl。下面将介绍使用这个脚本来检查补丁格式的方法。
检查格式的示例
首先,看一个对源代码进行一些简单修改并生成补丁的例子。在fs/namei.c内的符号链接系统调用(symbolic link system call)的入口函数中添加printk()。这个补丁wrong-patch-example.patch的内容如下所示。
From 6064092a8a276fa6e09755872193cfe1e4a16f42 Mon Sep 17 00:00:00 2001
From: Munehiro "Muuhh" Ikeda <m_ikeda@hogeraccho.com>
Date: Sun, 22 May 2011 14:54:58 -0700
Subject: [PATCH] wrong patch example
Added printk() on sys_symlink().
---
fs/namei.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/fs/namei.c b/fs/namei.c
index e3c4f11..d40214a 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2912,6 +2912,7 @@ out_putname:
SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *,
newname)
{
+ printk( KERN_DEBUG "[TRIAL] trying symlink: %s --> %s¥n",oldname,newname);
return sys_symlinkat(oldname,AT_FDCWD,newname);
}
--
1.7.4
当检查补丁的格式时,需在内核源码树的根下,以补丁文件名为变量执行scripts/checkpatch.pl。当不指定任何选项时,含有格式错误的行的内容也会输出。在这里如果指定--terse选项,就可以将各错误或警告的概要分别在1行中输出。
$ scripts/checkpatch.pl --terse wrong-patch-example.patch
wrong-patch-example.patch:19: WARNING: line over 80 characters
wrong-patch-example.patch:19: ERROR: space prohibited after that open parenthesis '('
wrong-patch-example.patch:19: ERROR: space prohibited before that close parenthesis ')'
wrong-patch-example.patch:25: ERROR: Missing Signed-off-by: line(s)
total: 3 errors, 1 warnings, 7 lines checked
短短1行的补丁,竟然输出了这么多的内容。这些内容依次分别是针对下列内容的错误或警告。
[警告]1行的字数超过80字。
[错误]前括号“(”后面有多余的空格。
[错误]后括号“)”前面有多余的空格。
[错误]没有Signed-off-by(补丁发布人的署名)。
前3个是关于编写规则的错误或警告,最后1个是编写规则之外的补丁格式的错误。
对这些错误进行修改,将较长的行分成两行,删除不需要的空格并添加在Signed-off-by后,补丁的内容就如下所示。
From cb24866e8c989f55abebc3e6bf879cf3d17d3e87 Mon Sep 17 00:00:00 2001
From: Munehiro "Muuhh" Ikeda <m_ikeda@hogeraccho.com>
Date: Sun, 22 May 2011 14:54:58 -0700
Subject: [PATCH] correct patch example
Added printk() on sys_symlink().
Signed-off-by: Munehiro "Muuhh" Ikeda <m_ikeda@hogeraccho.com>
---
fs/namei.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/fs/namei.c b/fs/namei.c
index e3c4f11..1c47443c 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2912,6 +2912,8 @@ out_putname:
SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
{
+ printk(KERN_DEBUG "[TRIAL] trying symlink: %s --> %s亸n",
+ oldname,newname);
return sys_symlinkat(oldname,AT_FDCWD,newname);
}
--
1.7.4
使用checkpatch.pl输出的主要错误或警告
scripts/checkpatch.pl输出的错误或警告有很多种,其中有一些比较具有代表性的,如下所示。在编写的阶段就应当充分注意它们。
错误
换行符为DOS格式(CR+LF)。
行首、行尾有多余的空格。
不是用制表符,而是用空格缩进。
switch语句和case语句的缩进不一致。
函数定义块(block)以外的“{”写在独立的行中。
注释符使用的是“//”。
全局变量或静态变量是明确指定以0初始化的。
前括号“(”或“[”后面有多余的空格。
后括号“)”或“]”前面有多余的空格。
逗号“,”后面没有空格。
if、for、while的前括号“(”前面没有空格。
else未与if块结尾的“}”写在同一行。
使用了将来要废弃的头文件或函数。
补丁内没有Signed-off-by行。
警告
补丁内含有的路径起点不是内核源码树的根目录。
1行的长度超过80字。
制表符前面有空格。
const关键词的使用方法有问题。
printk()没有指定输出级别(KERN_*)。
goto的分支终点的标签label缩进。
用“{}”括住了只有1行的代码块。
使用了volatile修饰符。
kmalloc()的返回值已经转换。
小结
使用scripts/checkpatch.pl可以在投稿前检查补丁的格式。将补丁列入邮件列表时,经常可以看到“未按照规则编写,请修改”的提示。一定要在发布前检查补丁的格式,才能集中对补丁内容进行讨论。
参考文献
Documentation/CodingStyle(内核源文档)
—Munehiro IKEDA
精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #5 使用checkpatch.pl检查补丁的格式的更多相关文章
- 《Linux内核精髓:精通Linux内核必会的75个绝技》目录
1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核
HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap
HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap.ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块
HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...
- 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #8 调度策略
HACK #8 调度策略 本节介绍Linux的调度策略(scheduling policy).Linux调度策略的类别大致可以分为TSS(Time Sharing System,分时系统)和实时系统这 ...
- 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #7 Cgroup、Namespace、Linux容器
HACK #7 Cgroup.Namespace.Linux容器 本节将介绍Cgroup与Namespace以及通过这两个功能实现的容器功能.CgroupCgroup(control group)是将 ...
- 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #4 如何使用Git
HACK #4 如何使用Git 本节介绍Git的使用方法.Git是Linux内核等众多OSS(Open Source Software,开源软件)开发中所使用的SCM(Source Code Mana ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE
HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #20 使用fio进行I/O的基准测试
HACK #20 使用fio进行I/O的基准测试 本节介绍使用fio进行模拟各种情况的I/O基准测试的操作方法.I/O的基准测试中有无数需要考虑的因素.是I/O依次访问还是随机访问?是通过read/w ...
随机推荐
- jquery和dom对象相互转化的方法
jQuery对象转成DOM对象: 两种转换方式将一个jQuery对象转换成DOM对象:[index]和.get(index); (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得 ...
- 《剑指offer》习题解答(C/C++)
1.二维数组中的查找 /* 题目:在一个二维数组中,没一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- mysqlbinlog初识
mysql-binlog->解析mysql的binlog日志 mysql的binlog日志是什么? 数据目录下的日下文件就是mysql的binlog日志 mysql-bin.00001 mysq ...
- 143. Long Live the Queen 树形dp 难度:0
143. Long Live the Queen time limit per test: 0.25 sec. memory limit per test: 4096 KB The Queen of ...
- hdu 6144 Arithmetic of Bomb
Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Alpha阶段第1周 Scrum立会报告+燃尽图 06
作业要求与https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246相同 一.小组介绍 组长:刘莹莹 组员:朱珅莹 孙韦男 祝玮琦 王玉潘 周 ...
- win10中jdk1.8环境配置完,重启之后配置失效
1.win10操作系统下重启电脑java环境变量失效 解决方式: 右击开始按钮,选择管理员方式的windows powershell,如下图: 在窗口中输入javac,一切正常,即使重启都不会有问题啦 ...
- linux中~和/区别
/是指根目录 就是所有目录最顶层的目录~指的是你当前用户的主目录 如果是root用户的话就是/root/目录 如果是其他用户的话就是/home/下以你用户名命名的用户 在linux里面,~/ ...
- iOS-----使用addressBook管理联系人之修改联系人
使用addressBook管理联系人之修改联系人 修改联系人 修改联系人先从底层地址簿中加载一条ABRecordRef记录,然后对这条ABRecordRef记录的属性值进行修改,修改完成后把这条修改后 ...
- WebService 初步入门的理解
先说明 我不是高手 我是菜鸟 也在不断学习的过程 记录下来这些是让自己总结的学习 毕竟我做的时候也是摸索前进的 我没有深入 我是入门摸索 前两天的时候做一个微信的开发的 要用到我们公司微信服务号 ...