Skip to content

Commit cbe294c

Browse files
committed
Auto merge of #13452 - ljgermain:master, r=Centri3
`invalid_null_ptr_usage`: fix false positives for `std::ptr::slice_from_raw_parts` functions fixes #13445 changelog: [`invalid_null_ptr_usage`]: fix false positives for `std::ptr::slice_from_raw_parts` functions
2 parents 26e1660 + 31bbe2c commit cbe294c

File tree

4 files changed

+18
-38
lines changed

4 files changed

+18
-38
lines changed

clippy_lints/src/ptr.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,18 @@ fn check_invalid_ptr_usage<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
271271
&& let Some(fun_def_id) = cx.qpath_res(qpath, fun.hir_id).opt_def_id()
272272
&& let Some(name) = cx.tcx.get_diagnostic_name(fun_def_id)
273273
{
274+
// TODO: `ptr_slice_from_raw_parts` and its mutable variant should probably still be linted
275+
// conditionally based on how the return value is used, but not universally like the other
276+
// functions since there are valid uses for null slice pointers.
277+
//
278+
// See: https://github.com/rust-lang/rust-clippy/pull/13452/files#r1773772034
279+
274280
// `arg` positions where null would cause U.B.
275281
let arg_indices: &[_] = match name {
276282
sym::ptr_read
277283
| sym::ptr_read_unaligned
278284
| sym::ptr_read_volatile
279285
| sym::ptr_replace
280-
| sym::ptr_slice_from_raw_parts
281-
| sym::ptr_slice_from_raw_parts_mut
282286
| sym::ptr_write
283287
| sym::ptr_write_bytes
284288
| sym::ptr_write_unaligned

tests/ui/invalid_null_ptr_usage.fixed

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@ fn main() {
2424
let _a: A = std::ptr::read_volatile(core::ptr::NonNull::dangling().as_ptr());
2525

2626
let _a: A = std::ptr::replace(core::ptr::NonNull::dangling().as_ptr(), A);
27-
28-
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0);
29-
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0);
30-
31-
let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(core::ptr::NonNull::dangling().as_ptr(), 0);
27+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null_mut(), 0); // shouldn't lint
28+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(std::ptr::null_mut(), 0);
3229

3330
std::ptr::swap::<A>(core::ptr::NonNull::dangling().as_ptr(), &mut A);
3431
std::ptr::swap::<A>(&mut A, core::ptr::NonNull::dangling().as_ptr());

tests/ui/invalid_null_ptr_usage.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@ fn main() {
2424
let _a: A = std::ptr::read_volatile(std::ptr::null_mut());
2525

2626
let _a: A = std::ptr::replace(std::ptr::null_mut(), A);
27-
28-
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null(), 0);
29-
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null_mut(), 0);
30-
27+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null_mut(), 0); // shouldn't lint
3128
let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(std::ptr::null_mut(), 0);
3229

3330
std::ptr::swap::<A>(std::ptr::null_mut(), &mut A);

tests/ui/invalid_null_ptr_usage.stderr

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -85,70 +85,52 @@ LL | let _a: A = std::ptr::replace(std::ptr::null_mut(), A);
8585
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
8686

8787
error: pointer must be non-null
88-
--> tests/ui/invalid_null_ptr_usage.rs:28:69
89-
|
90-
LL | let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null(), 0);
91-
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
92-
93-
error: pointer must be non-null
94-
--> tests/ui/invalid_null_ptr_usage.rs:29:69
95-
|
96-
LL | let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null_mut(), 0);
97-
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
98-
99-
error: pointer must be non-null
100-
--> tests/ui/invalid_null_ptr_usage.rs:31:73
101-
|
102-
LL | let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(std::ptr::null_mut(), 0);
103-
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
104-
105-
error: pointer must be non-null
106-
--> tests/ui/invalid_null_ptr_usage.rs:33:29
88+
--> tests/ui/invalid_null_ptr_usage.rs:30:29
10789
|
10890
LL | std::ptr::swap::<A>(std::ptr::null_mut(), &mut A);
10991
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
11092

11193
error: pointer must be non-null
112-
--> tests/ui/invalid_null_ptr_usage.rs:34:37
94+
--> tests/ui/invalid_null_ptr_usage.rs:31:37
11395
|
11496
LL | std::ptr::swap::<A>(&mut A, std::ptr::null_mut());
11597
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
11698

11799
error: pointer must be non-null
118-
--> tests/ui/invalid_null_ptr_usage.rs:36:44
100+
--> tests/ui/invalid_null_ptr_usage.rs:33:44
119101
|
120102
LL | std::ptr::swap_nonoverlapping::<A>(std::ptr::null_mut(), &mut A, 0);
121103
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
122104

123105
error: pointer must be non-null
124-
--> tests/ui/invalid_null_ptr_usage.rs:37:52
106+
--> tests/ui/invalid_null_ptr_usage.rs:34:52
125107
|
126108
LL | std::ptr::swap_nonoverlapping::<A>(&mut A, std::ptr::null_mut(), 0);
127109
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
128110

129111
error: pointer must be non-null
130-
--> tests/ui/invalid_null_ptr_usage.rs:39:25
112+
--> tests/ui/invalid_null_ptr_usage.rs:36:25
131113
|
132114
LL | std::ptr::write(std::ptr::null_mut(), A);
133115
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
134116

135117
error: pointer must be non-null
136-
--> tests/ui/invalid_null_ptr_usage.rs:41:35
118+
--> tests/ui/invalid_null_ptr_usage.rs:38:35
137119
|
138120
LL | std::ptr::write_unaligned(std::ptr::null_mut(), A);
139121
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
140122

141123
error: pointer must be non-null
142-
--> tests/ui/invalid_null_ptr_usage.rs:43:34
124+
--> tests/ui/invalid_null_ptr_usage.rs:40:34
143125
|
144126
LL | std::ptr::write_volatile(std::ptr::null_mut(), A);
145127
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
146128

147129
error: pointer must be non-null
148-
--> tests/ui/invalid_null_ptr_usage.rs:45:40
130+
--> tests/ui/invalid_null_ptr_usage.rs:42:40
149131
|
150132
LL | std::ptr::write_bytes::<usize>(std::ptr::null_mut(), 42, 0);
151133
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
152134

153-
error: aborting due to 25 previous errors
135+
error: aborting due to 22 previous errors
154136

0 commit comments

Comments
 (0)