1# Miri 2 3An experimental interpreter for [Rust][rust]'s 4[mid-level intermediate representation][mir] (MIR). It can run binaries and 5test suites of cargo projects and detect certain classes of 6[undefined behavior](https://doc.rust-lang.org/reference/behavior-considered-undefined.html), 7for example: 8 9* Out-of-bounds memory accesses and use-after-free 10* Invalid use of uninitialized data 11* Violation of intrinsic preconditions (an [`unreachable_unchecked`] being 12 reached, calling [`copy_nonoverlapping`] with overlapping ranges, ...) 13* Not sufficiently aligned memory accesses and references 14* Violation of *some* basic type invariants (a `bool` that is not 0 or 1, for example, 15 or an invalid enum discriminant) 16* **Experimental**: Violations of the [Stacked Borrows] rules governing aliasing 17 for reference types 18* **Experimental**: Violations of the [Tree Borrows] aliasing rules, as an optional 19 alternative to [Stacked Borrows] 20* **Experimental**: Data races 21 22On top of that, Miri will also tell you about memory leaks: when there is memory 23still allocated at the end of the execution, and that memory is not reachable 24from a global `static`, Miri will raise an error. 25 26Miri supports almost all Rust language features; in particular, unwinding and 27concurrency are properly supported (including some experimental emulation of 28weak memory effects, i.e., reads can return outdated values). 29 30You can use Miri to emulate programs on other targets, e.g. to ensure that 31byte-level data manipulation works correctly both on little-endian and 32big-endian systems. See 33[cross-interpretation](#cross-interpretation-running-for-different-targets) 34below. 35 36Miri has already discovered some [real-world bugs](#bugs-found-by-miri). If you 37found a bug with Miri, we'd appreciate if you tell us and we'll add it to the 38list! 39 40By default, Miri ensures a fully deterministic execution and isolates the 41program from the host system. Some APIs that would usually access the host, such 42as gathering entropy for random number generators, environment variables, and 43clocks, are replaced by deterministic "fake" implementations. Set 44`MIRIFLAGS="-Zmiri-disable-isolation"` to access the real system APIs instead. 45(In particular, the "fake" system RNG APIs make Miri **not suited for 46cryptographic use**! Do not generate keys using Miri.) 47 48All that said, be aware that Miri will **not catch all cases of undefined 49behavior** in your program, and cannot run all programs: 50 51* There are still plenty of open questions around the basic invariants for some 52 types and when these invariants even have to hold. Miri tries to avoid false 53 positives here, so if your program runs fine in Miri right now that is by no 54 means a guarantee that it is UB-free when these questions get answered. 55 56 In particular, Miri does currently not check that references point to valid data. 57* If the program relies on unspecified details of how data is laid out, it will 58 still run fine in Miri -- but might break (including causing UB) on different 59 compiler versions or different platforms. 60* Program execution is non-deterministic when it depends, for example, on where 61 exactly in memory allocations end up, or on the exact interleaving of 62 concurrent threads. Miri tests one of many possible executions of your 63 program. You can alleviate this to some extent by running Miri with different 64 values for `-Zmiri-seed`, but that will still by far not explore all possible 65 executions. 66* Miri runs the program as a platform-independent interpreter, so the program 67 has no access to most platform-specific APIs or FFI. A few APIs have been 68 implemented (such as printing to stdout, accessing environment variables, and 69 basic file system access) but most have not: for example, Miri currently does 70 not support networking. System API support varies between targets; if you run 71 on Windows it is a good idea to use `--target x86_64-unknown-linux-gnu` to get 72 better support. 73* Weak memory emulation may [produce weak behaviours](https://github.com/rust-lang/miri/issues/2301) 74 unobservable by compiled programs running on real hardware when `SeqCst` fences are used, and it 75 cannot produce all behaviors possibly observable on real hardware. 76 77[rust]: https://www.rust-lang.org/ 78[mir]: https://github.com/rust-lang/rfcs/blob/master/text/1211-mir.md 79[`unreachable_unchecked`]: https://doc.rust-lang.org/stable/std/hint/fn.unreachable_unchecked.html 80[`copy_nonoverlapping`]: https://doc.rust-lang.org/stable/std/ptr/fn.copy_nonoverlapping.html 81[Stacked Borrows]: https://github.com/rust-lang/unsafe-code-guidelines/blob/master/wip/stacked-borrows.md 82[Tree Borrows]: https://perso.crans.org/vanille/treebor/ 83 84 85## Using Miri 86 87Install Miri on Rust nightly via `rustup`: 88 89```sh 90rustup +nightly component add miri 91``` 92 93If `rustup` says the `miri` component is unavailable, that's because not all 94nightly releases come with all tools. Check out 95[this website](https://rust-lang.github.io/rustup-components-history) to 96determine a nightly version that comes with Miri and install that using `rustup 97toolchain install nightly-YYYY-MM-DD`. Either way, all of the following commands 98assume the right toolchain is pinned via `rustup override set nightly` or 99`rustup override set nightly-YYYY-MM-DD`. (Alternatively, use `cargo 100+nightly`/`cargo +nightly-YYYY-MM-DD` for each of the following commands.) 101 102Now you can run your project in Miri: 103 1041. Run `cargo clean` to eliminate any cached dependencies. Miri needs your 105 dependencies to be compiled the right way, that would not happen if they have 106 previously already been compiled. 1072. To run all tests in your project through Miri, use `cargo miri test`. 1083. If you have a binary project, you can run it through Miri using `cargo miri run`. 109 110The first time you run Miri, it will perform some extra setup and install some 111dependencies. It will ask you for confirmation before installing anything. 112 113`cargo miri run/test` supports the exact same flags as `cargo run/test`. For 114example, `cargo miri test filter` only runs the tests containing `filter` in 115their name. 116 117You can pass arguments to Miri via `MIRIFLAGS`. For example, 118`MIRIFLAGS="-Zmiri-disable-stacked-borrows" cargo miri run` runs the program 119without checking the aliasing of references. 120 121When compiling code via `cargo miri`, the `cfg(miri)` config flag is set for code 122that will be interpret under Miri. You can use this to ignore test cases that fail 123under Miri because they do things Miri does not support: 124 125```rust 126#[test] 127#[cfg_attr(miri, ignore)] 128fn does_not_work_on_miri() { 129 tokio::run(futures::future::ok::<_, ()>(())); 130} 131``` 132 133There is no way to list all the infinite things Miri cannot do, but the 134interpreter will explicitly tell you when it finds something unsupported: 135 136``` 137error: unsupported operation: can't call foreign function: bind 138 ... 139 = help: this is likely not a bug in the program; it indicates that the program \ 140 performed an operation that the interpreter does not support 141``` 142 143### Cross-interpretation: running for different targets 144 145Miri can not only run a binary or test suite for your host target, it can also 146perform cross-interpretation for arbitrary foreign targets: `cargo miri run 147--target x86_64-unknown-linux-gnu` will run your program as if it was a Linux 148program, no matter your host OS. This is particularly useful if you are using 149Windows, as the Linux target is much better supported than Windows targets. 150 151You can also use this to test platforms with different properties than your host 152platform. For example `cargo miri test --target mips64-unknown-linux-gnuabi64` 153will run your test suite on a big-endian target, which is useful for testing 154endian-sensitive code. 155 156### Running Miri on CI 157 158To run Miri on CI, make sure that you handle the case where the latest nightly 159does not ship the Miri component because it currently does not build. `rustup 160toolchain install --component` knows how to handle this situation, so the 161following snippet should always work: 162 163```sh 164rustup toolchain install nightly --component miri 165rustup override set nightly 166 167cargo miri test 168``` 169 170Here is an example job for GitHub Actions: 171 172```yaml 173 miri: 174 name: "Miri" 175 runs-on: ubuntu-latest 176 steps: 177 - uses: actions/checkout@v3 178 - name: Install Miri 179 run: | 180 rustup toolchain install nightly --component miri 181 rustup override set nightly 182 cargo miri setup 183 - name: Test with Miri 184 run: cargo miri test 185``` 186 187The explicit `cargo miri setup` helps to keep the output of the actual test step 188clean. 189 190### Testing for alignment issues 191 192Miri can sometimes miss misaligned accesses since allocations can "happen to be" 193aligned just right. You can use `-Zmiri-symbolic-alignment-check` to definitely 194catch all such issues, but that flag will also cause false positives when code 195does manual pointer arithmetic to account for alignment. Another alternative is 196to call Miri with various values for `-Zmiri-seed`; that will alter the 197randomness that is used to determine allocation base addresses. The following 198snippet calls Miri in a loop with different values for the seed: 199 200``` 201for SEED in $(seq 0 255); do 202 echo "Trying seed: $SEED" 203 MIRIFLAGS=-Zmiri-seed=$SEED cargo miri test || { echo "Failing seed: $SEED"; break; }; 204done 205``` 206 207### Supported targets 208 209Miri does not support all targets supported by Rust. The good news, however, is 210that no matter your host OS/platform, it is easy to run code for *any* target 211using `--target`! 212 213The following targets are tested on CI and thus should always work (to the 214degree documented below): 215 216- The best-supported target is `x86_64-unknown-linux-gnu`. Miri releases are 217 blocked on things working with this target. Most other Linux targets should 218 also work well; we do run the test suite on `i686-unknown-linux-gnu` as a 219 32bit target and `mips64-unknown-linux-gnuabi64` as a big-endian target, as 220 well as the ARM targets `aarch64-unknown-linux-gnu` and 221 `arm-unknown-linux-gnueabi`. 222- `x86_64-apple-darwin` should work basically as well as Linux. We also test 223 `aarch64-apple-darwin`. However, we might ship Miri with a nightly even when 224 some features on these targets regress. 225- `x86_64-pc-windows-msvc` works, but supports fewer features than the Linux and 226 Apple targets. For example, file system access and concurrency are not 227 supported on Windows. We also test `i686-pc-windows-msvc`, with the same 228 reduced feature set. We might ship Miri with a nightly even when some features 229 on these targets regress. 230 231### Running tests in parallel 232 233Though it implements Rust threading, Miri itself is a single-threaded interpreter. 234This means that when running `cargo miri test`, you will probably see a dramatic 235increase in the amount of time it takes to run your whole test suite due to the 236inherent interpreter slowdown and a loss of parallelism. 237 238You can get your test suite's parallelism back by running `cargo miri nextest run -jN` 239(note that you will need [`cargo-nextest`](https://nexte.st) installed). 240This works because `cargo-nextest` collects a list of all tests then launches a 241separate `cargo miri run` for each test. You will need to specify a `-j` or `--test-threads`; 242by default `cargo miri nextest run` runs one test at a time. For more details, see the 243[`cargo-nextest` Miri documentation](https://nexte.st/book/miri.html). 244 245Note: This one-test-per-process model means that `cargo miri test` is able to detect data 246races where two tests race on a shared resource, but `cargo miri nextest run` will not detect 247such races. 248 249Note: `cargo-nextest` does not support doctests, see https://github.com/nextest-rs/nextest/issues/16 250 251### Common Problems 252 253When using the above instructions, you may encounter a number of confusing compiler 254errors. 255 256#### "note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace" 257 258You may see this when trying to get Miri to display a backtrace. By default, Miri 259doesn't expose any environment to the program, so running 260`RUST_BACKTRACE=1 cargo miri test` will not do what you expect. 261 262To get a backtrace, you need to disable isolation 263[using `-Zmiri-disable-isolation`][miri-flags]: 264 265```sh 266RUST_BACKTRACE=1 MIRIFLAGS="-Zmiri-disable-isolation" cargo miri test 267``` 268 269#### "found possibly newer version of crate `std` which `<dependency>` depends on" 270 271Your build directory may contain artifacts from an earlier build that have/have 272not been built for Miri. Run `cargo clean` before switching from non-Miri to 273Miri builds and vice-versa. 274 275#### "found crate `std` compiled by an incompatible version of rustc" 276 277You may be running `cargo miri` with a different compiler version than the one 278used to build the custom libstd that Miri uses, and Miri failed to detect that. 279Try deleting `~/.cache/miri`. 280 281#### "no mir for `std::rt::lang_start_internal`" 282 283This means the sysroot you are using was not compiled with Miri in mind. This 284should never happen when you use `cargo miri` because that takes care of setting 285up the sysroot. If you are using `miri` (the Miri driver) directly, see the 286[contributors' guide](CONTRIBUTING.md) for how to use `./miri` to best do that. 287 288 289## Miri `-Z` flags and environment variables 290[miri-flags]: #miri--z-flags-and-environment-variables 291 292Miri adds its own set of `-Z` flags, which are usually set via the `MIRIFLAGS` 293environment variable. We first document the most relevant and most commonly used flags: 294 295* `-Zmiri-compare-exchange-weak-failure-rate=<rate>` changes the failure rate of 296 `compare_exchange_weak` operations. The default is `0.8` (so 4 out of 5 weak ops will fail). 297 You can change it to any value between `0.0` and `1.0`, where `1.0` means it 298 will always fail and `0.0` means it will never fail. Note than setting it to 299 `1.0` will likely cause hangs, since it means programs using 300 `compare_exchange_weak` cannot make progress. 301* `-Zmiri-disable-isolation` disables host isolation. As a consequence, 302 the program has access to host resources such as environment variables, file 303 systems, and randomness. 304* `-Zmiri-disable-leak-backtraces` disables backtraces reports for memory leaks. By default, a 305 backtrace is captured for every allocation when it is created, just in case it leaks. This incurs 306 some memory overhead to store data that is almost never used. This flag is implied by 307 `-Zmiri-ignore-leaks`. 308* `-Zmiri-env-forward=<var>` forwards the `var` environment variable to the interpreted program. Can 309 be used multiple times to forward several variables. Execution will still be deterministic if the 310 value of forwarded variables stays the same. Has no effect if `-Zmiri-disable-isolation` is set. 311* `-Zmiri-ignore-leaks` disables the memory leak checker, and also allows some 312 remaining threads to exist when the main thread exits. 313* `-Zmiri-isolation-error=<action>` configures Miri's response to operations 314 requiring host access while isolation is enabled. `abort`, `hide`, `warn`, 315 and `warn-nobacktrace` are the supported actions. The default is to `abort`, 316 which halts the machine. Some (but not all) operations also support continuing 317 execution with a "permission denied" error being returned to the program. 318 `warn` prints a full backtrace when that happens; `warn-nobacktrace` is less 319 verbose. `hide` hides the warning entirely. 320* `-Zmiri-num-cpus` states the number of available CPUs to be reported by miri. By default, the 321 number of available CPUs is `1`. Note that this flag does not affect how miri handles threads in 322 any way. 323* `-Zmiri-permissive-provenance` disables the warning for integer-to-pointer casts and 324 [`ptr::from_exposed_addr`](https://doc.rust-lang.org/nightly/std/ptr/fn.from_exposed_addr.html). 325 This will necessarily miss some bugs as those operations are not efficiently and accurately 326 implementable in a sanitizer, but it will only miss bugs that concern memory/pointers which is 327 subject to these operations. 328* `-Zmiri-preemption-rate` configures the probability that at the end of a basic block, the active 329 thread will be preempted. The default is `0.01` (i.e., 1%). Setting this to `0` disables 330 preemption. 331* `-Zmiri-report-progress` makes Miri print the current stacktrace every now and then, so you can 332 tell what it is doing when a program just keeps running. You can customize how frequently the 333 report is printed via `-Zmiri-report-progress=<blocks>`, which prints the report every N basic 334 blocks. 335* `-Zmiri-seed=<num>` configures the seed of the RNG that Miri uses to resolve non-determinism. This 336 RNG is used to pick base addresses for allocations, to determine preemption and failure of 337 `compare_exchange_weak`, and to control store buffering for weak memory emulation. When isolation 338 is enabled (the default), this is also used to emulate system entropy. The default seed is 0. You 339 can increase test coverage by running Miri multiple times with different seeds. 340* `-Zmiri-strict-provenance` enables [strict 341 provenance](https://github.com/rust-lang/rust/issues/95228) checking in Miri. This means that 342 casting an integer to a pointer yields a result with 'invalid' provenance, i.e., with provenance 343 that cannot be used for any memory access. 344* `-Zmiri-symbolic-alignment-check` makes the alignment check more strict. By default, alignment is 345 checked by casting the pointer to an integer, and making sure that is a multiple of the alignment. 346 This can lead to cases where a program passes the alignment check by pure chance, because things 347 "happened to be" sufficiently aligned -- there is no UB in this execution but there would be UB in 348 others. To avoid such cases, the symbolic alignment check only takes into account the requested 349 alignment of the relevant allocation, and the offset into that allocation. This avoids missing 350 such bugs, but it also incurs some false positives when the code does manual integer arithmetic to 351 ensure alignment. (The standard library `align_to` method works fine in both modes; under 352 symbolic alignment it only fills the middle slice when the allocation guarantees sufficient 353 alignment.) 354 355The remaining flags are for advanced use only, and more likely to change or be removed. 356Some of these are **unsound**, which means they can lead 357to Miri failing to detect cases of undefined behavior in a program. 358 359* `-Zmiri-disable-abi-check` disables checking [function ABI]. Using this flag 360 is **unsound**. 361* `-Zmiri-disable-alignment-check` disables checking pointer alignment, so you 362 can focus on other failures, but it means Miri can miss bugs in your program. 363 Using this flag is **unsound**. 364* `-Zmiri-disable-data-race-detector` disables checking for data races. Using 365 this flag is **unsound**. This implies `-Zmiri-disable-weak-memory-emulation`. 366* `-Zmiri-disable-stacked-borrows` disables checking the experimental 367 aliasing rules to track borrows ([Stacked Borrows] and [Tree Borrows]). 368 This can make Miri run faster, but it also means no aliasing violations will 369 be detected. Using this flag is **unsound** (but the affected soundness rules 370 are experimental). Later flags take precedence: borrow tracking can be reactivated 371 by `-Zmiri-tree-borrows`. 372* `-Zmiri-disable-validation` disables enforcing validity invariants, which are 373 enforced by default. This is mostly useful to focus on other failures (such 374 as out-of-bounds accesses) first. Setting this flag means Miri can miss bugs 375 in your program. However, this can also help to make Miri run faster. Using 376 this flag is **unsound**. 377* `-Zmiri-disable-weak-memory-emulation` disables the emulation of some C++11 weak 378 memory effects. 379* `-Zmiri-extern-so-file=<path to a shared object file>` is an experimental flag for providing support 380 for FFI calls. Functions not provided by that file are still executed via the usual Miri shims. 381 **WARNING**: If an invalid/incorrect `.so` file is specified, this can cause undefined behaviour in Miri itself! 382 And of course, Miri cannot do any checks on the actions taken by the external code. 383 Note that Miri has its own handling of file descriptors, so if you want to replace *some* functions 384 working on file descriptors, you will have to replace *all* of them, or the two kinds of 385 file descriptors will be mixed up. 386 This is **work in progress**; currently, only integer arguments and return values are 387 supported (and no, pointer/integer casts to work around this limitation will not work; 388 they will fail horribly). It also only works on unix hosts for now. 389 Follow [the discussion on supporting other types](https://github.com/rust-lang/miri/issues/2365). 390* `-Zmiri-measureme=<name>` enables `measureme` profiling for the interpreted program. 391 This can be used to find which parts of your program are executing slowly under Miri. 392 The profile is written out to a file inside a directory called `<name>`, and can be processed 393 using the tools in the repository https://github.com/rust-lang/measureme. 394* `-Zmiri-mute-stdout-stderr` silently ignores all writes to stdout and stderr, 395 but reports to the program that it did actually write. This is useful when you 396 are not interested in the actual program's output, but only want to see Miri's 397 errors and warnings. 398* `-Zmiri-panic-on-unsupported` will makes some forms of unsupported functionality, 399 such as FFI and unsupported syscalls, panic within the context of the emulated 400 application instead of raising an error within the context of Miri (and halting 401 execution). Note that code might not expect these operations to ever panic, so 402 this flag can lead to strange (mis)behavior. 403* `-Zmiri-retag-fields` changes Stacked Borrows retagging to recurse into *all* fields. 404 This means that references in fields of structs/enums/tuples/arrays/... are retagged, 405 and in particular, they are protected when passed as function arguments. 406 (The default is to recurse only in cases where rustc would actually emit a `noalias` attribute.) 407* `-Zmiri-retag-fields=<all|none|scalar>` controls when Stacked Borrows retagging recurses into 408 fields. `all` means it always recurses (like `-Zmiri-retag-fields`), `none` means it never 409 recurses, `scalar` (the default) means it only recurses for types where we would also emit 410 `noalias` annotations in the generated LLVM IR (types passed as individual scalars or pairs of 411 scalars). Setting this to `none` is **unsound**. 412* `-Zmiri-tag-gc=<blocks>` configures how often the pointer tag garbage collector runs. The default 413 is to search for and remove unreachable tags once every `10000` basic blocks. Setting this to 414 `0` disables the garbage collector, which causes some programs to have explosive memory usage 415 and/or super-linear runtime. 416* `-Zmiri-track-alloc-id=<id1>,<id2>,...` shows a backtrace when the given allocations are 417 being allocated or freed. This helps in debugging memory leaks and 418 use after free bugs. Specifying this argument multiple times does not overwrite the previous 419 values, instead it appends its values to the list. Listing an id multiple times has no effect. 420* `-Zmiri-track-call-id=<id1>,<id2>,...` shows a backtrace when the given call ids are 421 assigned to a stack frame. This helps in debugging UB related to Stacked 422 Borrows "protectors". Specifying this argument multiple times does not overwrite the previous 423 values, instead it appends its values to the list. Listing an id multiple times has no effect. 424* `-Zmiri-track-pointer-tag=<tag1>,<tag2>,...` shows a backtrace when a given pointer tag 425 is created and when (if ever) it is popped from a borrow stack (which is where the tag becomes invalid 426 and any future use of it will error). This helps you in finding out why UB is 427 happening and where in your code would be a good place to look for it. 428 Specifying this argument multiple times does not overwrite the previous 429 values, instead it appends its values to the list. Listing a tag multiple times has no effect. 430* `-Zmiri-track-weak-memory-loads` shows a backtrace when weak memory emulation returns an outdated 431 value from a load. This can help diagnose problems that disappear under 432 `-Zmiri-disable-weak-memory-emulation`. 433* `-Zmiri-tree-borrows` replaces [Stacked Borrows] with the [Tree Borrows] rules. 434 The soundness rules are already experimental without this flag, but even more 435 so with this flag. 436* `-Zmiri-force-page-size=<num>` overrides the default page size for an architecture, in multiples of 1k. 437 `4` is default for most targets. This value should always be a power of 2 and nonzero. 438* `-Zmiri-unique-is-unique` performs additional aliasing checks for `core::ptr::Unique` to ensure 439 that it could theoretically be considered `noalias`. This flag is experimental and has 440 an effect only when used with `-Zmiri-tree-borrows`. 441 442[function ABI]: https://doc.rust-lang.org/reference/items/functions.html#extern-function-qualifier 443 444Some native rustc `-Z` flags are also very relevant for Miri: 445 446* `-Zmir-opt-level` controls how many MIR optimizations are performed. Miri 447 overrides the default to be `0`; be advised that using any higher level can 448 make Miri miss bugs in your program because they got optimized away. 449* `-Zalways-encode-mir` makes rustc dump MIR even for completely monomorphic 450 functions. This is needed so that Miri can execute such functions, so Miri 451 sets this flag per default. 452* `-Zmir-emit-retag` controls whether `Retag` statements are emitted. Miri 453 enables this per default because it is needed for [Stacked Borrows] and [Tree Borrows]. 454 455Moreover, Miri recognizes some environment variables: 456 457* `MIRI_AUTO_OPS` indicates whether the automatic execution of rustfmt, clippy and toolchain setup 458 should be skipped. If it is set to any value, they are skipped. This is used for avoiding infinite 459 recursion in `./miri` and to allow automated IDE actions to avoid the auto ops. 460* `MIRI_LOG`, `MIRI_BACKTRACE` control logging and backtrace printing during 461 Miri executions, also [see "Testing the Miri driver" in `CONTRIBUTING.md`][testing-miri]. 462* `MIRIFLAGS` (recognized by `cargo miri` and the test suite) defines extra 463 flags to be passed to Miri. 464* `MIRI_LIB_SRC` defines the directory where Miri expects the sources of the 465 standard library that it will build and use for interpretation. This directory 466 must point to the `library` subdirectory of a `rust-lang/rust` repository 467 checkout. Note that changing files in that directory does not automatically 468 trigger a re-build of the standard library; you have to clear the Miri build 469 cache manually (on Linux, `rm -rf ~/.cache/miri`; 470 on Windows, `rmdir /S "%LOCALAPPDATA%\rust-lang\miri\cache"`; 471 and on macOS, `rm -rf ~/Library/Caches/org.rust-lang.miri`). 472* `MIRI_SYSROOT` (recognized by `cargo miri` and the Miri driver) indicates the sysroot to use. When 473 using `cargo miri`, this skips the automatic setup -- only set this if you do not want to use the 474 automatically created sysroot. For directly invoking the Miri driver, this variable (or a 475 `--sysroot` flag) is mandatory. When invoking `cargo miri setup`, this indicates where the sysroot 476 will be put. 477* `MIRI_TEST_TARGET` (recognized by the test suite and the `./miri` script) indicates which target 478 architecture to test against. `miri` and `cargo miri` accept the `--target` flag for the same 479 purpose. 480* `MIRI_NO_STD` (recognized by `cargo miri` and the test suite) makes sure that the target's 481 sysroot is built without libstd. This allows testing and running no_std programs. 482* `MIRI_BLESS` (recognized by the test suite and `cargo-miri-test/run-test.py`): overwrite all 483 `stderr` and `stdout` files instead of checking whether the output matches. 484* `MIRI_SKIP_UI_CHECKS` (recognized by the test suite): don't check whether the 485 `stderr` or `stdout` files match the actual output. 486 487The following environment variables are *internal* and must not be used by 488anyone but Miri itself. They are used to communicate between different Miri 489binaries, and as such worth documenting: 490 491* `MIRI_BE_RUSTC` can be set to `host` or `target`. It tells the Miri driver to 492 actually not interpret the code but compile it like rustc would. With `target`, Miri sets 493 some compiler flags to prepare the code for interpretation; with `host`, this is not done. 494 This environment variable is useful to be sure that the compiled `rlib`s are compatible 495 with Miri. 496* `MIRI_CALLED_FROM_SETUP` is set during the Miri sysroot build, 497 which will re-invoke `cargo-miri` as the `rustc` to use for this build. 498* `MIRI_CALLED_FROM_RUSTDOC` when set to any value tells `cargo-miri` that it is 499 running as a child process of `rustdoc`, which invokes it twice for each doc-test 500 and requires special treatment, most notably a check-only build before interpretation. 501 This is set by `cargo-miri` itself when running as a `rustdoc`-wrapper. 502* `MIRI_CWD` when set to any value tells the Miri driver to change to the given 503 directory after loading all the source files, but before commencing 504 interpretation. This is useful if the interpreted program wants a different 505 working directory at run-time than at build-time. 506* `MIRI_LOCAL_CRATES` is set by `cargo-miri` to tell the Miri driver which 507 crates should be given special treatment in diagnostics, in addition to the 508 crate currently being compiled. 509* `MIRI_VERBOSE` when set to any value tells the various `cargo-miri` phases to 510 perform verbose logging. 511* `MIRI_HOST_SYSROOT` is set by bootstrap to tell `cargo-miri` which sysroot to use for *host* 512 operations. 513 514[testing-miri]: CONTRIBUTING.md#testing-the-miri-driver 515 516## Miri `extern` functions 517 518Miri provides some `extern` functions that programs can import to access 519Miri-specific functionality. They are declared in 520[/tests/utils/miri\_extern.rs](/tests/utils/miri_extern.rs). 521 522## Contributing and getting help 523 524If you want to contribute to Miri, great! Please check out our 525[contribution guide](CONTRIBUTING.md). 526 527For help with running Miri, you can open an issue here on 528GitHub or use the [Miri stream on the Rust Zulip][zulip]. 529 530[zulip]: https://rust-lang.zulipchat.com/#narrow/stream/269128-miri 531 532## History 533 534This project began as part of an undergraduate research course in 2015 by 535@solson at the [University of Saskatchewan][usask]. There are [slides] and a 536[report] available from that project. In 2016, @oli-obk joined to prepare Miri 537for eventually being used as const evaluator in the Rust compiler itself 538(basically, for `const` and `static` stuff), replacing the old evaluator that 539worked directly on the AST. In 2017, @RalfJung did an internship with Mozilla 540and began developing Miri towards a tool for detecting undefined behavior, and 541also using Miri as a way to explore the consequences of various possible 542definitions for undefined behavior in Rust. @oli-obk's move of the Miri engine 543into the compiler finally came to completion in early 2018. Meanwhile, later 544that year, @RalfJung did a second internship, developing Miri further with 545support for checking basic type invariants and verifying that references are 546used according to their aliasing restrictions. 547 548[usask]: https://www.usask.ca/ 549[slides]: https://solson.me/miri-slides.pdf 550[report]: https://solson.me/miri-report.pdf 551 552## Bugs found by Miri 553 554Miri has already found a number of bugs in the Rust standard library and beyond, which we collect here. 555 556Definite bugs found: 557 558* [`Debug for vec_deque::Iter` accessing uninitialized memory](https://github.com/rust-lang/rust/issues/53566) 559* [`Vec::into_iter` doing an unaligned ZST read](https://github.com/rust-lang/rust/pull/53804) 560* [`From<&[T]> for Rc` creating a not sufficiently aligned reference](https://github.com/rust-lang/rust/issues/54908) 561* [`BTreeMap` creating a shared reference pointing to a too small allocation](https://github.com/rust-lang/rust/issues/54957) 562* [`Vec::append` creating a dangling reference](https://github.com/rust-lang/rust/pull/61082) 563* [Futures turning a shared reference into a mutable one](https://github.com/rust-lang/rust/pull/56319) 564* [`str` turning a shared reference into a mutable one](https://github.com/rust-lang/rust/pull/58200) 565* [`rand` performing unaligned reads](https://github.com/rust-random/rand/issues/779) 566* [The Unix allocator calling `posix_memalign` in an invalid way](https://github.com/rust-lang/rust/issues/62251) 567* [`getrandom` calling the `getrandom` syscall in an invalid way](https://github.com/rust-random/getrandom/pull/73) 568* [`Vec`](https://github.com/rust-lang/rust/issues/69770) and [`BTreeMap`](https://github.com/rust-lang/rust/issues/69769) leaking memory under some (panicky) conditions 569* [`beef` leaking memory](https://github.com/maciejhirsz/beef/issues/12) 570* [`EbrCell` using uninitialized memory incorrectly](https://github.com/Firstyear/concread/commit/b15be53b6ec076acb295a5c0483cdb4bf9be838f#diff-6282b2fc8e98bd089a1f0c86f648157cR229) 571* [TiKV performing an unaligned pointer access](https://github.com/tikv/tikv/issues/7613) 572* [`servo_arc` creating a dangling shared reference](https://github.com/servo/servo/issues/26357) 573* [TiKV constructing out-of-bounds pointers (and overlapping mutable references)](https://github.com/tikv/tikv/pull/7751) 574* [`encoding_rs` doing out-of-bounds pointer arithmetic](https://github.com/hsivonen/encoding_rs/pull/53) 575* [TiKV using `Vec::from_raw_parts` incorrectly](https://github.com/tikv/agatedb/pull/24) 576* Incorrect doctests for [`AtomicPtr`](https://github.com/rust-lang/rust/pull/84052) and [`Box::from_raw_in`](https://github.com/rust-lang/rust/pull/84053) 577* [Insufficient alignment in `ThinVec`](https://github.com/Gankra/thin-vec/pull/27) 578* [`crossbeam-epoch` calling `assume_init` on a partly-initialized `MaybeUninit`](https://github.com/crossbeam-rs/crossbeam/pull/779) 579* [`integer-encoding` dereferencing a misaligned pointer](https://github.com/dermesser/integer-encoding-rs/pull/23) 580* [`rkyv` constructing a `Box<[u8]>` from an overaligned allocation](https://github.com/rkyv/rkyv/commit/a9417193a34757e12e24263178be8b2eebb72456) 581* [Data race in `arc-swap`](https://github.com/vorner/arc-swap/issues/76) 582* [Data race in `thread::scope`](https://github.com/rust-lang/rust/issues/98498) 583* [`regex` incorrectly handling unaligned `Vec<u8>` buffers](https://www.reddit.com/r/rust/comments/vq3mmu/comment/ienc7t0?context=3) 584* [Incorrect use of `compare_exchange_weak` in `once_cell`](https://github.com/matklad/once_cell/issues/186) 585* [Dropping with unaligned pointers in `vec::IntoIter`](https://github.com/rust-lang/rust/pull/106084) 586 587Violations of [Stacked Borrows] found that are likely bugs (but Stacked Borrows is currently just an experiment): 588 589* [`VecDeque::drain` creating overlapping mutable references](https://github.com/rust-lang/rust/pull/56161) 590* Various `BTreeMap` problems 591 * [`BTreeMap` iterators creating mutable references that overlap with shared references](https://github.com/rust-lang/rust/pull/58431) 592 * [`BTreeMap::iter_mut` creating overlapping mutable references](https://github.com/rust-lang/rust/issues/73915) 593 * [`BTreeMap` node insertion using raw pointers outside their valid memory area](https://github.com/rust-lang/rust/issues/78477) 594* [`LinkedList` cursor insertion creating overlapping mutable references](https://github.com/rust-lang/rust/pull/60072) 595* [`Vec::push` invalidating existing references into the vector](https://github.com/rust-lang/rust/issues/60847) 596* [`align_to_mut` violating uniqueness of mutable references](https://github.com/rust-lang/rust/issues/68549) 597* [`sized-chunks` creating aliasing mutable references](https://github.com/bodil/sized-chunks/issues/8) 598* [`String::push_str` invalidating existing references into the string](https://github.com/rust-lang/rust/issues/70301) 599* [`ryu` using raw pointers outside their valid memory area](https://github.com/dtolnay/ryu/issues/24) 600* [ink! creating overlapping mutable references](https://github.com/rust-lang/miri/issues/1364) 601* [TiKV creating overlapping mutable reference and raw pointer](https://github.com/tikv/tikv/pull/7709) 602* [Windows `Env` iterator using a raw pointer outside its valid memory area](https://github.com/rust-lang/rust/pull/70479) 603* [`VecDeque::iter_mut` creating overlapping mutable references](https://github.com/rust-lang/rust/issues/74029) 604* [Various standard library aliasing issues involving raw pointers](https://github.com/rust-lang/rust/pull/78602) 605* [`<[T]>::copy_within` using a loan after invalidating it](https://github.com/rust-lang/rust/pull/85610) 606 607## Scientific papers employing Miri 608 609* [Stacked Borrows: An Aliasing Model for Rust](https://plv.mpi-sws.org/rustbelt/stacked-borrows/) 610* [Using Lightweight Formal Methods to Validate a Key-Value Storage Node in Amazon S3](https://www.amazon.science/publications/using-lightweight-formal-methods-to-validate-a-key-value-storage-node-in-amazon-s3) 611* [SyRust: Automatic Testing of Rust Libraries with Semantic-Aware Program Synthesis](https://dl.acm.org/doi/10.1145/3453483.3454084) 612 613## License 614 615Licensed under either of 616 617 * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or 618 http://www.apache.org/licenses/LICENSE-2.0) 619 * MIT license ([LICENSE-MIT](LICENSE-MIT) or 620 http://opensource.org/licenses/MIT) 621 622at your option. 623 624### Contribution 625 626Unless you explicitly state otherwise, any contribution intentionally submitted 627for inclusion in the work by you shall be dual licensed as above, without any 628additional terms or conditions. 629