# 翻阅本书

> 原文： [https://www.fuzzingbook.org/html/Tours.html](https://www.fuzzingbook.org/html/Tours.html)

本书是*大量的*。 凭借17,000行代码和125,000个文本单词，印刷版本将覆盖1,000多个文本页面。 显然，我们不认为每个人都想阅读所有内容。

本书的各章可以一章又一章地阅读，但本书中有许多可能的路径。 在此图中，箭头$ A \ rightarrow B $表示章节$ A $是章节$ B $的前提。 您可以在该图中选择任意路径，以获取最感兴趣的主题：

```py
from [IPython.display](https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html) import SVG

```

```py
SVG(filename='PICS/Sitemap.svg')

```

<svg height="548pt" viewBox="0.00 0.00 1737.00 548.00" width="1737pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g class="graph" id="graph0" transform="scale(1 1) rotate(0) translate(4 544)"><title>%3</title> <g class="node" id="node1"><title>Fuzzer</title> <g id="a_node1"><a xlink:href="Fuzzer.html" xlink:title="Fuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1056" y="-446.3">Fuzzing: Breaking Things with Random Inputs</text></a></g></g> <g class="node" id="node2"><title>Coverage</title> <g id="a_node2"><a xlink:href="Coverage.html" xlink:title="Coverage"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1101" y="-302.3">Code Coverage</text></a></g></g> <g class="edge" id="edge1"><title>Fuzzer->Coverage</title></g> <g class="node" id="node3"><title>SearchBasedFuzzer</title> <g id="a_node3"><a xlink:href="SearchBasedFuzzer.html" xlink:title="SearchBasedFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1056" y="-374.3">Search-Based Fuzzing</text></a></g></g> <g class="edge" id="edge2"><title>Fuzzer->SearchBasedFuzzer</title></g> <g class="node" id="node4"><title>Grammars</title> <g id="a_node4"><a xlink:href="Grammars.html" xlink:title="Grammars"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="745" y="-374.3">Fuzzing with Grammars</text></a></g></g> <g class="edge" id="edge3"><title>Fuzzer->Grammars</title></g> <g class="node" id="node5"><title>SymbolicFuzzer</title> <g id="a_node5"><a xlink:href="SymbolicFuzzer.html" xlink:title="SymbolicFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1213" y="-374.3">Symbolic Fuzzing</text></a></g></g> <g class="edge" id="edge4"><title>Fuzzer->SymbolicFuzzer</title></g> <g class="node" id="node6"><title>FuzzingInTheLarge</title> <g id="a_node6"><a xlink:href="FuzzingInTheLarge.html" xlink:title="FuzzingInTheLarge"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1365" y="-374.3">Fuzzing in the Large</text></a></g></g> <g class="edge" id="edge5"><title>Fuzzer->FuzzingInTheLarge</title></g> <g class="node" id="node8"><title>MutationFuzzer</title> <g id="a_node8"><a xlink:href="MutationFuzzer.html" xlink:title="MutationFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1267" y="-230.3">Mutation-Based Fuzzing</text></a></g></g> <g class="edge" id="edge7"><title>Coverage->MutationFuzzer</title></g> <g class="node" id="node9"><title>MutationAnalysis</title> <g id="a_node9"><a xlink:href="MutationAnalysis.html" xlink:title="MutationAnalysis"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1435" y="-230.3">Mutation Analysis</text></a></g></g> <g class="edge" id="edge8"><title>Coverage->MutationAnalysis</title></g> <g class="node" id="node10"><title>GrammarCoverageFuzzer</title> <g id="a_node10"><a xlink:href="GrammarCoverageFuzzer.html" xlink:title="GrammarCoverageFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="885" y="-230.3">Grammar Coverage</text></a></g></g> <g class="edge" id="edge9"><title>Coverage->GrammarCoverageFuzzer</title></g> <g class="node" id="node11"><title>ProbabilisticGrammarFuzzer</title> <g id="a_node11"><a xlink:href="ProbabilisticGrammarFuzzer.html" xlink:title="ProbabilisticGrammarFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="290" y="-158.3">Probabilistic Grammar Fuzzing</text></a></g></g> <g class="edge" id="edge10"><title>Coverage->ProbabilisticGrammarFuzzer</title></g> <g class="node" id="node12"><title>ConcolicFuzzer</title> <g id="a_node12"><a xlink:href="ConcolicFuzzer.html" xlink:title="ConcolicFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="697" y="-86.3">Concolic Fuzzing</text></a></g></g> <g class="edge" id="edge11"><title>Coverage->ConcolicFuzzer</title></g> <g class="node" id="node13"><title>DynamicInvariants</title> <g id="a_node13"><a xlink:href="DynamicInvariants.html" xlink:title="DynamicInvariants"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1624" y="-230.3">Mining Function Specifications</text></a></g></g> <g class="edge" id="edge12"><title>Coverage->DynamicInvariants</title></g> <g class="node" id="node14"><title>WhenToStopFuzzing</title> <g id="a_node14"><a xlink:href="WhenToStopFuzzing.html" xlink:title="WhenToStopFuzzing"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1048" y="-230.3">When To Stop Fuzzing</text></a></g></g> <g class="edge" id="edge13"><title>Coverage->WhenToStopFuzzing</title></g> <g class="node" id="node17"><title>GrammarFuzzer</title> <g id="a_node17"><a xlink:href="GrammarFuzzer.html" xlink:title="GrammarFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="633" y="-302.3">Efficient Grammar Fuzzing</text></a></g></g> <g class="edge" id="edge16"><title>Grammars->GrammarFuzzer</title></g> <g class="node" id="node7"><title>Intro_Testing</title> <g id="a_node7"><a xlink:href="Intro_Testing.html" xlink:title="Intro_Testing"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1056" y="-518.3">Introduction to Software Testing</text></a></g></g> <g class="edge" id="edge6"><title>Intro_Testing->Fuzzer</title></g> <g class="node" id="node15"><title>GreyboxFuzzer</title> <g id="a_node15"><a xlink:href="GreyboxFuzzer.html" xlink:title="GreyboxFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1255" y="-158.3">Greybox Fuzzing</text></a></g></g> <g class="edge" id="edge14"><title>MutationFuzzer->GreyboxFuzzer</title></g> <g class="node" id="node22"><title>GrammarMiner</title> <g id="a_node22"><a xlink:href="GrammarMiner.html" xlink:title="GrammarMiner"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="519" y="-86.3">Mining Input Grammars</text></a></g></g> <g class="edge" id="edge22"><title>GrammarCoverageFuzzer->GrammarMiner</title></g> <g class="node" id="node23"><title>ConfigurationFuzzer</title> <g id="a_node23"><a xlink:href="ConfigurationFuzzer.html" xlink:title="ConfigurationFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="1008" y="-158.3">Testing Configurations</text></a></g></g> <g class="edge" id="edge23"><title>GrammarCoverageFuzzer->ConfigurationFuzzer</title></g> <g class="node" id="node24"><title>Carver</title> <g id="a_node24"><a xlink:href="Carver.html" xlink:title="Carver"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="703" y="-14.3">Carving Unit Tests</text></a></g></g> <g class="edge" id="edge24"><title>GrammarCoverageFuzzer->Carver</title></g> <g class="node" id="node25"><title>GUIFuzzer</title> <g id="a_node25"><a xlink:href="GUIFuzzer.html" xlink:title="GUIFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="762" y="-158.3">Testing Graphical User Interfaces</text></a></g></g> <g class="edge" id="edge25"><title>GrammarCoverageFuzzer->GUIFuzzer</title></g> <g class="node" id="node27"><title>APIFuzzer</title> <g id="a_node27"><a xlink:href="APIFuzzer.html" xlink:title="APIFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="290" y="-86.3">Fuzzing APIs</text></a></g></g> <g class="edge" id="edge29"><title>ProbabilisticGrammarFuzzer->APIFuzzer</title></g> <g class="node" id="node16"><title>GreyboxGrammarFuzzer</title> <g id="a_node16"><a xlink:href="GreyboxGrammarFuzzer.html" xlink:title="GreyboxGrammarFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="947" y="-86.3">Greybox Fuzzing with Grammars</text></a></g></g> <g class="edge" id="edge15"><title>GreyboxFuzzer->GreyboxGrammarFuzzer</title></g> <g class="edge" id="edge17"><title>GrammarFuzzer->GrammarCoverageFuzzer</title></g> <g class="node" id="node18"><title>Parser</title> <g id="a_node18"><a xlink:href="Parser.html" xlink:title="Parser"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="553" y="-230.3">Parsing Inputs</text></a></g></g> <g class="edge" id="edge18"><title>GrammarFuzzer->Parser</title></g> <g class="node" id="node19"><title>GeneratorGrammarFuzzer</title> <g id="a_node19"><a xlink:href="GeneratorGrammarFuzzer.html" xlink:title="GeneratorGrammarFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="84" y="-158.3">Fuzzing with Generators</text></a></g></g> <g class="edge" id="edge19"><title>GrammarFuzzer->GeneratorGrammarFuzzer</title></g> <g class="node" id="node20"><title>Reducer</title> <g id="a_node20"><a xlink:href="Reducer.html" xlink:title="Reducer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="292" y="-230.3">Reducing Failure-Inducing Inputs</text></a></g></g> <g class="edge" id="edge20"><title>GrammarFuzzer->Reducer</title></g> <g class="node" id="node21"><title>WebFuzzer</title> <g id="a_node21"><a xlink:href="WebFuzzer.html" xlink:title="WebFuzzer"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="712" y="-230.3">Testing Web Applications</text></a></g></g> <g class="edge" id="edge21"><title>GrammarFuzzer->WebFuzzer</title></g> <g class="edge" id="edge26"><title>Parser->ProbabilisticGrammarFuzzer</title></g> <g class="edge" id="edge27"><title>Parser->GreyboxGrammarFuzzer</title></g> <g class="node" id="node26"><title>InformationFlow</title> <g id="a_node26"><a xlink:href="InformationFlow.html" xlink:title="InformationFlow"><text fill="#b03a2e" font-family="Patua One" font-size="14.00" text-anchor="middle" x="504" y="-158.3">Tracking Information Flow</text></a></g></g> <g class="edge" id="edge28"><title>Parser->InformationFlow</title></g> <g class="edge" id="edge30"><title>GeneratorGrammarFuzzer->APIFuzzer</title></g> <g class="edge" id="edge34"><title>WebFuzzer->GUIFuzzer</title></g> <g class="edge" id="edge32"><title>InformationFlow->ConcolicFuzzer</title></g> <g class="edge" id="edge31"><title>InformationFlow->GrammarMiner</title></g> <g class="edge" id="edge33"><title>APIFuzzer->Carver</title></g></g></svg>

但是，由于即使这张地图也可能让人不知所措，因此这里有一些*游览*可以帮助您入门。 根据您是程序员，学生还是研究人员，这些游览中的每一个都可以使您专注于特定视图。

## 实用程序员之旅

您有一个要测试的程序。 您希望尽快并尽可能彻底地生成测试。 您不太在乎如何实现某些东西，但是它应该可以完成工作。 您要讲到重点。

1.  **从[开始测试简介](Intro_Testing.html)以获取基本概念。** （无论如何，您都会了解其中的大多数内容，但是快速获得提醒不会受到伤害）。

2.  **使用[中有关“模糊器”](Fuzzer.html)** 的章节中的简单模糊器，以对您的程序进行测试，以测试其最初的随机输入。

3.  **从程序**获得[覆盖率](Coverage.html)，并使用覆盖率信息来[指导测试生成朝代码覆盖率](GreyboxFuzzer.html)方向发展。

4.  **为程序**定义[输入语法](Grammars.html)，并使用此语法以语法正确的输入彻底模糊程序。 作为模糊器，我们建议使用[语法覆盖率模糊器](GrammarCoverageFuzzer)，因为这样可以确保输入元素的覆盖率。

5.  如果希望**对生成的输入有更多控制，则**考虑使用发生器功能进行[概率模糊](ProbabilisticGrammarFuzzer.html)和[模糊。](GeneratorGrammarFuzzer.html)

6.  如果要**部署大量的模糊器**，请学习如何[管理大量的模糊器](FuzzingInTheLarge.html)。

在每一章中，均以“简介”部分开头； 这些将为您提供有关如何使用事物的快速介绍，并为您提供相关的用法示例。 有了这个，足够说了。 回到工作，享受！

## 分页浏览

这些游览是本书的组织方式。 通过[测试简介](Intro_Testing.html)的基本概念后，您可以阅读以下内容：

1.  **[词汇巡视](02_Lexical_Fuzzing.html)** 专注于*词汇*测试生成技术，即，逐个字符和逐字节组成输入字符的技术。 非常快速和强大的技术，具有最小的偏差。

2.  **[语法浏览](03_Syntactical_Fuzzing.html)** 专注于*语法*，作为指定输入语法的一种手段。 生成的测试生成器会产生语法正确的输入，从而使测试更快，并为测试人员提供许多控制机制。

3.  **[语义导览](04_Semantical_Fuzzing.html)** 利用*代码语义*来塑造和指导测试的产生。 先进的技术包括提取输入语法，挖掘函数规范以及符号约束求解，以覆盖尽可能多的代码路径。

4.  **[应用指南](05_Domain-Specific_Fuzzing.ipynb)** 在域的早期部分中定义了技术，例如Web服务器，用户界面，API或配置。

5.  **[管理之旅](06_Managing_Fuzzing.html)** 最终着重于如何处理和组织大型测试生成器以及何时停止模糊测试。

这些章节中的大多数都以“摘要”部分开头，介绍了如何使用最重要的概念。 您可以选择是要使用“用法”透视图（然后阅读大纲）还是“理解”透视图（然后继续阅读）。

## 本科之旅

您是计算机科学和/或软件工程的学生。 您想了解测试和相关领域的基础知识。 您不仅要使用技术，还要更深入地研究算法和实现。 我们为您提供以下建议：

1.  从[开始，介绍](Intro_Testing.html)和[覆盖率](Coverage.html)的测试，以了解**的基本概念。** （您可能已经知道其中一些，但是，嘿，您是学生，对吗？）

2.  **从[关于Fuzzers](Fuzzer.html) 的一章中了解简单的Fuzzer的工作原理。 这已经为您提供了90年代占用UNIX实用程序30％的工具。 如果您测试以前从未使用过的工具，会发生什么？**

3.  **[基于变异的模糊测试](MutationFuzzer.html)** 几乎是当今模糊测试的标准：获取一组种子，并对它们进行变异，直到发现错误为止。

4.  **了解如何使用[语法](Grammars.html)生成语法正确的输入。** 这样可以使测试生成效率更高，但是您必须首先编写（或[我的](GrammarMiner.html)语法）。

5.  **了解如何[模糊API](APIFuzzer.html) 和[图形用户界面](GUIFuzzer.html)** 。 这两个都是软件测试生成的重要领域。

6.  **了解如何[自动将导致故障的输入](Reducer.html)减少到最小**。 这可以节省大量的调试时间，尤其是与自动化测试结合使用时。

对于所有这些章节，请尝试实现以了解其概念。 随意尝试。

如果您是老师，则以上各章在编程和/或软件工程课程中可能会很有用。 利用幻灯片和/或实时编程，让学生进行练习。

## 研究生导览

在“本科”之旅的顶部，您想更深入地测试生成技术，包括要求更高的技术。

1.  **[基于搜索的测试](SearchBasedFuzzer.html)** 使您可以朝着特定目标（例如代码覆盖率）引导测试生成。 坚固高效。

2.  获得 **[配置测试](ConfigurationFuzzer.html)** 的简介。 如何测试并覆盖具有多个配置选项的系统？

3.  **[突变分析](MutationAnalysis.html)** 将合成缺陷（突变）植入程序代码中，以检查测试是否找到了它们。 如果测试没有发现变异，它们也可能不会发现真正的错误。

4.  **了解如何使用语法解析[输入](Parser.html)的**。 如果要分析，分解和变异现有输入，则需要一个解析器。

5.  **[共形](ConcolicFuzzer.html)和[符号](SymbolicFuzzer.html)模糊测试**沿程序路径求解约束，以到达难以测试的代码。 在可靠性至高无上的地方使用； 也是一个热门的研究主题。

6.  **了解如何[估计何时停止模糊](WhenToStopFuzzing.html)** 。 一定要停下来吧？

对于所有这些章节，请尝试代码。 随时创建自己的变体和扩展。 这就是我们进行研究的方式！

如果您是老师，则以上各章在软件工程和测试的高级课程中可能会很有用。 同样，您可以使用幻灯片和/或实时编程，让学生练习。

## 研究者之旅

在“研究生”之旅的基础上，您正在寻找介于实验室阶段和广泛使用之间的技术，尤其是仍有大量改进空间的技术。 如果您寻找研究思路，请选择这些主题。

1.  **[挖掘函数规范](DynamicInvariants.html)** 是研究中的热门话题：给定一个函数，我们如何推断描述其行为的抽象模型？ 与测试生成的结合在这里提供了许多机会，特别是对于动态规范挖掘。

2.  **[挖掘输入语法](GrammarMiner.html)** 有望将语法模糊的强大功能和易用性与语法模糊的效率和速度结合在一起。 想法是自动从程序中挖掘输入语法，然后将其用作语法模糊测试的基础。 仍处于早期阶段，但潜力巨大。

3.  **[概率语法模糊](ProbabilisticGrammarFuzzer.html)** 使程序员可以更好地控制应生成哪些元素。 如本章所述，在给定测试的概率模糊和挖掘数据的交集处有大量的研究可能性。

4.  **[带生成器的模糊处理](GeneratorGrammarFuzzer.html)** 使程序员可以完全控制输入生成，即允许他们定义自己的生成器功能。 最大的挑战是：如何以最少的上下文约束来最好地利用语法描述的力量？

5.  **[雕刻单元测试](Carver.html)** 通过从仅重播单个函数调用（可能带有新的生成的参数）的程序执行中提取单元测试，带来了显着加快测试执行（和生成）的希望。 。 在Python中，雕刻很容易实现； 这有很大的潜力可玩。

6.  **测试 [Web服务器](WebFuzzer.html)和 [GUI](GUIFuzzer.html)** 是一个热门的研究领域，其原因是从业者需要测试和保护其接口（以及其他从业者需要破解） 通过这些接口）。 同样，这里仍然有很多未开发的潜力。

7.  **[带有语法的灰箱模糊](GreyboxFuzzer.html)和[灰箱模糊](GreyboxGrammarFuzzer.html)** 引入了*统计估计量*，以引导测试生成朝向最可能发现的输入和输入属性 新的错误。 测试，程序分析和统计的交叉点为将来的研究提供了许多可能性。

对于所有这些主题，使实现和演示概念的Pythn源可用是一项主要资产。 您可以根据自己的想法轻松扩展实现，并直接在笔记本中运行评估。 一旦您的方法稳定了，请考虑将其移植到具有更多可用主题的语言（例如C）。

## 作者浏览

这是终极之旅–您已经了解了所有内容，并希望为这本书贡献力量。 然后，您应该再阅读两章：

1.  **[作者指南](Guide_for_Authors.html)** 介绍了如何为本书做出贡献（编码风格，写作风格，约定等）。

2.  **[模板章节](Template.html)** 是本章的蓝图。

如果您想做出贡献，请随时与我们联系-最好在写作之前，但在写作之后也可以。 我们很乐意加入您的资料。

## 经验教训

*   您可以从头到尾浏览这本书...
*   ...但是根据您的需求和资源，最好进行特定的游览。
*   现在[去探索生成软件测试](index.html)！