summaryrefslogtreecommitdiff
path: root/Documentation/translations/zh_CN/dev-tools/testing-overview.rst
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/translations/zh_CN/dev-tools/testing-overview.rst')
-rw-r--r--Documentation/translations/zh_CN/dev-tools/testing-overview.rst56
1 files changed, 55 insertions, 1 deletions
diff --git a/Documentation/translations/zh_CN/dev-tools/testing-overview.rst b/Documentation/translations/zh_CN/dev-tools/testing-overview.rst
index b7a1d13da6c6..286ed6b01f65 100644
--- a/Documentation/translations/zh_CN/dev-tools/testing-overview.rst
+++ b/Documentation/translations/zh_CN/dev-tools/testing-overview.rst
@@ -3,7 +3,7 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/dev-tools/testing-overview.rst
-:Translator: 胡皓文 Hu Haowen <src.res@email.cn>
+:Translator: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>
============
内核测试指南
@@ -99,6 +99,8 @@ Documentation/dev-tools/kcov.rst 是能够构建在内核之中,用于在每
参阅 Documentation/dev-tools/kfence.rst
* lockdep是一个锁定正确性检测器。参阅
Documentation/locking/lockdep-design.rst
+* 运行时确认(Runtime Verification)支持检查给定子系统的特定行为。参阅
+ Documentation/trace/rv/runtime-verification.rst。
* 除此以外,在内核中还有一些其它的调试工具,大多数能在
lib/Kconfig.debug 中找到。
@@ -107,3 +109,55 @@ Documentation/dev-tools/kcov.rst 是能够构建在内核之中,用于在每
之后你就能确保这些错误在测试过程中都不会发生了。
一些工具与KUnit和kselftest集成,并且在检测到问题时会自动打断测试。
+
+静态分析工具
+============
+
+除了测试运行中的内核,我们还可以使用**静态分析**工具直接分析内核的源代
+码(**在编译时**)。内核中常用的工具允许人们检查整个源代码树或其中的特
+定文件。它们使得在开发过程中更容易发现和修复问题。
+
+ Sparse可以通过执行类型检查、锁检查、值范围检查来帮助测试内核,此外还
+ 可以在检查代码时报告各种错误和警告。关于如何使用它的细节,请参阅
+ Documentation/translations/zh_CN/dev-tools/sparse.rst。
+
+ Smatch扩展了Sparse,并提供了对编程逻辑错误的额外检查,如开关语句中
+ 缺少断点,错误检查中未使用的返回值,忘记在错误路径的返回中设置错误代
+ 码等。Smatch也有针对更严重问题的测试,如整数溢出、空指针解除引用和内
+ 存泄漏。见项目页面http://smatch.sourceforge.net/。
+
+ Coccinelle是我们可以使用的另一个静态分析器。Coccinelle经常被用来
+ 帮助源代码的重构和并行演化,但它也可以帮助避免常见代码模式中出现的某
+ 些错误。可用的测试类型包括API测试、内核迭代器的正确使用测试、自由操
+ 作的合理性检查、锁定行为的分析,以及已知的有助于保持内核使用一致性的
+ 进一步测试。详情请见Documentation/dev-tools/coccinelle.rst。
+
+ 不过要注意的是,静态分析工具存在**假阳性**的问题。在试图修复错误和警
+ 告之前,需要仔细评估它们。
+
+何时使用Sparse和Smatch
+----------------------
+
+Sparse做类型检查,例如验证注释的变量不会导致无符号的错误,检测
+``__user`` 指针使用不当的地方,以及分析符号初始化器的兼容性。
+
+Smatch进行流程分析,如果允许建立函数数据库,它还会进行跨函数分析。
+Smatch试图回答一些问题,比如这个缓冲区是在哪里分配的?它有多大?这
+个索引可以由用户控制吗?这个变量比那个变量大吗?
+
+一般来说,在Smatch中写检查比在Sparse中写检查要容易。尽管如此,
+Sparse和Smatch的检查还是有一些重叠的地方。
+
+Smatch和Coccinelle的强项
+------------------------
+
+Coccinelle可能是最容易写检查的。它在预处理器之前工作,所以用Coccinelle
+检查宏中的错误更容易。Coccinelle还能为你创建补丁,这是其他工具无法做到的。
+
+例如,用Coccinelle你可以从 ``kmalloc_array(x, size, GFP_KERNEL)``
+到 ``kmalloc_array(x, size, GFP_KERNEL)`` 进行大规模转换,这真的很
+有用。如果你只是创建一个Smatch警告,并试图把转换的工作推给维护者,他们会很
+恼火。你将不得不为每个警告争论是否真的可以溢出。
+
+Coccinelle不对变量值进行分析,而这正是Smatch的强项。另一方面,Coccinelle
+允许你用简单的方法做简单的事情。