在 miri 中运行测试

miri 中运行 Fuchsia 主机端测试的说明。这些示例使用 //src/sys/lib/cm_rust:cm_rust_test($host_toolchain) 目标。

miri 是 Rust 代码的解释器,您可以将其用作强大的工具来查找 Rust 代码中的未定义行为 (UB),类似于 UBSan 等 C 和 C++ 的排错程序。

前提条件

安装 rustup 并运行 rustup update

如果还没有每夜工具链,请添加一个:

$ rustup install nightly

添加 miri 组件:

$ rustup +nightly component add miri

生成 Cargo.toml

运行 cargo miri 需要 crate 的 Cargo.toml 清单。

配置 build,以包含要运行的测试并生成 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,并注释掉 vendoring 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