執行模糊遊戲

建構模糊測試器後,可以透過幾種方式執行。

在 Fuchsia 裝置上執行模糊測試器

您可以使用 ffx fuzz 工具在本機裝置上執行模糊測試器。建議您在開發模糊測試器時,使用這種方式執行模糊測試器。這項工具的實用之處在於,它知道如何尋找模糊測試相關檔案,以及各種常見的選項。

在本機執行模糊測試時,通常會使用互動式模糊測試殼層,可透過 ffx fuzz 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
    
  • 如要列印殼層的指令記錄,請執行下列操作:
    history
    

大多數指令都需要使用 Fuzzer 的附加後,模糊測試器元件會持續運作,直到透過 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 開啟錯誤,您可以使用其輸出內容重現發現的結果。請參閱「處理透過模糊測試找到的結果」。