建立模糊測試器後,您可以透過幾種方式執行模糊測試器。
在 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
,可執行涵蓋率導向的模糊測試。這些元素還包括 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
的額外工具。也就是說,您需要在 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/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 開啟錯誤,您可以使用其輸出內容來重現發現項目。請參閱「處理透過模糊測試發現的結果」。