Skip to content

Commit 79ed1c7

Browse files
committed
Add remaining functions from std::ptr.
1 parent e15d0ce commit 79ed1c7

File tree

5 files changed

+259
-51
lines changed

5 files changed

+259
-51
lines changed

clippy_lints/src/ptr.rs

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,6 @@ impl<'tcx> LateLintPass<'tcx> for Ptr {
173173
}
174174

175175
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
176-
const INVALID_NULL_PTR_USAGE_FNS: [&[&'static str]; 2] =
177-
[&paths::SLICE_FROM_RAW_PARTS, &paths::SLICE_FROM_RAW_PARTS_MUT];
178-
179176
if let ExprKind::Binary(ref op, ref l, ref r) = expr.kind {
180177
if (op.node == BinOpKind::Eq || op.node == BinOpKind::Ne) && (is_null_path(l) || is_null_path(r)) {
181178
span_lint(
@@ -185,27 +182,58 @@ impl<'tcx> LateLintPass<'tcx> for Ptr {
185182
"comparing with null is better expressed by the `.is_null()` method",
186183
);
187184
}
188-
} else if let Some(arg) = INVALID_NULL_PTR_USAGE_FNS
189-
.iter()
190-
.filter_map(|fn_name| match_function_call(cx, expr, fn_name))
191-
.next()
192-
.and_then(|args| args.first())
193-
{
194-
if is_null_path(arg) {
195-
span_lint_and_sugg(
196-
cx,
197-
INVALID_NULL_PTR_USAGE,
198-
arg.span,
199-
"pointer must be non-null",
200-
"change this to",
201-
"core::ptr::NonNull::dangling().as_ptr()".to_string(),
202-
Applicability::MachineApplicable,
203-
);
204-
}
185+
} else {
186+
check_invalid_ptr_usage(cx, expr);
205187
}
206188
}
207189
}
208190

191+
fn check_invalid_ptr_usage<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) -> Option<()> {
192+
// fn_name, arg_idx
193+
const INVALID_NULL_PTR_USAGE_TABLE: [(&[&str], usize); 20] = [
194+
(&paths::SLICE_FROM_RAW_PARTS, 0),
195+
(&paths::SLICE_FROM_RAW_PARTS_MUT, 0),
196+
(&paths::PTR_COPY, 0),
197+
(&paths::PTR_COPY, 1),
198+
(&paths::PTR_COPY_NONOVERLAPPING, 0),
199+
(&paths::PTR_COPY_NONOVERLAPPING, 1),
200+
(&paths::PTR_READ, 0),
201+
(&paths::PTR_READ_UNALIGNED, 0),
202+
(&paths::PTR_READ_VOLATILE, 0),
203+
(&paths::PTR_REPLACE, 0),
204+
(&paths::PTR_SLICE_FROM_RAW_PARTS, 0),
205+
(&paths::PTR_SLICE_FROM_RAW_PARTS_MUT, 0),
206+
(&paths::PTR_SWAP, 0),
207+
(&paths::PTR_SWAP, 1),
208+
(&paths::PTR_SWAP_NONOVERLAPPING, 0),
209+
(&paths::PTR_SWAP_NONOVERLAPPING, 1),
210+
(&paths::PTR_WRITE, 0),
211+
(&paths::PTR_WRITE_UNALIGNED, 0),
212+
(&paths::PTR_WRITE_VOLATILE, 0),
213+
(&paths::PTR_WRITE_BYTES, 0),
214+
];
215+
216+
let arg = INVALID_NULL_PTR_USAGE_TABLE
217+
.iter()
218+
.filter_map(|(fn_name, arg_idx)| {
219+
let args = match_function_call(cx, expr, fn_name)?;
220+
args.iter().nth(*arg_idx).filter(|arg| is_null_path(arg))
221+
})
222+
.next()?;
223+
224+
span_lint_and_sugg(
225+
cx,
226+
INVALID_NULL_PTR_USAGE,
227+
arg.span,
228+
"pointer must be non-null",
229+
"change this to",
230+
format!("core::ptr::NonNull::dangling().as_ptr()"),
231+
Applicability::MachineApplicable,
232+
);
233+
234+
Some(())
235+
}
236+
209237
#[allow(clippy::too_many_lines)]
210238
fn check_fn(cx: &LateContext<'_>, decl: &FnDecl<'_>, fn_id: HirId, opt_body_id: Option<BodyId>) {
211239
let fn_def_id = cx.tcx.hir().local_def_id(fn_id);

clippy_lints/src/utils/paths.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,23 @@ pub const PATH_TO_PATH_BUF: [&str; 4] = ["std", "path", "Path", "to_path_buf"];
9292
pub const POLL: [&str; 4] = ["core", "task", "poll", "Poll"];
9393
pub const POLL_PENDING: [&str; 5] = ["core", "task", "poll", "Poll", "Pending"];
9494
pub const POLL_READY: [&str; 5] = ["core", "task", "poll", "Poll", "Ready"];
95+
pub const PTR_COPY: [&str; 3] = ["core", "ptr", "copy"];
96+
pub const PTR_COPY_NONOVERLAPPING: [&str; 3] = ["core", "ptr", "copy_nonoverlapping"];
9597
pub const PTR_EQ: [&str; 3] = ["core", "ptr", "eq"];
9698
pub const PTR_NULL: [&str; 3] = ["core", "ptr", "null"];
9799
pub const PTR_NULL_MUT: [&str; 3] = ["core", "ptr", "null_mut"];
100+
pub const PTR_READ: [&str; 3] = ["core", "ptr", "read"];
101+
pub const PTR_READ_UNALIGNED: [&str; 3] = ["core", "ptr", "read_unaligned"];
102+
pub const PTR_READ_VOLATILE: [&str; 3] = ["core", "ptr", "read_volatile"];
103+
pub const PTR_REPLACE: [&str; 3] = ["core", "ptr", "replace"];
104+
pub const PTR_SLICE_FROM_RAW_PARTS: [&str; 3] = ["core", "ptr", "slice_from_raw_parts"];
105+
pub const PTR_SLICE_FROM_RAW_PARTS_MUT: [&str; 3] = ["core", "ptr", "slice_from_raw_parts_mut"];
106+
pub const PTR_SWAP: [&str; 3] = ["core", "ptr", "swap"];
107+
pub const PTR_SWAP_NONOVERLAPPING: [&str; 3] = ["core", "ptr", "swap_nonoverlapping"];
108+
pub const PTR_WRITE: [&str; 3] = ["core", "ptr", "write"];
109+
pub const PTR_WRITE_BYTES: [&str; 3] = ["core", "intrinsics", "write_bytes"];
110+
pub const PTR_WRITE_UNALIGNED: [&str; 3] = ["core", "ptr", "write_unaligned"];
111+
pub const PTR_WRITE_VOLATILE: [&str; 3] = ["core", "ptr", "write_volatile"];
98112
pub const PUSH_STR: [&str; 4] = ["alloc", "string", "String", "push_str"];
99113
pub const RANGE_ARGUMENT_TRAIT: [&str; 3] = ["core", "ops", "RangeBounds"];
100114
pub const RC: [&str; 3] = ["alloc", "rc", "Rc"];

tests/ui/invalid_null_ptr_usage.fixed

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,49 @@
11
// run-rustfix
22

33
fn main() {
4-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0) };
5-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0) };
6-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0) };
7-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0) };
4+
unsafe {
5+
let _slice: &[usize] = std::slice::from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0);
6+
let _slice: &[usize] = std::slice::from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0);
87

9-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts_mut(core::ptr::NonNull::dangling().as_ptr(), 0) };
10-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts_mut(core::ptr::NonNull::dangling().as_ptr(), 0) };
8+
let _slice: &[usize] = std::slice::from_raw_parts_mut(core::ptr::NonNull::dangling().as_ptr(), 0);
9+
10+
std::ptr::copy::<usize>(std::ptr::null(), std::ptr::NonNull::dangling().as_ptr(), 0);
11+
std::ptr::copy::<usize>(std::ptr::NonNull::dangling().as_ptr(), std::ptr::null_mut(), 0);
12+
13+
std::ptr::copy_nonoverlapping::<usize>(std::ptr::null(), std::ptr::NonNull::dangling().as_ptr(), 0);
14+
std::ptr::copy_nonoverlapping::<usize>(std::ptr::NonNull::dangling().as_ptr(), std::ptr::null_mut(), 0);
15+
16+
struct A; // zero sized struct
17+
assert_eq!(std::mem::size_of::<A>(), 0);
18+
19+
let _a: A = std::ptr::read(core::ptr::NonNull::dangling().as_ptr());
20+
let _a: A = std::ptr::read(core::ptr::NonNull::dangling().as_ptr());
21+
22+
let _a: A = std::ptr::read_unaligned(core::ptr::NonNull::dangling().as_ptr());
23+
let _a: A = std::ptr::read_unaligned(core::ptr::NonNull::dangling().as_ptr());
24+
25+
let _a: A = std::ptr::read_volatile(core::ptr::NonNull::dangling().as_ptr());
26+
let _a: A = std::ptr::read_volatile(core::ptr::NonNull::dangling().as_ptr());
27+
28+
let _a: A = std::ptr::replace(core::ptr::NonNull::dangling().as_ptr(), A);
29+
30+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0);
31+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(core::ptr::NonNull::dangling().as_ptr(), 0);
32+
33+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(core::ptr::NonNull::dangling().as_ptr(), 0);
34+
35+
std::ptr::swap::<A>(core::ptr::NonNull::dangling().as_ptr(), &mut A);
36+
std::ptr::swap::<A>(&mut A, core::ptr::NonNull::dangling().as_ptr());
37+
38+
std::ptr::swap_nonoverlapping::<A>(core::ptr::NonNull::dangling().as_ptr(), &mut A, 0);
39+
std::ptr::swap_nonoverlapping::<A>(&mut A, core::ptr::NonNull::dangling().as_ptr(), 0);
40+
41+
std::ptr::write(core::ptr::NonNull::dangling().as_ptr(), A);
42+
43+
std::ptr::write_unaligned(core::ptr::NonNull::dangling().as_ptr(), A);
44+
45+
std::ptr::write_volatile(core::ptr::NonNull::dangling().as_ptr(), A);
46+
47+
std::ptr::write_bytes::<usize>(core::ptr::NonNull::dangling().as_ptr(), 42, 0);
48+
}
1149
}

tests/ui/invalid_null_ptr_usage.rs

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,49 @@
11
// run-rustfix
22

33
fn main() {
4-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(std::ptr::null(), 0) };
5-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::null(), 0) };
6-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(std::ptr::null_mut(), 0) };
7-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::null_mut(), 0) };
4+
unsafe {
5+
let _slice: &[usize] = std::slice::from_raw_parts(std::ptr::null(), 0);
6+
let _slice: &[usize] = std::slice::from_raw_parts(std::ptr::null_mut(), 0);
87

9-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts_mut(std::ptr::null_mut(), 0) };
10-
let _slice: &[usize] = unsafe { std::slice::from_raw_parts_mut(core::ptr::null_mut(), 0) };
8+
let _slice: &[usize] = std::slice::from_raw_parts_mut(std::ptr::null_mut(), 0);
9+
10+
std::ptr::copy::<usize>(std::ptr::null(), std::ptr::NonNull::dangling().as_ptr(), 0);
11+
std::ptr::copy::<usize>(std::ptr::NonNull::dangling().as_ptr(), std::ptr::null_mut(), 0);
12+
13+
std::ptr::copy_nonoverlapping::<usize>(std::ptr::null(), std::ptr::NonNull::dangling().as_ptr(), 0);
14+
std::ptr::copy_nonoverlapping::<usize>(std::ptr::NonNull::dangling().as_ptr(), std::ptr::null_mut(), 0);
15+
16+
struct A; // zero sized struct
17+
assert_eq!(std::mem::size_of::<A>(), 0);
18+
19+
let _a: A = std::ptr::read(std::ptr::null());
20+
let _a: A = std::ptr::read(std::ptr::null_mut());
21+
22+
let _a: A = std::ptr::read_unaligned(std::ptr::null());
23+
let _a: A = std::ptr::read_unaligned(std::ptr::null_mut());
24+
25+
let _a: A = std::ptr::read_volatile(std::ptr::null());
26+
let _a: A = std::ptr::read_volatile(std::ptr::null_mut());
27+
28+
let _a: A = std::ptr::replace(std::ptr::null_mut(), A);
29+
30+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null(), 0);
31+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null_mut(), 0);
32+
33+
let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(std::ptr::null_mut(), 0);
34+
35+
std::ptr::swap::<A>(std::ptr::null_mut(), &mut A);
36+
std::ptr::swap::<A>(&mut A, std::ptr::null_mut());
37+
38+
std::ptr::swap_nonoverlapping::<A>(std::ptr::null_mut(), &mut A, 0);
39+
std::ptr::swap_nonoverlapping::<A>(&mut A, std::ptr::null_mut(), 0);
40+
41+
std::ptr::write(std::ptr::null_mut(), A);
42+
43+
std::ptr::write_unaligned(std::ptr::null_mut(), A);
44+
45+
std::ptr::write_volatile(std::ptr::null_mut(), A);
46+
47+
std::ptr::write_bytes::<usize>(std::ptr::null_mut(), 42, 0);
48+
}
1149
}
Lines changed: 109 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,130 @@
11
error: pointer must be non-null
2-
--> $DIR/invalid_null_ptr_usage.rs:4:64
2+
--> $DIR/invalid_null_ptr_usage.rs:5:59
33
|
4-
LL | let _slice: &[usize] = unsafe { std::slice::from_raw_parts(std::ptr::null(), 0) };
5-
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
4+
LL | let _slice: &[usize] = std::slice::from_raw_parts(std::ptr::null(), 0);
5+
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
66
|
77
= note: `#[deny(clippy::invalid_null_ptr_usage)]` on by default
88

99
error: pointer must be non-null
10-
--> $DIR/invalid_null_ptr_usage.rs:5:64
10+
--> $DIR/invalid_null_ptr_usage.rs:6:59
1111
|
12-
LL | let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::null(), 0) };
13-
| ^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
12+
LL | let _slice: &[usize] = std::slice::from_raw_parts(std::ptr::null_mut(), 0);
13+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
1414

1515
error: pointer must be non-null
16-
--> $DIR/invalid_null_ptr_usage.rs:6:64
16+
--> $DIR/invalid_null_ptr_usage.rs:8:63
1717
|
18-
LL | let _slice: &[usize] = unsafe { std::slice::from_raw_parts(std::ptr::null_mut(), 0) };
19-
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
18+
LL | let _slice: &[usize] = std::slice::from_raw_parts_mut(std::ptr::null_mut(), 0);
19+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
2020

2121
error: pointer must be non-null
22-
--> $DIR/invalid_null_ptr_usage.rs:7:64
22+
--> $DIR/invalid_null_ptr_usage.rs:19:36
2323
|
24-
LL | let _slice: &[usize] = unsafe { std::slice::from_raw_parts(core::ptr::null_mut(), 0) };
25-
| ^^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
24+
LL | let _a: A = std::ptr::read(std::ptr::null());
25+
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
2626

2727
error: pointer must be non-null
28-
--> $DIR/invalid_null_ptr_usage.rs:9:68
28+
--> $DIR/invalid_null_ptr_usage.rs:20:36
2929
|
30-
LL | let _slice: &[usize] = unsafe { std::slice::from_raw_parts_mut(std::ptr::null_mut(), 0) };
31-
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
30+
LL | let _a: A = std::ptr::read(std::ptr::null_mut());
31+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
3232

3333
error: pointer must be non-null
34-
--> $DIR/invalid_null_ptr_usage.rs:10:68
34+
--> $DIR/invalid_null_ptr_usage.rs:22:46
3535
|
36-
LL | let _slice: &[usize] = unsafe { std::slice::from_raw_parts_mut(core::ptr::null_mut(), 0) };
37-
| ^^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
36+
LL | let _a: A = std::ptr::read_unaligned(std::ptr::null());
37+
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
3838

39-
error: aborting due to 6 previous errors
39+
error: pointer must be non-null
40+
--> $DIR/invalid_null_ptr_usage.rs:23:46
41+
|
42+
LL | let _a: A = std::ptr::read_unaligned(std::ptr::null_mut());
43+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
44+
45+
error: pointer must be non-null
46+
--> $DIR/invalid_null_ptr_usage.rs:25:45
47+
|
48+
LL | let _a: A = std::ptr::read_volatile(std::ptr::null());
49+
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
50+
51+
error: pointer must be non-null
52+
--> $DIR/invalid_null_ptr_usage.rs:26:45
53+
|
54+
LL | let _a: A = std::ptr::read_volatile(std::ptr::null_mut());
55+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
56+
57+
error: pointer must be non-null
58+
--> $DIR/invalid_null_ptr_usage.rs:28:39
59+
|
60+
LL | let _a: A = std::ptr::replace(std::ptr::null_mut(), A);
61+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
62+
63+
error: pointer must be non-null
64+
--> $DIR/invalid_null_ptr_usage.rs:30:69
65+
|
66+
LL | let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null(), 0);
67+
| ^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
68+
69+
error: pointer must be non-null
70+
--> $DIR/invalid_null_ptr_usage.rs:31:69
71+
|
72+
LL | let _slice: *const [usize] = std::ptr::slice_from_raw_parts(std::ptr::null_mut(), 0);
73+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
74+
75+
error: pointer must be non-null
76+
--> $DIR/invalid_null_ptr_usage.rs:33:73
77+
|
78+
LL | let _slice: *const [usize] = std::ptr::slice_from_raw_parts_mut(std::ptr::null_mut(), 0);
79+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
80+
81+
error: pointer must be non-null
82+
--> $DIR/invalid_null_ptr_usage.rs:35:29
83+
|
84+
LL | std::ptr::swap::<A>(std::ptr::null_mut(), &mut A);
85+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
86+
87+
error: pointer must be non-null
88+
--> $DIR/invalid_null_ptr_usage.rs:36:37
89+
|
90+
LL | std::ptr::swap::<A>(&mut A, std::ptr::null_mut());
91+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
92+
93+
error: pointer must be non-null
94+
--> $DIR/invalid_null_ptr_usage.rs:38:44
95+
|
96+
LL | std::ptr::swap_nonoverlapping::<A>(std::ptr::null_mut(), &mut A, 0);
97+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
98+
99+
error: pointer must be non-null
100+
--> $DIR/invalid_null_ptr_usage.rs:39:52
101+
|
102+
LL | std::ptr::swap_nonoverlapping::<A>(&mut A, 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+
--> $DIR/invalid_null_ptr_usage.rs:41:25
107+
|
108+
LL | std::ptr::write(std::ptr::null_mut(), A);
109+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
110+
111+
error: pointer must be non-null
112+
--> $DIR/invalid_null_ptr_usage.rs:43:35
113+
|
114+
LL | std::ptr::write_unaligned(std::ptr::null_mut(), A);
115+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
116+
117+
error: pointer must be non-null
118+
--> $DIR/invalid_null_ptr_usage.rs:45:34
119+
|
120+
LL | std::ptr::write_volatile(std::ptr::null_mut(), A);
121+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
122+
123+
error: pointer must be non-null
124+
--> $DIR/invalid_null_ptr_usage.rs:47:40
125+
|
126+
LL | std::ptr::write_bytes::<usize>(std::ptr::null_mut(), 42, 0);
127+
| ^^^^^^^^^^^^^^^^^^^^ help: change this to: `core::ptr::NonNull::dangling().as_ptr()`
128+
129+
error: aborting due to 21 previous errors
40130

0 commit comments

Comments
 (0)