rust-reduce
will try to make the source file smaller by interpreting it as valid Rust code and intelligently removing parts of the code. After each removal, the given command will be run but passing a path to a file containing the reduced code. The command should return 0 if run on the original input, and also if the reduced code is interesting, non-0 otherwise.
The original file will be overwritten with the smallest interesting reduced version, if found. This happens while rust-reduce
is running. The original file will be backed up with the .orig
suffix. If rustfmt
is found, it will be used to clean up the output.
A common way to use rust-reduce
is to write a short shell script that runs rustc
and greps the compiler output for a particular error message. NB. you will want to look for a specific error message because while rust-reduce
will generate syntactically correct code, it's not guaranteed to compile.
The original file may refer to modules in different files, these will be inlined and reduced along with the main file.
This project is inspired by, and should be used in conjuniction with C-reduce.
Although Rust and C syntax are different, they are similar enough that running C-reduce on Rust source code can be very effective! However, C-reduce only works with single input files, whereas Rust has a module system. rust-reduce
can be run on an entire crate and will produce a single reduced output file. rust-reduce
only implements a few reduction passes that are designed to remove large chunks of code, after which C-reduce can take over the reduction.
When using C-reduce and rust-reduce
in the same project, please take note that rust-reduce
will change the command line of the test command whereas C-reduce won't.
Take a look at src/transforms
to see the kind of reductions rust-reduce
can do.
Take a look at the test suite in tests/suite
for example usage.