zoukankan      html  css  js  c++  java
  • 精《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

  • 相关阅读:
    考研岁月
    sklearn 翻译笔记:KNeighborsClassifier
    网站不让复制的办法
    关于VMware Workstation 15 Player 虚拟机安装Windows系统却无法安装vmware tools的解决
    今天真是太傻了
    GoogleHacking相关技巧
    判断ARP欺骗
    Linux各个文件及其含义
    小白的开始—转一篇Linux系统入门的文章
    课时39.细线表格(理解)
  • 原文地址:https://www.cnblogs.com/tcicy/p/8552665.html
Copyright © 2011-2022 走看看