在 miri 中執行測試

miri 中執行 Fuchsia 主機端測試的操作說明。範例使用 //src/sys/lib/cm_rust:cm_rust_test($host_toolchain) 目標。

miri 是 Rust 程式碼的解譯器,可做為強大的工具,在 Rust 程式碼中找出未定義的行為 (UB),類似於 C 和 C++ 等 C++ 的消毒器。

必要條件

安裝 rustup 並執行 rustup update

新增夜間工具鍊 (如果您還沒有的話):

$ rustup install nightly

新增 miri 元件:

$ rustup +nightly component add miri

產生Cargo.toml

執行 cargo miri 需要您的 Crate 的 Cargo.toml 資訊清單。

將版本設定為包含要執行的測試,並產生 Cargo.toml 的測試:

$ fx set PRODUCT.BOARD --with //src/sys/lib/cm_rust:tests --cargo-toml-gen

執行版本:

$ fx build

將產生的資訊清單連結至原始碼存放區:

$ fx gen-cargo '//src/sys/lib/cm_rust:cm_rust_test_executable(//build/toolchain:host_x64)'

詳情請參閱 Fuchsia 的 Cargo 文件。

設定 Miri

cargo miri 必須編譯新的 Rust sysroot,以要求存取未包含在 Fuchsia 樹狀結構中的外部 Crate。

在您的編輯器中開啟 src/.cargo/config,並註解供應商 Crate 的設定:

--- a/src/.cargo/config
+++ b/src/.cargo/config
@@ -1,8 +1,8 @@
-[source.crates-io]
-replace-with = "vendored-sources"
+#[source.crates-io]
+#replace-with = "vendored-sources"

-[source.vendored-sources]
-directory = "../third_party/rust_crates/vendor"
+#[source.vendored-sources]
+#directory = "../third_party/rust_crates/vendor"

執行 cargo +nightly miri setup

執行 Miri

變更為與產生的 Cargo.toml 相同的目錄:

$ cd src/sys/lib/cm_rust

執行 miri:

$ cargo +nightly miri test