模糊測試 Arrow C++#
為了使處理無效輸入更加穩健,我們已在 Arrow C++ 功能集的幾個部分啟用了模糊測試,目前包括
IPC 串流格式
IPC 檔案格式
Parquet 檔案格式
我們歡迎任何貢獻來擴大模糊測試的範圍,並涵蓋攝取潛在無效或惡意資料的區域。
模糊測試目標與工具程式#
透過傳遞 -DARROW_FUZZING=ON
CMake 選項(或等效地,使用 fuzzing
預設配置),您將建置對應於上述 Arrow 功能的模糊測試目標,以及其他相關的工具程式。
產生種子語料庫#
模糊測試本質上是透過隨機突變先前測試的輸入來探索網域空間,而沒有對正在模糊測試的區域有任何高階理解。然而,網域空間非常龐大,以至於僅靠這種策略可能無法實際產生任何「有趣」的輸入。
為了引導此過程,因此提供一個有效的(或無效的,但值得注意的)輸入種子語料庫非常重要,模糊測試基礎架構可以從中衍生出新的輸入以進行測試。我們提供了一個腳本來自動執行此任務。假設模糊測試可執行檔可以在 build/debug
中找到,則可以這樣產生種子語料庫
$ ./build-support/fuzzing/generate_corpuses.sh build/debug
持續模糊測試基礎架構#
模糊測試的過程是計算密集型的,因此受益於專用的計算設施。Arrow C++ 由 Google 運營的 OSS-Fuzz 持續模糊測試基礎架構進行測試。
由 OSS-Fuzz 發現的問題會通知並提供給有限的一組 核心開發人員。如果您是 Arrow 核心開發人員,並希望被添加到該列表,您可以在 郵件列表 中提出請求。
在本機重現#
當模糊測試發現崩潰時,通常下載用於產生崩潰的資料,並使用它來重現崩潰,以便進行偵錯和調查,這會很有用。
假設您位於 cpp
內的一個子目錄中,以下命令將允許您建置具有偵錯資訊和各種 Sanitizer 檢查啟用的模糊測試目標。
$ cmake .. --preset=fuzzing
然後,假設您已下載崩潰資料檔案(我們稱之為 testcase-arrow-ipc-file-fuzz-123465
),您可以透過在該檔案上執行受影響的模糊測試目標來重現崩潰
$ build/debug/arrow-ipc-file-fuzz testcase-arrow-ipc-file-fuzz-123465
(您可能希望在偵錯器下執行該命令,以便更仔細地檢查程式狀態)
使用 conda#
模糊測試可執行檔必須使用 clang 編譯並連結到提供模糊測試執行階段的程式庫。如果您使用 conda 來提供您的依賴項,您可能需要在建置模糊測試目標之前安裝它們
$ conda install clang clangxx compiler-rt
$ cmake .. --preset=fuzzing