2017-09-18 04:16:40 -05:00
|
|
|
# Miri [[slides](https://solson.me/miri-slides.pdf)] [[report](https://solson.me/miri-report.pdf)] [![Build Status](https://travis-ci.org/solson/miri.svg?branch=master)](https://travis-ci.org/solson/miri) [![Windows build status](https://ci.appveyor.com/api/projects/status/github/solson/miri?svg=true)](https://ci.appveyor.com/project/solson63299/miri)
|
2016-02-02 04:47:28 -06:00
|
|
|
|
2016-04-13 19:41:37 -05:00
|
|
|
|
2016-04-13 08:32:32 -05:00
|
|
|
An experimental interpreter for [Rust][rust]'s [mid-level intermediate
|
2016-04-13 19:47:03 -05:00
|
|
|
representation][mir] (MIR). This project began as part of my work for the
|
|
|
|
undergraduate research course at the [University of Saskatchewan][usask].
|
2016-02-02 04:47:28 -06:00
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
## Installing Rust
|
2016-04-13 08:32:32 -05:00
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
I recommend that you install [rustup][rustup] and then use it to install the
|
|
|
|
current Rust nightly version:
|
2016-04-13 08:32:32 -05:00
|
|
|
|
|
|
|
```sh
|
2016-06-19 01:04:11 -05:00
|
|
|
rustup update nightly
|
2016-04-13 08:32:32 -05:00
|
|
|
```
|
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
You should also make `nightly` the default version for your Miri directory by
|
|
|
|
running the following command while you're in it. If you don't do this, you can
|
2017-05-23 12:50:07 -05:00
|
|
|
run the later `cargo` commands by using `cargo +nightly` instead.
|
2016-04-13 08:32:32 -05:00
|
|
|
|
|
|
|
```sh
|
2016-06-19 01:04:11 -05:00
|
|
|
rustup override add nightly
|
|
|
|
```
|
|
|
|
|
|
|
|
## Building Miri
|
|
|
|
|
|
|
|
```sh
|
|
|
|
cargo build
|
2016-04-13 08:32:32 -05:00
|
|
|
```
|
|
|
|
|
2016-05-09 19:35:22 -05:00
|
|
|
If Miri fails to build, it's likely because a change in the latest nightly
|
2016-06-19 01:04:11 -05:00
|
|
|
compiler broke it. You could try an older nightly with `rustup update
|
2016-05-09 19:35:22 -05:00
|
|
|
nightly-<date>` where `<date>` is a few days or weeks ago, e.g. `2016-05-20` for
|
|
|
|
May 20th. Otherwise, you could notify me in an issue or on IRC. Or, if you know
|
2016-05-09 19:36:40 -05:00
|
|
|
how to fix it, you could send a PR. :smile:
|
2016-05-09 19:35:22 -05:00
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
## Running tests
|
2016-04-13 08:32:32 -05:00
|
|
|
|
|
|
|
```sh
|
2017-09-30 02:07:07 -05:00
|
|
|
cargo run --bin miri tests/run-pass-fullmir/vecs.rs # Or whatever test you like.
|
2016-04-13 08:32:32 -05:00
|
|
|
```
|
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
## Debugging
|
|
|
|
|
2016-10-31 11:37:54 -05:00
|
|
|
You can get detailed, statement-by-statement traces by setting the `MIRI_LOG`
|
2016-06-19 01:04:11 -05:00
|
|
|
environment variable to `trace`. These traces are indented based on call stack
|
|
|
|
depth. You can get a much less verbose set of information with other logging
|
|
|
|
levels such as `warn`.
|
|
|
|
|
2017-02-02 05:59:41 -06:00
|
|
|
## Running miri on your own project('s test suite)
|
|
|
|
|
|
|
|
Install miri as a cargo subcommand with `cargo install --debug`.
|
|
|
|
Then, inside your own project, use `cargo +nightly miri` to run your project, if it is
|
|
|
|
a bin project, or run `cargo +nightly miri test` to run all tests in your project
|
|
|
|
through miri.
|
|
|
|
|
2017-05-24 17:36:48 -05:00
|
|
|
## Running miri with full libstd
|
|
|
|
|
|
|
|
Per default libstd does not contain the MIR of non-polymorphic functions. When
|
|
|
|
miri hits a call to such a function, execution terminates. To fix this, it is
|
|
|
|
possible to compile libstd with full MIR:
|
|
|
|
|
|
|
|
```sh
|
2017-05-30 15:19:15 -05:00
|
|
|
rustup component add rust-src
|
2017-05-24 17:36:48 -05:00
|
|
|
cargo install xargo
|
|
|
|
cd xargo/
|
2017-05-30 20:12:06 -05:00
|
|
|
RUSTFLAGS='-Zalways-encode-mir' xargo build
|
2017-05-24 17:36:48 -05:00
|
|
|
```
|
|
|
|
|
|
|
|
Now you can run miri against the libstd compiled by xargo:
|
|
|
|
|
|
|
|
```sh
|
2018-07-11 14:13:42 -05:00
|
|
|
MIRI_SYSROOT=~/.xargo/HOST cargo run --bin miri tests/run-pass-fullmir/hashmap.rs
|
2017-05-24 17:36:48 -05:00
|
|
|
```
|
|
|
|
|
|
|
|
Notice that you will have to re-run the last step of the preparations above when
|
2017-05-30 15:19:15 -05:00
|
|
|
your toolchain changes (e.g., when you update the nightly).
|
2017-05-24 17:36:48 -05:00
|
|
|
|
2018-07-11 12:39:09 -05:00
|
|
|
You can also set `-Zmiri-start-fn` to make miri start evaluation with the
|
|
|
|
`start_fn` lang item, instead of starting at the `main` function.
|
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
## Contributing and getting help
|
2016-04-14 03:21:32 -05:00
|
|
|
|
2016-06-19 01:04:11 -05:00
|
|
|
Check out the issues on this GitHub repository for some ideas. There's lots that
|
|
|
|
needs to be done that I haven't documented in the issues yet, however. For more
|
|
|
|
ideas or help with running or hacking on Miri, you can contact me (`scott`) on
|
2016-06-19 01:15:03 -05:00
|
|
|
Mozilla IRC in any of the Rust IRC channels (`#rust`, `#rust-offtopic`, etc).
|
2016-02-02 04:47:28 -06:00
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
Licensed under either of
|
|
|
|
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0)
|
|
|
|
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
|
|
http://opensource.org/licenses/MIT) at your option.
|
|
|
|
|
|
|
|
### Contribution
|
|
|
|
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally submitted
|
|
|
|
for inclusion in the work by you shall be dual licensed as above, without any
|
|
|
|
additional terms or conditions.
|
2016-04-13 08:32:32 -05:00
|
|
|
|
|
|
|
[rust]: https://www.rust-lang.org/
|
|
|
|
[mir]: https://github.com/rust-lang/rfcs/blob/master/text/1211-mir.md
|
|
|
|
[usask]: https://www.usask.ca/
|
2016-04-15 09:50:47 -05:00
|
|
|
[rustup]: https://www.rustup.rs
|