谈谈Linux内核驱动的编码风格

发表于:2015-7-17 10:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wwang    来源:51Testing软件测试网原创

  最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多。当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代码的时候在很多细节上会照顾不周。不过, 在不遵守规则的程序员队伍里,我并不是孤独的。如果去看drivers/staging下的代码,就会发现很多驱动程序都没有严格遵守内核的coding style,而且在很多驱动程序的TODO文件里,都会把”checkpatch.pl fixes”作为自己的目标之一(checkpatch.pl是用来检查代码是否符合coding style的脚本)。
  不可否认,coding style是仁者见仁、智者见智的事情。比如Microsoft所推崇的匈牙利命名法,在Linus看来就是及其脑残(brain damaged)的做法。也许您并不赞成Linus制定的coding style,但在提交内核驱动这件事上,最好还是以大局为重。对于这么一个庞大的集市式的开发来说,随意书写代码必将带来严重的可维护性的灾难。
  一些辅助工具
  当代码量达到一定程度时,手动去检查和修改coding style是非常繁琐的工作,幸好,我们还有一些工具可以使用。
  scripts/checkpatch.pl
  这是一个检查代码是否符合内核编码规范的的脚本。顾名思义,checkpatch是用来检查patch的,默认的调用也确实如此。如果用来检查原文件,需要加上“-f”的选项。
  我们来看一段无聊的代码(文件名为print_msg.c):
  void print_msg(int a)
  {
  switch (a) {
  case 1:
  printf("a == 1\n");
  break;
  case 2:
  printf("a == 2\n");
  break;
  }
  }
  这段代码的coding style是否有问题呢?用checkpatch.pl来检查一下:
  scripts/checkpatch.pl -f print_msg.c
  检查的结果是:
  ERROR: switch and case should be at the same indent
  #3: FILE: switch.c:3:
  + switch (a) {
  + case 1:
  [...]
  + case 2:
  total: 1 errors, 0 warnings, 12 lines checked
  switch.c has style problems, please review. If any of these errors
  are false positives report them to the maintainer, see
  CHECKPATCH in MAINTAINERS.
  在Linux内核的coding style里,switch和case要求有相同的缩进。本例的代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?
  scripts/Lindent
  scripts目录下的工具Lindent可以用来自动修改缩进问题。提醒一下,使用Lindent要求系统安装indent这个工具。
  对于上面这个例子,执行Lindent命令:
  scripts/Lindent print_msg.c
  得到的新代码是:
  void print_msg(int a)
  {
  switch (a) {
  case 1:
  printf("a == 1\n");
  break;
  case 2:
  printf("a == 2\n");
  break;
  }
  }
  sed
  sed是一个流编辑器,其强大的功能可以帮助我们处理很多重复性的工作。比如,Linux内核的coding style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。
  我自己的习惯很差,经常在代码的行尾留下一些空格。比如一行代码过长需要换行时,总是下意识的在换行的地方敲一个空格。另外,我常用的编辑器之一的Kate,为了对齐的需要,经常在空行的前面留上几个缩进的Tab(如下图)。
  手动去除这些行尾的空格是一件头大的事情,但对于sed来说不过是举手之劳。命令格式如下:
  sed ‘s/[ \t]*$//g’ your_code.c
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号