execution with a "permission denied" error being returned to the program.
`warn` prints a full backtrace when that happens; `warn-nobacktrace` is less
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
- be used multiple times to forward several variables. This takes precedence over
- `-Zmiri-env-exclude`: if a variable is both forwarded and exluced, it *will* get forwarded. This
- means in particular `-Zmiri-env-forward=TERM` overwrites the default exclusion of `TERM`.
+ be used multiple times to forward several variables. Execution will still be deterministic if the
+ value of forwarded variables stays the same. Has no effect if `-Zmiri-disable-isolation` is set.
* `-Zmiri-ignore-leaks` disables the memory leak checker, and also allows some
remaining threads to exist when the main thread exits.
* `-Zmiri-permissive-provenance` disables the warning for integer-to-pointer casts and
"-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);
- } else if let Some(param) = arg.strip_prefix("-Zmiri-env-exclude=") {
- miri_config.excluded_env_vars.push(param.to_owned());
+ } else if let Some(_param) = arg.strip_prefix("-Zmiri-env-exclude=") {
+ 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=") {
miri_config.forwarded_env_vars.push(param.to_owned());
} else if let Some(param) = arg.strip_prefix("-Zmiri-track-pointer-tag=") {
#[derive(Clone)]
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`.)
+ /// (This is still subject to isolation as well as `forwarded_env_vars`.)
pub env: Vec<(OsString, OsString)>,
/// Determine if validity checking is enabled.
pub validate: bool,
pub isolated_op: IsolatedOp,
/// Determines if memory leaks should be ignored.
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.
pub forwarded_env_vars: Vec<String>,
/// Command-line arguments passed to the interpreted program.
check_abi: true,
isolated_op: IsolatedOp::Reject(RejectOpWith::Abort),
ignore_leaks: false,
- excluded_env_vars: vec![],
forwarded_env_vars: vec![],
args: vec![],
seed: None,
config: &MiriConfig,
) -> InterpResult<'tcx> {
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.
if ecx.machine.communicate() || !config.forwarded_env_vars.is_empty() {
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 = config.forwarded_env_vars.iter().any(|v| **v == *name)
- || (ecx.machine.communicate()
- && !excluded_env_vars.iter().any(|v| **v == *name));
+ let forward = ecx.machine.communicate()
+ || config.forwarded_env_vars.iter().any(|v| **v == *name);
if forward {
let var_ptr = match target_os {
target if target_os_is_unix(target) =>
+++ /dev/null
-//@compile-flags: -Zmiri-disable-isolation -Zmiri-env-exclude=MIRI_ENV_VAR_TEST
-
-fn main() {
- assert!(std::env::var("MIRI_ENV_VAR_TEST").is_err());
-}