构建模糊测试工具后,您可以通过多种方式执行该模糊测试工具。
在 Fuchsia 设备上运行模糊测试工具
您可以使用 ffx fuzz
工具在本地设备上运行模糊测试工具。我们建议您在开发模糊测试工具时,采用这种方式来运行模糊测试工具。该工具非常有用,因为它知道如何查找与模糊测试相关的文件,并了解各种常见的选项。
在本地进行模糊测试时,使用可通过 ffx fuzz shell
启动的交互式模糊测试 shell 通常很方便。此 shell 可保持与模糊测试工具的连接,并提供 Tab 键自动补全等实用程序。它支持许多命令:
- 如需列出可用的模糊测试工具,请运行以下命令:
list [-p
] - 如需连接到模糊测试工具,请根据需要启动该工具:
attach
[-o - 如需从模糊测试工具获取选项,请执行以下操作:
get [
] - 如需设置模糊测试工具的选项,请执行以下操作:
set
- 如需将输入添加到模糊测试工具的语料库,请执行以下操作:
add [--seed]
- 如需使用模糊测试工具测试特定输入,请执行以下操作:
try
- 如需生成输入并对目标进行模糊测试,请执行以下操作:
run [--runs
] [--time - 如需清除错误输入中的无关字节,请执行以下操作:
cleanse
- 如需减小错误输入的大小,请执行以下操作:
minimize [--runs
] [--time - 如需压缩附加的模糊测试工具的语料库,请使用以下代码:
merge [--corpus
] - 如需获取模糊测试工具的执行状态,请使用以下代码:
status
- 如需检索附加的模糊测试工具的语料库,请使用以下代码:
fetch [--corpus
] [--seed] - 如需断开与模糊测试工具的连接而不停止该测试工具,请使用以下代码:
detach
- 如需停止连接的模糊测试工具,请执行以下操作:
stop
- 如需断开与模糊测试工具的连接并退出 shell,请使用以下命令:
exit
- 如需清除屏幕,请执行以下操作:
clear
- 如需输出 shell 的命令历史记录,请使用以下命令:
history
*component_url连接后,模糊测试工具组件会保持活动状态,直到通过 stop
命令或测试管理器将其停止为止。您可从模糊测试工具中分离出来,稍后再重新连接到该模糊测试工具。
其中一些命令代表长时间运行的工作流。其中包括最重要的命令 run
,该命令可执行覆盖率引导的模糊测试。这些属性还包括 try
、cleanse
、minimize
和 merge
。所有这些措施都可能无限期地执行。
接受输入的命令接受文件和十六进制值。如果提供的输入有歧义,ffx fuzz
会将其视为十六进制值并输出一条警告。您可以通过添加路径元素来强制将其视为文件,例如 ./deadbeef
是文件,而 deadbeef
是值。
综上所述,典型的工作流程可能如下所示(不含注释):
attach fuchsia-pkg://fuchsia.com/my-fuzzers#meta/my-fuzzer.cm # Connect to the fuzzer.
run -t 60m # Run for up to one hour.
try deadbeef # Try a specific input, e.g. reproduce an error found by the step above.
merge -c my-local-dir # Shrink the corpus as much as possible and save it.
stop
exit
在开发主机上运行模糊测试工具
您可以将 Fuchsia 构建系统构建的主机模糊测试工具作为主机工具运行,但不支持 ffx fuzz
的额外工具。这意味着您需要手动将任何 libFuzzer 选项添加到 fx host-tool
调用中。
例如:
fx host-tool my_host_fuzzer -runs=1000
您可以使用 -help=1
查看所有可用选项:
fx host-tool my_host_fuzzer -help=1
在 ClusterFuzz 上运行模糊测试工具
这是在初始开发后运行模糊测试工具的最简单和最推荐的方式。如需在 ClusterFuzz 上运行模糊测试工具,您只需确保它是 //bundles/buildbot/core
的 GN 依赖项。实际上,这意味着要将其添加到代码的“测试”GN 目标中。
例如:
group("tests") {
deps = [
":existing-unittest-package",
":my-fuzzers",
]
}
如果您不确定自己的模糊测试工具是否包含在依赖关系图中,可以使用 gn path
进行检查。
例如:
fx gn path out/default //bundles/buildbot/core path-to-fuzzer
对于 //examples/fuzzers
,会生成:
//bundles/buildbot/core --[public]--> //examples:examples --[private]--> //examples/fuzzers:fuzzers 1 non-data path found. It is not public.
该依赖关系图中的所有模糊测试工具都将可供 ClusterFuzz 选择并运行。如果 ClusterFuzz 打开 bug,您可以使用其输出来重现其发现结果。请参阅处理通过模糊测试找到的结果。