# Contributing to `gimli` Hi! We'd love to have your contributions! If you want help or mentorship, reach out to us in a GitHub issue, or ping `fitzgen` in `#rust` on `irc.mozilla.org`. * [Code of Conduct](#coc) * [Filing an Issue](#issues) * [Building `gimli`](#building) * [Testing `gimli`](#testing) * [Test Coverage](#coverage) * [Using `test-assembler`](#test-assembler) * [Fuzzing](#fuzzing) * [Benchmarking](#benchmarking) * [Style](#style) ## Code of Conduct We abide by the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html) and ask that you do as well. ## Filing an Issue Think you've found a bug? File an issue! To help us understand and reproduce the issue, provide us with: * The (preferably minimal) test case * Steps to reproduce the issue using the test case * The expected result of following those steps * The actual result of following those steps Definitely file an issue if you see an unexpected panic originating from within `gimli`! `gimli` should never panic unless it is explicitly documented to panic in the specific circumstances provided. ## Building `gimli` `gimli` should always build on stable `rustc`, but we recommend using [`rustup`](https://www.rustup.rs/) so you can switch to nightly `rustc` and run benchmarks. To build `gimli`: ``` $ cargo build ``` ## Testing `gimli` Run the tests with `cargo`: ``` $ cargo test ``` ### Test Coverage If you have `kcov` installed under linux, then you can generate code coverage results using the `coverage` script in the root of the repository, and view them at `target/kcov/index.html`. Otherwise you can create a pull request and view the coverage results on coveralls.io. ``` $ ./coverage ``` The ideal we aim to reach is having our unit tests exercise every branch in `gimli`. We allow an exception for branches which propagate errors inside a `try!(..)` invocation, but we *do* want to exercise the original error paths. Pull requests adding new code should ensure that this ideal is met. At the time of writing we have 94% test coverage according to our coveralls.io continuous integration. That number should generally stay the same or go up ;) This is a bit subjective, because -.001% is just noise and doesn't matter. ### Using `test-assembler` We use the awesome [`test-assembler`](https://github.com/luser/rust-test-assembler) crate to construct binary test data. It makes building complex test cases readable. [Here is an example usage in `gimli`](https://github.com/gimli-rs/gimli/blob/156451f3fe6eeb2fa62b84b362c33fcb176e1171/src/loc.rs#L263) ### Fuzzing First, install `cargo fuzz`: ``` $ cargo install cargo-fuzz ``` Optionally, [set up the corpora for our fuzz targets by following these instructions](https://github.com/gimli-rs/gimli-libfuzzer-corpora/blob/master/README.md#using-these-corpora). Finally, run a fuzz target! In this case, we are running the `eh_frame` fuzz target: ``` $ cargo fuzz run eh_frame ``` The fuzz target definitions live in `fuzz/fuzz_targets/*`. You can add new ones via `cargo fuzz add `. ## Benchmarking The benchmarks require nightly `rustc`, so use `rustup`: ``` $ rustup run nightly cargo bench ``` We aim to be the fastest DWARF library. Period. Please provide before and after benchmark results with your pull requests. You may also find [`cargo benchcmp`](https://github.com/BurntSushi/cargo-benchcmp) handy for comparing results. Pull requests adding `#[bench]` micro-benchmarks that exercise a new edge case are very welcome! ## Style We use `rustfmt` to automatically format and style all of our code. To install `rustfmt`: ``` $ rustup component add rustfmt-preview ``` To run `rustfmt` on `gimli`: ``` $ cargo fmt ```