mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Improve cast_ptr_alignment lint
* print alignment in bytes in the lint message * ignore ZST left-hand types
This commit is contained in:
parent
8744e8ed26
commit
aa72cac87a
@ -1210,17 +1210,25 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Casts {
|
|||||||
if_chain! {
|
if_chain! {
|
||||||
if let ty::RawPtr(from_ptr_ty) = &cast_from.sty;
|
if let ty::RawPtr(from_ptr_ty) = &cast_from.sty;
|
||||||
if let ty::RawPtr(to_ptr_ty) = &cast_to.sty;
|
if let ty::RawPtr(to_ptr_ty) = &cast_to.sty;
|
||||||
if let Some(from_align) = cx.layout_of(from_ptr_ty.ty).ok().map(|a| a.align.abi);
|
if let Ok(from_layout) = cx.layout_of(from_ptr_ty.ty);
|
||||||
if let Some(to_align) = cx.layout_of(to_ptr_ty.ty).ok().map(|a| a.align.abi);
|
if let Ok(to_layout) = cx.layout_of(to_ptr_ty.ty);
|
||||||
if from_align < to_align;
|
if from_layout.align.abi < to_layout.align.abi;
|
||||||
// with c_void, we inherently need to trust the user
|
// with c_void, we inherently need to trust the user
|
||||||
if !is_c_void(cx, from_ptr_ty.ty);
|
if !is_c_void(cx, from_ptr_ty.ty);
|
||||||
|
// when casting from a ZST, we don't know enough to properly lint
|
||||||
|
if !from_layout.is_zst();
|
||||||
then {
|
then {
|
||||||
span_lint(
|
span_lint(
|
||||||
cx,
|
cx,
|
||||||
CAST_PTR_ALIGNMENT,
|
CAST_PTR_ALIGNMENT,
|
||||||
expr.span,
|
expr.span,
|
||||||
&format!("casting from `{}` to a more-strictly-aligned pointer (`{}`)", cast_from, cast_to)
|
&format!(
|
||||||
|
"casting from `{}` to a more-strictly-aligned pointer (`{}`) ({} < {} bytes)",
|
||||||
|
cast_from,
|
||||||
|
cast_to,
|
||||||
|
from_layout.align.abi.bytes(),
|
||||||
|
to_layout.align.abi.bytes(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,4 +22,6 @@ fn main() {
|
|||||||
// For c_void, we should trust the user. See #2677
|
// For c_void, we should trust the user. See #2677
|
||||||
(&1u32 as *const u32 as *const std::os::raw::c_void) as *const u32;
|
(&1u32 as *const u32 as *const std::os::raw::c_void) as *const u32;
|
||||||
(&1u32 as *const u32 as *const libc::c_void) as *const u32;
|
(&1u32 as *const u32 as *const libc::c_void) as *const u32;
|
||||||
|
// For ZST, we should trust the user. See #4256
|
||||||
|
(&1u32 as *const u32 as *const ()) as *const u32;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`)
|
error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`) (1 < 2 bytes)
|
||||||
--> $DIR/cast_alignment.rs:12:5
|
--> $DIR/cast_alignment.rs:12:5
|
||||||
|
|
|
|
||||||
LL | (&1u8 as *const u8) as *const u16;
|
LL | (&1u8 as *const u8) as *const u16;
|
||||||
@ -6,7 +6,7 @@ LL | (&1u8 as *const u8) as *const u16;
|
|||||||
|
|
|
|
||||||
= note: `-D clippy::cast-ptr-alignment` implied by `-D warnings`
|
= note: `-D clippy::cast-ptr-alignment` implied by `-D warnings`
|
||||||
|
|
||||||
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`)
|
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1 < 2 bytes)
|
||||||
--> $DIR/cast_alignment.rs:13:5
|
--> $DIR/cast_alignment.rs:13:5
|
||||||
|
|
|
|
||||||
LL | (&mut 1u8 as *mut u8) as *mut u16;
|
LL | (&mut 1u8 as *mut u8) as *mut u16;
|
||||||
|
Loading…
Reference in New Issue
Block a user