运行模糊测试工具

构建模糊测试器后,您可以通过几种方式执行它。

在 Fuchsia 设备上运行模糊测试工具

您可以使用 ffx fuzz 工具在本地设备上运行模糊测试工具。这是在开发模糊测试工具时运行该工具的推荐方式。该工具非常实用,因为它知道如何查找模糊测试相关文件,并且了解各种常见的选项。

在本地进行模糊测试时,通常可以使用交互式模糊测试 shell,该 shell 可使用 ffx fuzz shell 启动。此 shell 可以保持与模糊测试器的连接,并提供标签页补全等实用程序。它支持多种命令:

  • 如需列出可用的模糊测试器,请执行以下操作:
    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
    

大多数命令都需要使用模糊测试工具的组件网址将模糊测试工具附加到 shell。附加后,模糊测试工具组件会一直处于活动状态,直到通过 stop 命令或 Test Manager 停止为止。您可以从模糊测试器分离,稍后再重新附加到该模糊测试器。

其中一些命令表示长时间运行的工作流。其中包括最重要的命令 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,您可以使用其输出重现发现的结果。请参阅处理通过模糊测试发现的结果。