fix RUSTC_BACKTRACE always being set

This commit is contained in:
Ralf Jung 2022-08-06 15:21:08 -04:00
parent f633537f3e
commit 76d99c37c9
3 changed files with 16 additions and 5 deletions

View File

@ -306,6 +306,11 @@ fn parse_comma_list<T: FromStr>(input: &str) -> Result<Vec<T>, T::Err> {
} }
fn main() { fn main() {
// Snapshot a copy of the environment before `rustc` starts messing with it.
// (`install_ice_hook` might change `RUST_BACKTRACE`.)
let env_snapshot = env::vars_os().collect::<Vec<_>>();
// Earliest rustc setup.
rustc_driver::install_ice_hook(); rustc_driver::install_ice_hook();
// If the environment asks us to actually be rustc, then do that. // If the environment asks us to actually be rustc, then do that.
@ -333,6 +338,8 @@ fn main() {
// Parse our arguments and split them across `rustc` and `miri`. // Parse our arguments and split them across `rustc` and `miri`.
let mut miri_config = miri::MiriConfig::default(); let mut miri_config = miri::MiriConfig::default();
miri_config.env = env_snapshot;
let mut rustc_args = vec![]; let mut rustc_args = vec![];
let mut after_dashdash = false; let mut after_dashdash = false;

View File

@ -1,7 +1,7 @@
//! Main evaluator loop and setting up the initial stack frame. //! Main evaluator loop and setting up the initial stack frame.
use std::collections::HashSet; use std::collections::HashSet;
use std::ffi::OsStr; use std::ffi::{OsStr, OsString};
use std::iter; use std::iter;
use std::panic::{self, AssertUnwindSafe}; use std::panic::{self, AssertUnwindSafe};
use std::thread; use std::thread;
@ -72,6 +72,9 @@ pub enum BacktraceStyle {
/// Configuration needed to spawn a Miri instance. /// Configuration needed to spawn a Miri instance.
#[derive(Clone)] #[derive(Clone)]
pub struct MiriConfig { pub struct MiriConfig {
/// The host environment snapshot to use as basis for what is provided to the interpreted program.
/// (This is still subject to isolation as well as `excluded_env_vars` and `forwarded_env_vars`.)
pub env: Vec<(OsString, OsString)>,
/// Determine if validity checking is enabled. /// Determine if validity checking is enabled.
pub validate: bool, pub validate: bool,
/// Determines if Stacked Borrows is enabled. /// Determines if Stacked Borrows is enabled.
@ -130,6 +133,7 @@ pub struct MiriConfig {
impl Default for MiriConfig { impl Default for MiriConfig {
fn default() -> MiriConfig { fn default() -> MiriConfig {
MiriConfig { MiriConfig {
env: vec![],
validate: true, validate: true,
stacked_borrows: true, stacked_borrows: true,
check_alignment: AlignmentCheck::Int, check_alignment: AlignmentCheck::Int,

View File

@ -49,11 +49,11 @@ pub(crate) fn init<'mir>(
// Skip the loop entirely if we don't want to forward anything. // Skip the loop entirely if we don't want to forward anything.
if ecx.machine.communicate() || !config.forwarded_env_vars.is_empty() { if ecx.machine.communicate() || !config.forwarded_env_vars.is_empty() {
for (name, value) in env::vars_os() { for (name, value) in &config.env {
// Always forward what is in `forwarded_env_vars`; that list can take precedence over excluded_env_vars. // Always forward what is in `forwarded_env_vars`; that list can take precedence over excluded_env_vars.
let forward = config.forwarded_env_vars.iter().any(|v| **v == name) let forward = config.forwarded_env_vars.iter().any(|v| **v == *name)
|| (ecx.machine.communicate() || (ecx.machine.communicate()
&& !excluded_env_vars.iter().any(|v| **v == name)); && !excluded_env_vars.iter().any(|v| **v == *name));
if forward { if forward {
let var_ptr = match target_os { let var_ptr = match target_os {
target if target_os_is_unix(target) => target if target_os_is_unix(target) =>
@ -65,7 +65,7 @@ pub(crate) fn init<'mir>(
unsupported unsupported
), ),
}; };
ecx.machine.env_vars.map.insert(name, var_ptr); ecx.machine.env_vars.map.insert(name.clone(), var_ptr);
} }
} }
} }