Cargo Plugins
Here are the 5 cargo plugins I use the most(Keep in mind these depend on the use case):
1. clippy⌗
Clippy is by far the most useful linter, although it gives some false positives it is generally very useful for common mistakes that can be found in Rust code.
For example in this code:
fn main() {
let vec = vec![1, 2, 3, 4];
increase_vec(&vec);
}
fn increase_vec(vector: &Vec<u32>) -> Vec<u32> {
vector.iter().map(|v| v + 1).collect()
}
The default compiler gives no warnings at all. However, using cargo clippy
in the projects’ directory gives us the
following tip:
So we can replace the vector with a reference to an array which is faster since it uses one reference less.
Installing Clippy is very easy:
rustup update
rustup component add clippy
And we can run it using: cargo clippy
2. cargo-checkmate⌗
This plugin bundles a bunch of other plugins together.
It first performs a cargo check
, compares the current formatting with the one of cargo fmt
, checks if
cargo build
passes, checks if tests pass, then checks if the docs compile and lastly runs cargo audit
to check for
vulnerabilities in dependencies.
An output will probably look something like this:
You can install it via:
cargo install cargo-checkmate
And to use it run:
cargo checkmate
And to execute it on every commit execute:
cargo checkmate git-hook install
in the project folder.
3. cargo flamegraph⌗
Cargo flamegraph generates a so-called “flamegraph” of your program. It generates a graph which shows where execution time is being spent in your program. This way it can help you figure out what to optimize in order to get better performance out of your program.
By default, flamegraph will use the release output which is fine for most cases, however in order to get more information we can add
[profile.release]
debug = true
to our Cargo.toml.
To use it properly on Linux we either have to run it as root or lower perf_event_paranoid
(Which may not fit your security
needs):
sudo echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid
This is what a graph looks like, from the example of freshfetch:
4. honggfuzz-rs⌗
Fuzzing has become very important in software security and stability nowadays. This fuzzer, developed by Google, is probably one of the best available.
We install it by using:
cargo install honggfuzz
Add it to project dependencies using:
[dependencies]
honggfuzz = "0.5"
Create a target to fuzz:
extern crate url;
use honggfuzz::fuzz;
fn main(){
println("Starting fuzzer...");
loop{
fuzz!(|data: &[u8]| {
if let Ok(s) = std::str::from_utf8(data) {
let _ = url::Url::parse(s);
}
}
}
}
Now if we run:
cargo hfuzz run TARGET # TARGET is typically the crate name, but it depends
While it’s running we see a hfuzz_workspace directory, which has TARGET directory, where we can find the found unique crashes, along with a honggfuzz report, which contains details on how it crashed.
5. cargo-update⌗
This Plugin is used to update all the binaries we just installed.
Install it by using:
cargo install cargo-update
And update binaries using:
cargo install-update -a
It would probably also make sense to make it a Pacman hook(or something similar on other Linux distros).
Here is mine, though you need to replace the [USER] with your username.
Conclusion⌗
There are obviously many Plugins I haven’t mentioned that are very useful too, for example cargo-criterion, which is useful for benchmarks or cargo-outdated, which helps you keep your dependencies up to date.
But I hope at least some of them were useful to you and made your workflow a bit easier.