运行模糊测试工具

构建模糊测试工具后,您可以通过多种方式执行该模糊测试工具。

在 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,该命令可执行覆盖率引导的模糊测试。这些属性还包括 trycleanseminimizemerge。所有这些措施都可能无限期地执行。

接受输入的命令接受文件和十六进制值。如果提供的输入有歧义,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/coreGN 依赖项。实际上,这意味着要将其添加到代码的“测试”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,您可以使用其输出来重现其发现结果。请参阅处理通过模糊测试找到的结果