changelog: [cast_slice_from_raw_parts]: properly select std/core

Signed-off-by: Zihan <zihanli0822@gmail.com>
This commit is contained in:
Zihan
2025-08-07 19:29:22 -04:00
parent 02111a4d30
commit 42cc75973f
6 changed files with 218 additions and 23 deletions
@@ -1,7 +1,7 @@
use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::get_parent_expr;
use clippy_utils::msrvs::{self, Msrv};
use clippy_utils::source::snippet_with_context;
use clippy_utils::{get_parent_expr, is_no_std_crate};
use rustc_errors::Applicability;
use rustc_hir::def_id::DefId;
use rustc_hir::{Expr, ExprKind};
@@ -44,13 +44,14 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, cast_expr: &Expr<'_>,
let mut applicability = Applicability::MachineApplicable;
let ptr = snippet_with_context(cx, ptr_arg.span, ctxt, "ptr", &mut applicability).0;
let len = snippet_with_context(cx, len_arg.span, ctxt, "len", &mut applicability).0;
let krate = if is_no_std_crate(cx) { "core" } else { "std" };
span_lint_and_sugg(
cx,
CAST_SLICE_FROM_RAW_PARTS,
span,
format!("casting the result of `{func}` to {cast_to}"),
"replace with",
format!("core::ptr::slice_{func}({ptr}, {len})"),
format!("{krate}::ptr::slice_{func}({ptr}, {len})"),
applicability,
);
}
@@ -81,13 +82,14 @@ pub(super) fn check_implicit_cast(cx: &LateContext<'_>, expr: &Expr<'_>) {
let ctxt = expr.span.ctxt();
let ptr = snippet_with_context(cx, ptr_arg.span, ctxt, "ptr", &mut applicability).0;
let len = snippet_with_context(cx, len_arg.span, ctxt, "len", &mut applicability).0;
let krate = if is_no_std_crate(cx) { "core" } else { "std" };
span_lint_and_sugg(
cx,
CAST_SLICE_FROM_RAW_PARTS,
expr.span,
format!("implicitly casting the result of `{func}` to `{target}`"),
"replace_with",
format!("core::ptr::slice_{func}({ptr}, {len})"),
format!("{krate}::ptr::slice_{func}({ptr}, {len})"),
applicability,
);
}
+10 -10
View File
@@ -6,36 +6,36 @@ fn main() {
let mut vec = vec![0u8; 1];
let ptr: *const u8 = vec.as_ptr();
let mptr = vec.as_mut_ptr();
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts(ptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts_mut(mptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
{
use core::slice;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
use slice as one;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
}
{
use std::slice;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
use slice as one;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
let _: *const [u8] = std::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
}
// implicit cast
{
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
let _: *const [u8] = unsafe { std::ptr::slice_from_raw_parts(ptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *mut [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
let _: *mut [u8] = unsafe { std::ptr::slice_from_raw_parts_mut(mptr, 1) };
//~^ cast_slice_from_raw_parts
require_raw_slice_ptr(unsafe { core::ptr::slice_from_raw_parts(ptr, 1) });
require_raw_slice_ptr(unsafe { std::ptr::slice_from_raw_parts(ptr, 1) });
//~^ cast_slice_from_raw_parts
}
+10 -10
View File
@@ -2,7 +2,7 @@ error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:9:35
|
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) as *const [u8] };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
|
= note: `-D clippy::cast-slice-from-raw-parts` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::cast_slice_from_raw_parts)]`
@@ -11,55 +11,55 @@ error: casting the result of `from_raw_parts_mut` to *mut [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:11:35
|
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts_mut(mptr, 1) as *mut [u8] };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts_mut(mptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts_mut(mptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:13:26
|
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:17:30
|
LL | let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:20:30
|
LL | let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:25:30
|
LL | let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast.rs:28:30
|
LL | let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast.rs:34:39
|
LL | let _: *const [u8] = unsafe { std::slice::from_raw_parts(ptr, 1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: implicitly casting the result of `from_raw_parts_mut` to `*mut [u8]`
--> tests/ui/cast_raw_slice_pointer_cast.rs:36:37
|
LL | let _: *mut [u8] = unsafe { std::slice::from_raw_parts_mut(mptr, 1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts_mut(mptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts_mut(mptr, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast.rs:38:40
|
LL | require_raw_slice_ptr(unsafe { std::slice::from_raw_parts(ptr, 1) });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts(ptr, 1)`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `std::ptr::slice_from_raw_parts(ptr, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast.rs:46:39
@@ -0,0 +1,55 @@
#![warn(clippy::cast_slice_from_raw_parts)]
#![no_std]
#![crate_type = "lib"]
const fn require_raw_slice_ptr<T>(_: *const [T]) {}
fn main() {
let mut arr = [0u8; 1];
let ptr: *const u8 = arr.as_ptr();
let mptr = arr.as_mut_ptr();
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
{
use core::slice;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
use slice as one;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
}
{
use core::slice;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
use slice as one;
let _: *const [u8] = core::ptr::slice_from_raw_parts(ptr, 1);
//~^ cast_slice_from_raw_parts
}
// implicit cast
{
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(ptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *mut [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(mptr, 1) };
//~^ cast_slice_from_raw_parts
require_raw_slice_ptr(unsafe { core::ptr::slice_from_raw_parts(ptr, 1) });
//~^ cast_slice_from_raw_parts
}
// implicit cast in const context
const {
const PTR: *const u8 = core::ptr::null();
const MPTR: *mut u8 = core::ptr::null_mut();
let _: *const [u8] = unsafe { core::ptr::slice_from_raw_parts(PTR, 1) };
//~^ cast_slice_from_raw_parts
let _: *mut [u8] = unsafe { core::ptr::slice_from_raw_parts_mut(MPTR, 1) };
//~^ cast_slice_from_raw_parts
require_raw_slice_ptr(unsafe { core::ptr::slice_from_raw_parts(PTR, 1) });
//~^ cast_slice_from_raw_parts
};
}
@@ -0,0 +1,55 @@
#![warn(clippy::cast_slice_from_raw_parts)]
#![no_std]
#![crate_type = "lib"]
const fn require_raw_slice_ptr<T>(_: *const [T]) {}
fn main() {
let mut arr = [0u8; 1];
let ptr: *const u8 = arr.as_ptr();
let mptr = arr.as_mut_ptr();
let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) as *const [u8] };
//~^ cast_slice_from_raw_parts
let _: *const [u8] = unsafe { core::slice::from_raw_parts_mut(mptr, 1) as *mut [u8] };
//~^ cast_slice_from_raw_parts
let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) } as *const [u8];
//~^ cast_slice_from_raw_parts
{
use core::slice;
let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
//~^ cast_slice_from_raw_parts
use slice as one;
let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
//~^ cast_slice_from_raw_parts
}
{
use core::slice;
let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
//~^ cast_slice_from_raw_parts
use slice as one;
let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
//~^ cast_slice_from_raw_parts
}
// implicit cast
{
let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) };
//~^ cast_slice_from_raw_parts
let _: *mut [u8] = unsafe { core::slice::from_raw_parts_mut(mptr, 1) };
//~^ cast_slice_from_raw_parts
require_raw_slice_ptr(unsafe { core::slice::from_raw_parts(ptr, 1) });
//~^ cast_slice_from_raw_parts
}
// implicit cast in const context
const {
const PTR: *const u8 = core::ptr::null();
const MPTR: *mut u8 = core::ptr::null_mut();
let _: *const [u8] = unsafe { core::slice::from_raw_parts(PTR, 1) };
//~^ cast_slice_from_raw_parts
let _: *mut [u8] = unsafe { core::slice::from_raw_parts_mut(MPTR, 1) };
//~^ cast_slice_from_raw_parts
require_raw_slice_ptr(unsafe { core::slice::from_raw_parts(PTR, 1) });
//~^ cast_slice_from_raw_parts
};
}
@@ -0,0 +1,83 @@
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:11:35
|
LL | let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) as *const [u8] };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
|
= note: `-D clippy::cast-slice-from-raw-parts` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::cast_slice_from_raw_parts)]`
error: casting the result of `from_raw_parts_mut` to *mut [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:13:35
|
LL | let _: *const [u8] = unsafe { core::slice::from_raw_parts_mut(mptr, 1) as *mut [u8] };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts_mut(mptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:15:26
|
LL | let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:19:30
|
LL | let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:22:30
|
LL | let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:27:30
|
LL | let _: *const [u8] = unsafe { slice::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: casting the result of `from_raw_parts` to *const [u8]
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:30:30
|
LL | let _: *const [u8] = unsafe { one::from_raw_parts(ptr, 1) } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:36:39
|
LL | let _: *const [u8] = unsafe { core::slice::from_raw_parts(ptr, 1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: implicitly casting the result of `from_raw_parts_mut` to `*mut [u8]`
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:38:37
|
LL | let _: *mut [u8] = unsafe { core::slice::from_raw_parts_mut(mptr, 1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts_mut(mptr, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:40:40
|
LL | require_raw_slice_ptr(unsafe { core::slice::from_raw_parts(ptr, 1) });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts(ptr, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:48:39
|
LL | let _: *const [u8] = unsafe { core::slice::from_raw_parts(PTR, 1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts(PTR, 1)`
error: implicitly casting the result of `from_raw_parts_mut` to `*mut [u8]`
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:50:37
|
LL | let _: *mut [u8] = unsafe { core::slice::from_raw_parts_mut(MPTR, 1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts_mut(MPTR, 1)`
error: implicitly casting the result of `from_raw_parts` to `*const [u8]`
--> tests/ui/cast_raw_slice_pointer_cast_no_std.rs:52:40
|
LL | require_raw_slice_ptr(unsafe { core::slice::from_raw_parts(PTR, 1) });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace_with: `core::ptr::slice_from_raw_parts(PTR, 1)`
error: aborting due to 13 previous errors