|new 0.1.0-pre.13||Apr 14, 2021|
|0.1.0-pre.11||Apr 13, 2021|
|0.1.0-pre.3||Mar 29, 2021|
52 downloads per month
A tool for running Rust lints from dynamic libraries
cargo install cargo-dylint --version '>=0.1.0-pre'
Dylint is a Rust linting tool, similar to Clippy. But whereas Clippy runs a predetermined, static set of lints, Dylint runs lints from user-specified, dynamic libraries. Thus, Dylint allows developers to have their own personal lint collections.
The next five commands install Dylint, build one of its example libraries, and run the library's lint on the Dylint source code itself:
cargo install cargo-dylint dylint-link --version '>=0.1.0-pre' # Install cargo-dylint and dylint-link git clone https://github.com/trailofbits/dylint # Clone the Dylint repository cd dylint/examples/allow_clippy # Go to one of the example lint libraries cargo build # Build the library cargo dylint allow_clippy -- --manifest-path ../../Cargo.toml # Run the library's lint on the Dylint source code
You can start writing your own Dylint libraries by forking the
When Dylint is started, the following locations are searched:
- the colon-separated paths in
- the current package's
target/debugdirectory (if in a package)
- the current package's
target/releasedirectory (if in a package)
Any file found in the above locations with a name of the form
DLL_PREFIX LIBRARY_NAME '@' TOOLCHAIN DLL_SUFFIX (see Library requirements below) is considered a Dylint library.
In an invocation of the form
cargo dylint <names>, each
names is compared to the libraries found in the above manner. If
name matches a discovered library's
name resolves to that library. It is considered an error if a
name resolves to multiple libraries.
If the above process does not resolve
name to a library, then
name is treated as a path.
--lib name is used, then
name is is treated only as a library name, and not as a path.
--path name is used, then
name is is treated only as a path, and not as a library name.
A Dylint library must satisfy four requirements. Note: before trying to satisfy these explicitly, see Utilities below.
Have a filename of the form:
DLL_PREFIX LIBRARY_NAME '@' TOOLCHAIN DLL_SUFFIX
The following is a concrete example on Linux:
The filename components are as follows:
DLL_SUFFIXare OS-specific strings. For example, on Linux, they are
LIBARY_NAMEis a name chosen by the library's author.
TOOLCHAINis the Rust toolchain for which the library is compiled, e.g.,
extern "C" fn dylint_version() -> *mut std::os::raw::c_char
This function should return
0.1.0. This may change in future versions of Dylint.
fn register_lints(sess: &rustc_session::Session, lint_store: &mut rustc_lint::LintStore)
This is a function called by the Rust compiler. It is documented here.
Link against the
rustc_driverdynamic library. This ensures the library uses Dylint's copies of the Rust compiler crates. This requirement can be satisfied by including the following declaration in your library's
extern crate rustc_driver;
Dylint provides utilities to help meet the above requirements. If your library uses the
dylint-link tool and the
dylint_library! macro, then all you should have to do is implement the
The following utilities can be helpful for writing Dylint libraries:
dylint-linkis a wrapper around Rust's default linker (
cc) that creates a copy of your library with a filename that Dylint recognizes.
dylint_library!is a macro that automatically defines the
dylint_versionfunction and adds the
extern crate rustc_driverdeclaration.
ui_testis a function that can be used to test Dylint libraries. It provides convenient access to the
clippy_utilsis a collection of utilities to make writing lints easier. It is generously provided by the Rust Clippy Developers.
Useful references for writing lints include: