1|sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/dev-tools/testing-overviewmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/dev-tools/testing-overviewmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/dev-tools/testing-overviewmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/dev-tools/testing-overviewmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/dev-tools/testing-overviewmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/dev-tools/testing-overviewmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh[/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/dev-tools/testing-overview.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h,Documentation/dev-tools/testing-overview.rsth]h)}(hhh]h,Documentation/dev-tools/testing-overview.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Translatorh]h Translator}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h2胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn> h]h)}(h1胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>h](h胡皓文 Hu Haowen <}(hjhhhNhNubh reference)}(h2023002089@link.tyut.edu.cnh]h2023002089@link.tyut.edu.cn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:2023002089@link.tyut.edu.cnuh1j'hjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h内核测试指南h]h内核测试指南}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjWhhhhhK ubh)}(h有许多不同的工具可以用于测试Linux内核,因此了解什么时候使用它们可能 很困难。本文档粗略概述了它们之间的区别,并阐释了它们是怎样糅合在一起 的。h]h有许多不同的工具可以用于测试Linux内核,因此了解什么时候使用它们可能 很困难。本文档粗略概述了它们之间的区别,并阐释了它们是怎样糅合在一起 的。}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjWhhubjV)}(hhh](j[)}(h编写和运行测试h]h编写和运行测试}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjxhhhhhKubh)}(h大多数内核测试都是用kselftest或KUnit框架之一编写的。它们都让运行测试 更加简化,并为编写新测试提供帮助。h]h大多数内核测试都是用kselftest或KUnit框架之一编写的。它们都让运行测试 更加简化,并为编写新测试提供帮助。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxhhubh)}(hr如果你想验证内核的行为——尤其是内核的特定部分——那你就要使用kUnit或 kselftest。h]hr如果你想验证内核的行为——尤其是内核的特定部分——那你就要使用kUnit或 kselftest。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjxhhubjV)}(hhh](j[)}(hKUnit和kselftest的区别h]hKUnit和kselftest的区别}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjhhhhhKubh)}(hX.由于本文段中部分术语尚无较好的对应中文释义,可能导致与原文含义 存在些许差异,因此建议读者结合原文 (Documentation/dev-tools/testing-overview.rst)辅助阅读。 如对部分翻译有异议或有更好的翻译意见,欢迎联系译者进行修订。h]h)}(hX.由于本文段中部分术语尚无较好的对应中文释义,可能导致与原文含义 存在些许差异,因此建议读者结合原文 (Documentation/dev-tools/testing-overview.rst)辅助阅读。 如对部分翻译有异议或有更好的翻译意见,欢迎联系译者进行修订。h]hX.由于本文段中部分术语尚无较好的对应中文释义,可能导致与原文含义 存在些许差异,因此建议读者结合原文 (Documentation/dev-tools/testing-overview.rst)辅助阅读。 如对部分翻译有异议或有更好的翻译意见,欢迎联系译者进行修订。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hKUnit(Documentation/dev-tools/kunit/index.rst)是用于“白箱”测 试的一个完整的内核内部系统:因为测试代码是内核的一部分,所以它能够访 问用户空间不能访问到的内部结构和功能。h]hKUnit(Documentation/dev-tools/kunit/index.rst)是用于“白箱”测 试的一个完整的内核内部系统:因为测试代码是内核的一部分,所以它能够访 问用户空间不能访问到的内部结构和功能。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjhhubh)}(h因此,KUnit测试最好针对内核中较小的、自包含的部分,以便能够独立地测 试。“单元”测试的概念亦是如此。h]h因此,KUnit测试最好针对内核中较小的、自包含的部分,以便能够独立地测 试。“单元”测试的概念亦是如此。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjhhubh)}(h比如,一个KUnit测试可能测试一个单独的内核功能(甚至通过一个函数测试 一个单一的代码路径,例如一个错误处理案例),而不是整个地测试一个特性。h]h比如,一个KUnit测试可能测试一个单独的内核功能(甚至通过一个函数测试 一个单一的代码路径,例如一个错误处理案例),而不是整个地测试一个特性。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjhhubh)}(hu这也使得KUnit测试构建和运行非常地快,从而能够作为开发流程的一部分被 频繁地运行。h]hu这也使得KUnit测试构建和运行非常地快,从而能够作为开发流程的一部分被 频繁地运行。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjhhubh)}(hi有关更详细的介绍,请参阅KUnit测试代码风格指南 Documentation/dev-tools/kunit/style.rsth]hi有关更详细的介绍,请参阅KUnit测试代码风格指南 Documentation/dev-tools/kunit/style.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjhhubh)}(hkselftest(Documentation/dev-tools/kselftest.rst),相对来说,大量用 于用户空间,并且通常测试用户空间的脚本或程序。h]hkselftest(Documentation/dev-tools/kselftest.rst),相对来说,大量用 于用户空间,并且通常测试用户空间的脚本或程序。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjhhubh)}(hX)这使得编写复杂的测试,或者需要操作更多全局系统状态的测试更加容易(诸 如生成进程之类)。然而,从kselftest直接调用内核函数是不行的。这也就 意味着只有通过某种方式(如系统调用、驱动设备、文件系统等)导出到了用 户空间的内核功能才能使用kselftest来测试。为此,有些测试包含了一个伴 生的内核模块用于导出更多的信息和功能。不过,对于基本上或者完全在内核 中运行的测试,KUnit可能是更佳工具。h]hX)这使得编写复杂的测试,或者需要操作更多全局系统状态的测试更加容易(诸 如生成进程之类)。然而,从kselftest直接调用内核函数是不行的。这也就 意味着只有通过某种方式(如系统调用、驱动设备、文件系统等)导出到了用 户空间的内核功能才能使用kselftest来测试。为此,有些测试包含了一个伴 生的内核模块用于导出更多的信息和功能。不过,对于基本上或者完全在内核 中运行的测试,KUnit可能是更佳工具。}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjhhubh)}(hkselftest也因此非常适合于全部功能的测试,因为这些功能会将接口暴露到 用户空间,从而能够被测试,而不是展现实现细节。“system”测试和 “end-to-end”测试亦是如此。h]hkselftest也因此非常适合于全部功能的测试,因为这些功能会将接口暴露到 用户空间,从而能够被测试,而不是展现实现细节。“system”测试和 “end-to-end”测试亦是如此。}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hjhhubeh}(h]kunitkselftestah ]h"]kunit和kselftest的区别ah$]h&]uh1jUhjxhhhhhKubeh}(h]id2ah ]h"]编写和运行测试ah$]h&]uh1jUhjWhhhhhKubjV)}(hhh](j[)}(h代码覆盖率工具h]h代码覆盖率工具}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jZhj\hhhhhKCubh)}(h支持两种不同代码之间的覆盖率测量工具。它们可以用来验证一项测试执行的 确切函数或代码行。这有助于决定内核被测试了多少,或用来查找合适的测试 中没有覆盖到的极端情况。h]h支持两种不同代码之间的覆盖率测量工具。它们可以用来验证一项测试执行的 确切函数或代码行。这有助于决定内核被测试了多少,或用来查找合适的测试 中没有覆盖到的极端情况。}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKEhj\hhubh)}(hX0Documentation/translations/zh_CN/dev-tools/gcov.rst 是GCC的覆盖率测试 工具,能用于获取内核的全局或每个模块的覆盖率。与KCOV不同的是,这个工具 不记录每个任务的覆盖率。覆盖率数据可以通过debugfs读取,并通过常规的 gcov工具进行解释。h]hX0Documentation/translations/zh_CN/dev-tools/gcov.rst 是GCC的覆盖率测试 工具,能用于获取内核的全局或每个模块的覆盖率。与KCOV不同的是,这个工具 不记录每个任务的覆盖率。覆盖率数据可以通过debugfs读取,并通过常规的 gcov工具进行解释。}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhj\hhubh)}(hXDocumentation/dev-tools/kcov.rst 是能够构建在内核之中,用于在每个任务 的层面捕捉覆盖率的一个功能。因此,它对于模糊测试和关于代码执行期间信 息的其它情况非常有用,比如在一个单一系统调用里使用它就很有用。h]hXDocumentation/dev-tools/kcov.rst 是能够构建在内核之中,用于在每个任务 的层面捕捉覆盖率的一个功能。因此,它对于模糊测试和关于代码执行期间信 息的其它情况非常有用,比如在一个单一系统调用里使用它就很有用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKNhj\hhubeh}(h]id3ah ]h"]代码覆盖率工具ah$]h&]uh1jUhjWhhhhhKCubjV)}(hhh](j[)}(h动态分析工具h]h动态分析工具}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjhhhhhKSubh)}(hX 内核也支持许多动态分析工具,用以检测正在运行的内核中出现的多种类型的 问题。这些工具通常每个去寻找一类不同的缺陷,比如非法内存访问,数据竞 争等并发问题,或整型溢出等其他未定义行为。h]hX 内核也支持许多动态分析工具,用以检测正在运行的内核中出现的多种类型的 问题。这些工具通常每个去寻找一类不同的缺陷,比如非法内存访问,数据竞 争等并发问题,或整型溢出等其他未定义行为。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjhhubh)}(h如下所示:h]h如下所示:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjhhubh bullet_list)}(hhh](h list_item)}(hQkmemleak检测可能的内存泄漏。参阅 Documentation/dev-tools/kmemleak.rsth]h)}(hQkmemleak检测可能的内存泄漏。参阅 Documentation/dev-tools/kmemleak.rsth]hQkmemleak检测可能的内存泄漏。参阅 Documentation/dev-tools/kmemleak.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(huKASAN检测非法内存访问,如数组越界和释放后重用(UAF)。参阅 Documentation/dev-tools/kasan.rsth]h)}(huKASAN检测非法内存访问,如数组越界和释放后重用(UAF)。参阅 Documentation/dev-tools/kasan.rsth]huKASAN检测非法内存访问,如数组越界和释放后重用(UAF)。参阅 Documentation/dev-tools/kasan.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hdUBSAN检测C标准中未定义的行为,如整型溢出。参阅 Documentation/dev-tools/ubsan.rsth]h)}(hdUBSAN检测C标准中未定义的行为,如整型溢出。参阅 Documentation/dev-tools/ubsan.rsth]hdUBSAN检测C标准中未定义的行为,如整型溢出。参阅 Documentation/dev-tools/ubsan.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hBKCSAN检测数据竞争。参阅 Documentation/dev-tools/kcsan.rsth]h)}(hjh]hBKCSAN检测数据竞争。参阅 Documentation/dev-tools/kcsan.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hKFENCE是一个低开销的内存问题检测器,比KASAN更快且能被用于批量构建。 参阅 Documentation/dev-tools/kfence.rsth]h)}(hKFENCE是一个低开销的内存问题检测器,比KASAN更快且能被用于批量构建。 参阅 Documentation/dev-tools/kfence.rsth]hKFENCE是一个低开销的内存问题检测器,比KASAN更快且能被用于批量构建。 参阅 Documentation/dev-tools/kfence.rst}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhj2ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hZlockdep是一个锁定正确性检测器。参阅 Documentation/locking/lockdep-design.rsth]h)}(hZlockdep是一个锁定正确性检测器。参阅 Documentation/locking/lockdep-design.rsth]hZlockdep是一个锁定正确性检测器。参阅 Documentation/locking/lockdep-design.rst}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjJubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h运行时确认(Runtime Verification)支持检查给定子系统的特定行为。参阅 Documentation/trace/rv/runtime-verification.rst。h]h)}(h运行时确认(Runtime Verification)支持检查给定子系统的特定行为。参阅 Documentation/trace/rv/runtime-verification.rst。h]h运行时确认(Runtime Verification)支持检查给定子系统的特定行为。参阅 Documentation/trace/rv/runtime-verification.rst。}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKfhjbubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hn除此以外,在内核中还有一些其它的调试工具,大多数能在 lib/Kconfig.debug 中找到。 h]h)}(hm除此以外,在内核中还有一些其它的调试工具,大多数能在 lib/Kconfig.debug 中找到。h]hm除此以外,在内核中还有一些其它的调试工具,大多数能在 lib/Kconfig.debug 中找到。}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhjzubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhK[hjhhubh)}(hX这些工具倾向于对内核进行整体测试,并且不像kselftest和KUnit一样“传递”。 它们可以通过在启用这些工具时运行内核测试以与kselftest或KUnit结合起来: 之后你就能确保这些错误在测试过程中都不会发生了。h]hX这些工具倾向于对内核进行整体测试,并且不像kselftest和KUnit一样“传递”。 它们可以通过在启用这些工具时运行内核测试以与kselftest或KUnit结合起来: 之后你就能确保这些错误在测试过程中都不会发生了。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKkhjhhubh)}(h\一些工具与KUnit和kselftest集成,并且在检测到问题时会自动打断测试。h]h\一些工具与KUnit和kselftest集成,并且在检测到问题时会自动打断测试。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjhhubeh}(h]id4ah ]h"]动态分析工具ah$]h&]uh1jUhjWhhhhhKSubjV)}(hhh](j[)}(h静态分析工具h]h静态分析工具}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjhhhhhKrubh)}(hX除了测试运行中的内核,我们还可以使用**静态分析**工具直接分析内核的源代 码(**在编译时**)。内核中常用的工具允许人们检查整个源代码树或其中的特 定文件。它们使得在开发过程中更容易发现和修复问题。h](hn除了测试运行中的内核,我们还可以使用**静态分析**工具直接分析内核的源代 码(}(hjhhhNhNubhstrong)}(h**在编译时**h]h 在编译时}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh)。内核中常用的工具允许人们检查整个源代码树或其中的特 定文件。它们使得在开发过程中更容易发现和修复问题。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKthjhhubh block_quote)}(hXSparse可以通过执行类型检查、锁检查、值范围检查来帮助测试内核,此外还 可以在检查代码时报告各种错误和警告。关于如何使用它的细节,请参阅 Documentation/translations/zh_CN/dev-tools/sparse.rst。 Smatch扩展了Sparse,并提供了对编程逻辑错误的额外检查,如开关语句中 缺少断点,错误检查中未使用的返回值,忘记在错误路径的返回中设置错误代 码等。Smatch也有针对更严重问题的测试,如整数溢出、空指针解除引用和内 存泄漏。见项目页面http://smatch.sourceforge.net/。 Coccinelle是我们可以使用的另一个静态分析器。Coccinelle经常被用来 帮助源代码的重构和并行演化,但它也可以帮助避免常见代码模式中出现的某 些错误。可用的测试类型包括API测试、内核迭代器的正确使用测试、自由操 作的合理性检查、锁定行为的分析,以及已知的有助于保持内核使用一致性的 进一步测试。详情请见Documentation/dev-tools/coccinelle.rst。 不过要注意的是,静态分析工具存在**假阳性**的问题。在试图修复错误和警 告之前,需要仔细评估它们。 h](h)}(hSparse可以通过执行类型检查、锁检查、值范围检查来帮助测试内核,此外还 可以在检查代码时报告各种错误和警告。关于如何使用它的细节,请参阅 Documentation/translations/zh_CN/dev-tools/sparse.rst。h]hSparse可以通过执行类型检查、锁检查、值范围检查来帮助测试内核,此外还 可以在检查代码时报告各种错误和警告。关于如何使用它的细节,请参阅 Documentation/translations/zh_CN/dev-tools/sparse.rst。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjubh)}(hXeSmatch扩展了Sparse,并提供了对编程逻辑错误的额外检查,如开关语句中 缺少断点,错误检查中未使用的返回值,忘记在错误路径的返回中设置错误代 码等。Smatch也有针对更严重问题的测试,如整数溢出、空指针解除引用和内 存泄漏。见项目页面http://smatch.sourceforge.net/。h]hXeSmatch扩展了Sparse,并提供了对编程逻辑错误的额外检查,如开关语句中 缺少断点,错误检查中未使用的返回值,忘记在错误路径的返回中设置错误代 码等。Smatch也有针对更严重问题的测试,如整数溢出、空指针解除引用和内 存泄漏。见项目页面http://smatch.sourceforge.net/。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hjubh)}(hXCoccinelle是我们可以使用的另一个静态分析器。Coccinelle经常被用来 帮助源代码的重构和并行演化,但它也可以帮助避免常见代码模式中出现的某 些错误。可用的测试类型包括API测试、内核迭代器的正确使用测试、自由操 作的合理性检查、锁定行为的分析,以及已知的有助于保持内核使用一致性的 进一步测试。详情请见Documentation/dev-tools/coccinelle.rst。h]hXCoccinelle是我们可以使用的另一个静态分析器。Coccinelle经常被用来 帮助源代码的重构和并行演化,但它也可以帮助避免常见代码模式中出现的某 些错误。可用的测试类型包括API测试、内核迭代器的正确使用测试、自由操 作的合理性检查、锁定行为的分析,以及已知的有助于保持内核使用一致性的 进一步测试。详情请见Documentation/dev-tools/coccinelle.rst。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubh)}(h不过要注意的是,静态分析工具存在**假阳性**的问题。在试图修复错误和警 告之前,需要仔细评估它们。h]h不过要注意的是,静态分析工具存在**假阳性**的问题。在试图修复错误和警 告之前,需要仔细评估它们。}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhhhKxhjhhubjV)}(hhh](j[)}(h何时使用Sparse和Smatchh]h何时使用Sparse和Smatch}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jZhj5hhhhhKubh)}(hSparse做类型检查,例如验证注释的变量不会导致无符号的错误,检测 ``__user`` 指针使用不当的地方,以及分析符号初始化器的兼容性。h](h[Sparse做类型检查,例如验证注释的变量不会导致无符号的错误,检测 }(hjFhhhNhNubhliteral)}(h ``__user``h]h__user}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jNhjFubhL 指针使用不当的地方,以及分析符号初始化器的兼容性。}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj5hhubh)}(hX Smatch进行流程分析,如果允许建立函数数据库,它还会进行跨函数分析。 Smatch试图回答一些问题,比如这个缓冲区是在哪里分配的?它有多大?这 个索引可以由用户控制吗?这个变量比那个变量大吗?h]hX Smatch进行流程分析,如果允许建立函数数据库,它还会进行跨函数分析。 Smatch试图回答一些问题,比如这个缓冲区是在哪里分配的?它有多大?这 个索引可以由用户控制吗?这个变量比那个变量大吗?}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj5hhubh)}(h一般来说,在Smatch中写检查比在Sparse中写检查要容易。尽管如此, Sparse和Smatch的检查还是有一些重叠的地方。h]h一般来说,在Smatch中写检查比在Sparse中写检查要容易。尽管如此, Sparse和Smatch的检查还是有一些重叠的地方。}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj5hhubeh}(h] sparsesmatchah ]h"]何时使用sparse和smatchah$]h&]uh1jUhjhhhhhKubjV)}(hhh](j[)}(hSmatch和Coccinelle的强项h]hSmatch和Coccinelle的强项}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jZhjhhhhhKubh)}(hCoccinelle可能是最容易写检查的。它在预处理器之前工作,所以用Coccinelle 检查宏中的错误更容易。Coccinelle还能为你创建补丁,这是其他工具无法做到的。h]hCoccinelle可能是最容易写检查的。它在预处理器之前工作,所以用Coccinelle 检查宏中的错误更容易。Coccinelle还能为你创建补丁,这是其他工具无法做到的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXO例如,用Coccinelle你可以从 ``kmalloc_array(x, size, GFP_KERNEL)`` 到 ``kmalloc_array(x, size, GFP_KERNEL)`` 进行大规模转换,这真的很 有用。如果你只是创建一个Smatch警告,并试图把转换的工作推给维护者,他们会很 恼火。你将不得不为每个警告争论是否真的可以溢出。h](h#例如,用Coccinelle你可以从 }(hjhhhNhNubjO)}(h&``kmalloc_array(x, size, GFP_KERNEL)``h]h"kmalloc_array(x, size, GFP_KERNEL)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jNhjubh 到 }(hjhhhNhNubjO)}(h&``kmalloc_array(x, size, GFP_KERNEL)``h]h"kmalloc_array(x, size, GFP_KERNEL)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jNhjubh 进行大规模转换,这真的很 有用。如果你只是创建一个Smatch警告,并试图把转换的工作推给维护者,他们会很 恼火。你将不得不为每个警告争论是否真的可以溢出。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hCoccinelle不对变量值进行分析,而这正是Smatch的强项。另一方面,Coccinelle 允许你用简单的方法做简单的事情。h]hCoccinelle不对变量值进行分析,而这正是Smatch的强项。另一方面,Coccinelle 允许你用简单的方法做简单的事情。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]smatchcoccinelleah ]h"]smatch和coccinelle的强项ah$]h&]uh1jUhjhhhhhKubeh}(h]id5ah ]h"]静态分析工具ah$]h&]uh1jUhjWhhhhhKrubeh}(h]id1ah ]h"]内核测试指南ah$]h&]uh1jUhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jZN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj&error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjYjVjQjNjjjjjjjjjju nametypes}(jjYjQjjjjjuh}(jjWjVjxjNjjj\jjjjjj5jju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j4KsRparse_messages]transform_messages] transformerN include_log]?Documentation/translations/zh_CN/dev-tools/testing-overview.rst(NNNNta decorationNhhub.