在 miri 中執行測試

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

miri 是 Rust 程式碼的解譯器,這項強大工具可用來 在 Rust 程式碼中找出未定義的行為 (UB),類似於 C 的清理程式和 C++ 就像 UBSan 一樣。

必要條件

安裝 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