C-Reduce is a tool that takes a large C, C++, or OpenCL file that has a property of interest (such as triggering a compiler bug) and automatically produces a much smaller C/C++ file that has the same property.
I’ve used C-Reduce for reducing complicated Julia test-cases in the past (eg #28595 and #26278), and figured it might be useful for other people. A repo with instructions and support scripts is up at maleadt/creduce_julia, and depends on Julia 1.0+ and C-Reduce 2.8.0+ (both being available on PATH).
Basically, the process boils down to:
- provide a script that has a certain property (eg. it crashes) in
runto catch that property (eg.
julia main.jl |& grep "he's dead, jim")
$ cat main.jl error("example error message") $ tail -n1 run julia --compiled-modules=no -O0 main.jl |& grep "example error message" # verify the `run` script works properly (should initially return 0) $ ./run ERROR: LoadError: example error message $ echo $? 0 $ ./reduce Reducing the following sources: - main.jl ===< 7281 >=== ... ===================== done ====================
If your script depends on certain packages, you can install them in the
depot directory: Start by sourcing the
activate script, which sets
JULIA_PKG_DEVDIR. You can now install packages which will end up in the
depot directory, and will get picked up by the
$ cat main.jl using Compat error("example error message") $ source activate $ julia $ julia -e 'using Pkg; Pkg.add("Compat")' # speed-up the process by removing useless files $ rm -rf depot/packages/**/test $ ./reduce Reducing the following sources: - main.jl - depot/packages/Compat/HVYNa/src/Compat.jl - depot/packages/Compat/HVYNa/src/arraymacros.jl - depot/packages/Compat/HVYNa/src/compatmacro.jl - depot/packages/Compat/HVYNa/src/deprecated.jl ===< 12424 >=== ... ===================== done ====================
The process uses all available processors, but can still take a while (obviously depending on the run-time complexity, but think hours for single-file test-cases and days for multi-package setups). I’ve also used the process in conjunction with automated test-case generation through fuzzing, see this blog post for details.