pub static IMPLICIT_PROVENANCE_CASTS: &LintExpand description
The implicit_provenance_casts lint detects integer-to-pointer and pointer-to-integer
casts.
§Example
#![feature(strict_provenance_lints)]
#![warn(implicit_provenance_casts)]
fn main() {
let x: u8 = 37;
let addr: usize = &x as *const u8 as usize;
let _ptr = addr as *const u8;
}{{produces}}
§Explanation
This lint exists to help migrate code to Strict Provenance APIs where
possible, and make remaining uses of Exposed Provenance explicit.
For more information on pointer provenance, see the std::ptr documentation.
Earlier versions of Rust did not have a clear answer how integer-to-pointer and pointer-to-integer casts interact with provenance. Such casts are now defined to use the exposed provenance model, but in many cases the code can be updated to strict provenance APIs, which is preferable as it enables more precise reasoning about unsafe code, both by humans and by tools like Miri.
However, there are situations where exposed provenance is required or following the strict
provenance model requires major refactorings. In those cases, it’s still useful to replace
the as casts with equivalent explicit use of exposed provenance APIs and a comment
explaining why they are needed.