執行模糊遊戲

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

在 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
    
  • 如要中斷與模糊測試器的連線並結束殼層:
    exit
    
  • 如何清除螢幕:
    clear
    
  • 如何顯示殼層的指令記錄:
    history
    

大部分指令都需要使用 fuzzer 的component_url 附加至殼層的 fuzzer。附加後,除非透過 stop 指令或Test Manager 停止,否則模糊測試元件會持續運作。您可以從模糊工具卸離,稍後再重新附加。

有些指令代表長時間執行的工作流程。其中包括最重要的指令 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 的額外工具。也就是說,您需要在 fx host-tool 叫用中手動新增任何 libFuzzer 選項

例如:

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 開啟錯誤,您可以使用其輸出內容來重現發現項目。請參閱「處理透過模糊測試發現的結果」。