remove Windows TERM env var hack and -Zmiri-env-exclude

This commit is contained in:
Ralf Jung 2022-09-20 08:42:45 +02:00
parent 4b9463c5b7
commit bacf131acc
5 changed files with 9 additions and 27 deletions

View File

@ -288,14 +288,9 @@ environment variable. We first document the most relevant and most commonly used
execution with a "permission denied" error being returned to the program. execution with a "permission denied" error being returned to the program.
`warn` prints a full backtrace when that happens; `warn-nobacktrace` is less `warn` prints a full backtrace when that happens; `warn-nobacktrace` is less
verbose. `hide` hides the warning entirely. verbose. `hide` hides the warning entirely.
* `-Zmiri-env-exclude=<var>` keeps the `var` environment variable isolated from the host so that it
cannot be accessed by the program. Can be used multiple times to exclude several variables. The
`TERM` environment variable is excluded by default in Windows to prevent the libtest harness from
accessing the file system. This has no effect unless `-Zmiri-disable-isolation` is also set.
* `-Zmiri-env-forward=<var>` forwards the `var` environment variable to the interpreted program. Can * `-Zmiri-env-forward=<var>` forwards the `var` environment variable to the interpreted program. Can
be used multiple times to forward several variables. This takes precedence over be used multiple times to forward several variables. Execution will still be deterministic if the
`-Zmiri-env-exclude`: if a variable is both forwarded and exluced, it *will* get forwarded. This value of forwarded variables stays the same. Has no effect if `-Zmiri-disable-isolation` is set.
means in particular `-Zmiri-env-forward=TERM` overwrites the default exclusion of `TERM`.
* `-Zmiri-ignore-leaks` disables the memory leak checker, and also allows some * `-Zmiri-ignore-leaks` disables the memory leak checker, and also allows some
remaining threads to exist when the main thread exits. remaining threads to exist when the main thread exits.
* `-Zmiri-permissive-provenance` disables the warning for integer-to-pointer casts and * `-Zmiri-permissive-provenance` disables the warning for integer-to-pointer casts and

View File

@ -441,8 +441,10 @@ fn main() {
"-Zmiri-seed should only contain valid hex digits [0-9a-fA-F] and must fit into a u64 (max 16 characters)" "-Zmiri-seed should only contain valid hex digits [0-9a-fA-F] and must fit into a u64 (max 16 characters)"
)); ));
miri_config.seed = Some(seed); miri_config.seed = Some(seed);
} else if let Some(param) = arg.strip_prefix("-Zmiri-env-exclude=") { } else if let Some(_param) = arg.strip_prefix("-Zmiri-env-exclude=") {
miri_config.excluded_env_vars.push(param.to_owned()); show_error!(
"`-Zmiri-env-exclude` has been removed; unset env vars before starting Miri instead"
);
} else if let Some(param) = arg.strip_prefix("-Zmiri-env-forward=") { } else if let Some(param) = arg.strip_prefix("-Zmiri-env-forward=") {
miri_config.forwarded_env_vars.push(param.to_owned()); miri_config.forwarded_env_vars.push(param.to_owned());
} else if let Some(param) = arg.strip_prefix("-Zmiri-track-pointer-tag=") { } else if let Some(param) = arg.strip_prefix("-Zmiri-track-pointer-tag=") {

View File

@ -74,7 +74,7 @@ pub enum BacktraceStyle {
#[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. /// 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`.) /// (This is still subject to isolation as well as `forwarded_env_vars`.)
pub env: Vec<(OsString, OsString)>, pub env: Vec<(OsString, OsString)>,
/// Determine if validity checking is enabled. /// Determine if validity checking is enabled.
pub validate: bool, pub validate: bool,
@ -88,8 +88,6 @@ pub struct MiriConfig {
pub isolated_op: IsolatedOp, pub isolated_op: IsolatedOp,
/// Determines if memory leaks should be ignored. /// Determines if memory leaks should be ignored.
pub ignore_leaks: bool, pub ignore_leaks: bool,
/// Environment variables that should always be isolated from the host.
pub excluded_env_vars: Vec<String>,
/// Environment variables that should always be forwarded from the host. /// Environment variables that should always be forwarded from the host.
pub forwarded_env_vars: Vec<String>, pub forwarded_env_vars: Vec<String>,
/// Command-line arguments passed to the interpreted program. /// Command-line arguments passed to the interpreted program.
@ -146,7 +144,6 @@ impl Default for MiriConfig {
check_abi: true, check_abi: true,
isolated_op: IsolatedOp::Reject(RejectOpWith::Abort), isolated_op: IsolatedOp::Reject(RejectOpWith::Abort),
ignore_leaks: false, ignore_leaks: false,
excluded_env_vars: vec![],
forwarded_env_vars: vec![], forwarded_env_vars: vec![],
args: vec![], args: vec![],
seed: None, seed: None,

View File

@ -42,19 +42,12 @@ impl<'tcx> EnvVars<'tcx> {
config: &MiriConfig, config: &MiriConfig,
) -> InterpResult<'tcx> { ) -> InterpResult<'tcx> {
let target_os = ecx.tcx.sess.target.os.as_ref(); let target_os = ecx.tcx.sess.target.os.as_ref();
let mut excluded_env_vars = config.excluded_env_vars.clone();
if target_os == "windows" {
// HACK: Exclude `TERM` var to avoid terminfo trying to open the termcap file.
excluded_env_vars.push("TERM".to_owned());
}
// 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 &config.env { for (name, value) in &config.env {
// Always forward what is in `forwarded_env_vars`; that list can take precedence over excluded_env_vars. let forward = ecx.machine.communicate()
let forward = config.forwarded_env_vars.iter().any(|v| **v == *name) || config.forwarded_env_vars.iter().any(|v| **v == *name);
|| (ecx.machine.communicate()
&& !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) =>

View File

@ -1,5 +0,0 @@
//@compile-flags: -Zmiri-disable-isolation -Zmiri-env-exclude=MIRI_ENV_VAR_TEST
fn main() {
assert!(std::env::var("MIRI_ENV_VAR_TEST").is_err());
}