~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/dev-tools/testing-overview.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0
  2 
  3 .. include:: ../disclaimer-zh_CN.rst
  4 
  5 :Original: Documentation/dev-tools/testing-overview.rst
  6 :Translator: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>
  7 
  8 ============
  9 内核测试指南
 10 ============
 11 
 12 有许多不同的工具可以用于测试Linux内核,因此了解什么时候使用它们可能
 13 很困难。本文档粗略概述了它们之间的区别,并阐释了它们是怎样糅合在一起
 14 的。
 15 
 16 编写和运行测试
 17 ==============
 18 
 19 大多数内核测试都是用kselftest或KUnit框架之一编写的。它们都让运行测试
 20 更加简化,并为编写新测试提供帮助。
 21 
 22 如果你想验证内核的行为——尤其是内核的特定部分——那你就要使用kUnit或
 23 kselftest。
 24 
 25 KUnit和kselftest的区别
 26 ----------------------
 27 
 28 .. note::
 29      由于本文段中部分术语尚无较好的对应中文释义,可能导致与原文含义
 30      存在些许差异,因此建议读者结合原文
 31      (Documentation/dev-tools/testing-overview.rst)辅助阅读。
 32      如对部分翻译有异议或有更好的翻译意见,欢迎联系译者进行修订。
 33 
 34 KUnit(Documentation/dev-tools/kunit/index.rst)是用于“白箱”测
 35 试的一个完整的内核内部系统:因为测试代码是内核的一部分,所以它能够访
 36 问用户空间不能访问到的内部结构和功能。
 37 
 38 因此,KUnit测试最好针对内核中较小的、自包含的部分,以便能够独立地测
 39 试。“单元”测试的概念亦是如此。
 40 
 41 比如,一个KUnit测试可能测试一个单独的内核功能(甚至通过一个函数测试
 42 一个单一的代码路径,例如一个错误处理案例),而不是整个地测试一个特性。
 43 
 44 这也使得KUnit测试构建和运行非常地快,从而能够作为开发流程的一部分被
 45 频繁地运行。
 46 
 47 有关更详细的介绍,请参阅KUnit测试代码风格指南
 48 Documentation/dev-tools/kunit/style.rst
 49 
 50 kselftest(Documentation/dev-tools/kselftest.rst),相对来说,大量用
 51 于用户空间,并且通常测试用户空间的脚本或程序。
 52 
 53 这使得编写复杂的测试,或者需要操作更多全局系统状态的测试更加容易(诸
 54 如生成进程之类)。然而,从kselftest直接调用内核函数是不行的。这也就
 55 意味着只有通过某种方式(如系统调用、驱动设备、文件系统等)导出到了用
 56 户空间的内核功能才能使用kselftest来测试。为此,有些测试包含了一个伴
 57 生的内核模块用于导出更多的信息和功能。不过,对于基本上或者完全在内核
 58 中运行的测试,KUnit可能是更佳工具。
 59 
 60 kselftest也因此非常适合于全部功能的测试,因为这些功能会将接口暴露到
 61 用户空间,从而能够被测试,而不是展现实现细节。“system”测试和
 62 “end-to-end”测试亦是如此。
 63 
 64 比如,一个新的系统调用应该伴随有新的kselftest测试。
 65 
 66 代码覆盖率工具
 67 ==============
 68 
 69 支持两种不同代码之间的覆盖率测量工具。它们可以用来验证一项测试执行的
 70 确切函数或代码行。这有助于决定内核被测试了多少,或用来查找合适的测试
 71 中没有覆盖到的极端情况。
 72 
 73 Documentation/translations/zh_CN/dev-tools/gcov.rst 是GCC的覆盖率测试
 74 工具,能用于获取内核的全局或每个模块的覆盖率。与KCOV不同的是,这个工具
 75 不记录每个任务的覆盖率。覆盖率数据可以通过debugfs读取,并通过常规的
 76 gcov工具进行解释。
 77 
 78 Documentation/dev-tools/kcov.rst 是能够构建在内核之中,用于在每个任务
 79 的层面捕捉覆盖率的一个功能。因此,它对于模糊测试和关于代码执行期间信
 80 息的其它情况非常有用,比如在一个单一系统调用里使用它就很有用。
 81 
 82 动态分析工具
 83 ============
 84 
 85 内核也支持许多动态分析工具,用以检测正在运行的内核中出现的多种类型的
 86 问题。这些工具通常每个去寻找一类不同的缺陷,比如非法内存访问,数据竞
 87 争等并发问题,或整型溢出等其他未定义行为。
 88 
 89 如下所示:
 90 
 91 * kmemleak检测可能的内存泄漏。参阅
 92   Documentation/dev-tools/kmemleak.rst
 93 * KASAN检测非法内存访问,如数组越界和释放后重用(UAF)。参阅
 94   Documentation/dev-tools/kasan.rst
 95 * UBSAN检测C标准中未定义的行为,如整型溢出。参阅
 96   Documentation/dev-tools/ubsan.rst
 97 * KCSAN检测数据竞争。参阅 Documentation/dev-tools/kcsan.rst
 98 * KFENCE是一个低开销的内存问题检测器,比KASAN更快且能被用于批量构建。
 99   参阅 Documentation/dev-tools/kfence.rst
100 * lockdep是一个锁定正确性检测器。参阅
101   Documentation/locking/lockdep-design.rst
102 * 运行时确认(Runtime Verification)支持检查给定子系统的特定行为。参阅
103   Documentation/trace/rv/runtime-verification.rst。
104 * 除此以外,在内核中还有一些其它的调试工具,大多数能在
105   lib/Kconfig.debug 中找到。
106 
107 这些工具倾向于对内核进行整体测试,并且不像kselftest和KUnit一样“传递”。
108 它们可以通过在启用这些工具时运行内核测试以与kselftest或KUnit结合起来:
109 之后你就能确保这些错误在测试过程中都不会发生了。
110 
111 一些工具与KUnit和kselftest集成,并且在检测到问题时会自动打断测试。
112 
113 静态分析工具
114 ============
115 
116 除了测试运行中的内核,我们还可以使用**静态分析**工具直接分析内核的源代
117 码(**在编译时**)。内核中常用的工具允许人们检查整个源代码树或其中的特
118 定文件。它们使得在开发过程中更容易发现和修复问题。
119 
120  Sparse可以通过执行类型检查、锁检查、值范围检查来帮助测试内核,此外还
121  可以在检查代码时报告各种错误和警告。关于如何使用它的细节,请参阅
122  Documentation/translations/zh_CN/dev-tools/sparse.rst。
123 
124  Smatch扩展了Sparse,并提供了对编程逻辑错误的额外检查,如开关语句中
125  缺少断点,错误检查中未使用的返回值,忘记在错误路径的返回中设置错误代
126  码等。Smatch也有针对更严重问题的测试,如整数溢出、空指针解除引用和内
127  存泄漏。见项目页面http://smatch.sourceforge.net/。
128 
129  Coccinelle是我们可以使用的另一个静态分析器。Coccinelle经常被用来
130  帮助源代码的重构和并行演化,但它也可以帮助避免常见代码模式中出现的某
131  些错误。可用的测试类型包括API测试、内核迭代器的正确使用测试、自由操
132  作的合理性检查、锁定行为的分析,以及已知的有助于保持内核使用一致性的
133  进一步测试。详情请见Documentation/dev-tools/coccinelle.rst。
134 
135  不过要注意的是,静态分析工具存在**假阳性**的问题。在试图修复错误和警
136  告之前,需要仔细评估它们。
137 
138 何时使用Sparse和Smatch
139 ----------------------
140 
141 Sparse做类型检查,例如验证注释的变量不会导致无符号的错误,检测
142 ``__user`` 指针使用不当的地方,以及分析符号初始化器的兼容性。
143 
144 Smatch进行流程分析,如果允许建立函数数据库,它还会进行跨函数分析。
145 Smatch试图回答一些问题,比如这个缓冲区是在哪里分配的?它有多大?这
146 个索引可以由用户控制吗?这个变量比那个变量大吗?
147 
148 一般来说,在Smatch中写检查比在Sparse中写检查要容易。尽管如此,
149 Sparse和Smatch的检查还是有一些重叠的地方。
150 
151 Smatch和Coccinelle的强项
152 ------------------------
153 
154 Coccinelle可能是最容易写检查的。它在预处理器之前工作,所以用Coccinelle
155 检查宏中的错误更容易。Coccinelle还能为你创建补丁,这是其他工具无法做到的。
156 
157 例如,用Coccinelle你可以从 ``kmalloc_array(x, size, GFP_KERNEL)``
158 到 ``kmalloc_array(x, size, GFP_KERNEL)`` 进行大规模转换,这真的很
159 有用。如果你只是创建一个Smatch警告,并试图把转换的工作推给维护者,他们会很
160 恼火。你将不得不为每个警告争论是否真的可以溢出。
161 
162 Coccinelle不对变量值进行分析,而这正是Smatch的强项。另一方面,Coccinelle
163 允许你用简单的方法做简单的事情。

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php