-
Notifications
You must be signed in to change notification settings - Fork 20
ACP: ptr::is_aligned_for::<U>
#588
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
The lint would have to learn to not warn about casts guarded by a This ties to my other reservation about the proposal as written: while it allows checking alignment before casting, it doesn’t help with ensuring check + cast are always done together and agree on the type. An alternative would be something closer to |
I've updated the original post to include this idea. |
I have very limited time for open source contributions these days, and I don’t have a big need for this API myself, so I don’t intend to claim any of the work here for myself :) |
ACP:
ptr::is_aligned_for::<U>
Summary
Introduce
ptr::is_aligned_for<U>(self) -> bool
on raw pointers (*const
,*mut
) andNonNull
. This method checks whether the pointer is correctly aligned for a target typeU
, streamlining safe pointer casts without intermediate steps.Alternatively (preferably?), introduce
ptr::try_cast_aligned<U>(self) -> Option<Ptr<U>>
on the same types. This method checks alignment and returns a casted pointer if it is correctly aligned.Motivation
Currently, users that want to perform aligned read/write must cast before checking alignment:
clippy::cast_ptr_alignment
triggers even when alignment checks are valid.Alternatively, users can use
ptr::is_aligned_to
, which is still unstable (see #96284) and less verbose.Here, the problem of invalid alignments discussed in #96284 are not relevant as it would be provided by
core::mem::align_of
.API
Alternative:
try_cast_aligned
As stated and suggested by @hanna-kruppe, it would be wise to combine alignment check and cast as follows:
mirroring
<[T]>::align_to
but at a lower level.This ensures the pointer is cast to the exact same type as the one used for alignment checks.
Rare cases (such as FFI) where the boolean value is needed, one could use
ptr.try_cast_aligned::<SomeType>().is_some()
.The implementation would be a combination of
is_aligned_to
andcast
, so it would compile down to the exact same assembly as the hypotheticalis_aligned_for
.The only downside of this solution is that it loses the verbosity of
is_aligned_for
in such cases.References
ptr::is_aligned
's implementationTracking issue (
is_aligned_for
): Tracking Issue forpointer_is_aligned_for
rust#140980PR (
is_aligned_for
): Implementptr::is_aligned_for
andNonNull::is_aligned_for
. rust#140982Tracking issue (
try_cast_aligned
): Tracking Issue for#![feature(pointer_try_cast_aligned)]
rust#141221PR (
try_cast_aligned
): Implementptr::try_cast_aligned
andNonNull::try_cast_aligned
. rust#141222The text was updated successfully, but these errors were encountered: