建構模糊測試器後,可以透過幾種方式執行。
在 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 開啟錯誤,您可以使用其輸出內容重現發現的結果。請參閱「處理透過模糊測試找到的結果」。