X-Git-Url: https://git.ralfj.de/web.git/blobdiff_plain/dae0e0ad81a42e13968764a30821b444b1dcba80..cce7a39d255170e4315c5da78949491e07c1c1f9:/personal/_posts/2022-09-26-cargo-careful.md?ds=sidebyside diff --git a/personal/_posts/2022-09-26-cargo-careful.md b/personal/_posts/2022-09-26-cargo-careful.md index 3a1fc6a..28a85c9 100644 --- a/personal/_posts/2022-09-26-cargo-careful.md +++ b/personal/_posts/2022-09-26-cargo-careful.md @@ -5,14 +5,14 @@ reddit: /rust/comments/xogayv/cargo_careful_run_your_rust_code_with_extra/ --- Did you know that the standard library is full of useful checks that users never get to see? -There are plenty of debug assertions in the standard library that will do things like check that `char::from_u32_unchecked` is called on a valid `char`, that `CStr::from_bytes_with_nul_unchecked` does not have internal nul bytes, or that pointer functions such as `read`, `copy`, or `copy_nonoverlapping` are called on suitably aligned non-null (and non-overlapping) pointers. +There are plenty of debug assertions in the standard library that will do things like check that `char::from_u32_unchecked` is called on a valid `char`, that `CStr::from_bytes_with_nul_unchecked` does not have internal nul bytes, or that pointer functions such as `copy` or `copy_nonoverlapping` are called on suitably aligned non-null (and non-overlapping) pointers. However, the regular standard library that is distributed by rustup is compiled without debug assertions, so there is no easy way for users to benefit from all this extra checking. [`cargo careful`](https://github.com/RalfJung/cargo-careful) is here to close this gap: when invoked the first time, it builds a standard library with debug assertions from source, and then runs your program or test suite with that standard library. -Installing `cargo careful` is as easy as `cargo install cargo-careful`, and then you can do `cargo careful run`/`cargo careful test` to execute your binary crates and test suites with an extra amount of debug checking. +Installing `cargo careful` is as easy as `cargo install cargo-careful`, and then you can do `cargo +nightly careful run`/`cargo +nightly careful test` to execute your binary crates and test suites with an extra amount of debug checking. This will naturally be slower than a regular debug or release build, but it is *much* faster than executing your program in [Miri](https://github.com/rust-lang/miri) and still helps find some Undefined Behavior. Unlike Miri, it is fully FFI-compatible (though the code behind the FFI barrier is completely unchecked).