如何获取未通过Rust借用检查器的代码的MIR?
获取未通过借用检查的Rust代码的MIR方法
正常情况下,通过Rust借用检查的代码可以用以下命令生成MIR:
rustc filename --emit=mir
但未通过借用检查的代码直接用这个命令会失败,比如下面这段示例代码:
fn last_or_push<'a>(vec: &'a mut Vec<String>) -> &'a String { if let Some(s) = vec.last() { // 借用vec // 返回s会强制vec被借用至函数结束,尽管逻辑上没必要 return s; } // 由于vec仍被标记为借用状态,此处调用vec.push会触发错误 vec.push("".to_string()); // 错误 vec.last().unwrap() }
你不需要深度修改Rust编译器,只需调整编译参数,让编译器在执行借用检查前就输出MIR。具体可以用以下两种方式:
方式一:指定编译流程终止于MIR生成阶段
rustc filename.rs --emit=mir -Z stop-after=mir
这个参数会让编译器在生成MIR后立刻停止后续步骤(包括借用检查和代码生成),不管代码是否有借用错误,都能输出对应的MIR。
方式二:结合借用检查器参数(可选)
如果你想确保使用基于MIR的借用检查器(新版本Rust默认已启用),可以加上额外参数:
rustc filename.rs --emit=mir -Z borrowck=mir -Z no-codegen
-Z no-codegen 会跳过代码生成环节,同样能保留MIR输出。
如果需要查看带调试信息的详细MIR,还可以追加参数:
rustc filename.rs --emit=mir -Z stop-after=mir -Z mir-emit-debuginfo
内容的提问来源于stack exchange,提问作者Aimer_zz
相关产品推荐
相关产品推荐

