Skip to content

Commit a6a8f6c

Browse files
committed
Auto merge of #61864 - lzutao:ptr-null, r=sfackler
Make use of `ptr::null(_mut)` instead of casting zero There are few places that I don't replace the zero casting pointer with `ptr::null` or `ptr::null_mut`: ```bash % git grep -E '[ ([{]0 as \*' src/libcore/ptr/mod.rs:216:pub const fn null<T>() -> *const T { 0 as *const T } src/libcore/ptr/mod.rs:231:pub const fn null_mut<T>() -> *mut T { 0 as *mut T } src/test/run-pass/consts/const-cast-ptr-int.rs:12:static a: TestStruct = TestStruct{x: 0 as *const u8}; src/test/ui/issues/issue-45730.rs:5: let x: *const _ = 0 as *const _; //~ ERROR cannot cast src/test/ui/issues/issue-45730.rs:8: let x = 0 as *const i32 as *const _ as *mut _; //~ ERROR cannot cast src/test/ui/issues/issue-45730.stderr:14:LL | let x: *const _ = 0 as *const _; src/test/ui/issues/issue-45730.stderr:24:LL | let x = 0 as *const i32 as *const _ as *mut _; src/test/ui/lint/lint-forbid-internal-unsafe.rs:15: println!("{}", evil!(*(0 as *const u8))); src/test/ui/order-dependent-cast-inference.rs:5: let mut y = 0 as *const _; src/test/ui/order-dependent-cast-inference.stderr:4:LL | let mut y = 0 as *const _; ``` r? @sfackler
2 parents 704ab2b + 7d69d4c commit a6a8f6c

33 files changed

+55
-52
lines changed

src/bootstrap/job.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use std::env;
3333
use std::io;
3434
use std::mem;
35+
use std::ptr;
3536
use crate::Build;
3637

3738
type HANDLE = *mut u8;
@@ -118,8 +119,8 @@ pub unsafe fn setup(build: &mut Build) {
118119
SetErrorMode(mode & !SEM_NOGPFAULTERRORBOX);
119120

120121
// Create a new job object for us to use
121-
let job = CreateJobObjectW(0 as *mut _, 0 as *const _);
122-
assert!(job != 0 as *mut _, "{}", io::Error::last_os_error());
122+
let job = CreateJobObjectW(ptr::null_mut(), ptr::null());
123+
assert!(!job.is_null(), "{}", io::Error::last_os_error());
123124

124125
// Indicate that when all handles to the job object are gone that all
125126
// process in the object should be killed. Note that this includes our
@@ -166,8 +167,8 @@ pub unsafe fn setup(build: &mut Build) {
166167
};
167168

168169
let parent = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid.parse().unwrap());
169-
assert!(parent != 0 as *mut _, "{}", io::Error::last_os_error());
170-
let mut parent_handle = 0 as *mut _;
170+
assert!(!parent.is_null(), "{}", io::Error::last_os_error());
171+
let mut parent_handle = ptr::null_mut();
171172
let r = DuplicateHandle(GetCurrentProcess(), job,
172173
parent, &mut parent_handle,
173174
0, FALSE, DUPLICATE_SAME_ACCESS);

src/bootstrap/util.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ pub fn symlink_dir(config: &Config, src: &Path, dest: &Path) -> io::Result<()> {
209209
let h = CreateFileW(path.as_ptr(),
210210
GENERIC_WRITE,
211211
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
212-
0 as *mut _,
212+
ptr::null_mut(),
213213
OPEN_EXISTING,
214214
FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
215215
ptr::null_mut());

src/libarena/lib.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ impl<T> Default for TypedArena<T> {
114114
TypedArena {
115115
// We set both `ptr` and `end` to 0 so that the first call to
116116
// alloc() will trigger a grow().
117-
ptr: Cell::new(0 as *mut T),
118-
end: Cell::new(0 as *mut T),
117+
ptr: Cell::new(ptr::null_mut()),
118+
end: Cell::new(ptr::null_mut()),
119119
chunks: RefCell::new(vec![]),
120120
_own: PhantomData,
121121
}
@@ -370,8 +370,8 @@ impl Default for DroplessArena {
370370
#[inline]
371371
fn default() -> DroplessArena {
372372
DroplessArena {
373-
ptr: Cell::new(0 as *mut u8),
374-
end: Cell::new(0 as *mut u8),
373+
ptr: Cell::new(ptr::null_mut()),
374+
end: Cell::new(ptr::null_mut()),
375375
chunks: Default::default(),
376376
}
377377
}

src/libpanic_unwind/dummy.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use core::any::Any;
77
use core::intrinsics;
88

99
pub fn payload() -> *mut u8 {
10-
0 as *mut u8
10+
core::ptr::null_mut()
1111
}
1212

1313
pub unsafe fn cleanup(_ptr: *mut u8) -> Box<dyn Any + Send> {

src/libpanic_unwind/seh.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ mod imp {
104104
pub const NAME2: [u8; 7] = [b'.', b'P', b'A', b'X', 0, 0, 0];
105105

106106
macro_rules! ptr {
107-
(0) => (0 as *mut u8);
107+
(0) => (core::ptr::null_mut());
108108
($e:expr) => ($e as *mut u8);
109109
}
110110
}
@@ -223,13 +223,13 @@ extern "C" {
223223
#[cfg_attr(not(test), lang = "msvc_try_filter")]
224224
static mut TYPE_DESCRIPTOR1: _TypeDescriptor = _TypeDescriptor {
225225
pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
226-
spare: 0 as *mut _,
226+
spare: core::ptr::null_mut(),
227227
name: imp::NAME1,
228228
};
229229

230230
static mut TYPE_DESCRIPTOR2: _TypeDescriptor = _TypeDescriptor {
231231
pVFTable: unsafe { &TYPE_INFO_VTABLE } as *const _ as *const _,
232-
spare: 0 as *mut _,
232+
spare: core::ptr::null_mut(),
233233
name: imp::NAME2,
234234
};
235235

src/librustc_errors/lock.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub fn acquire_global_lock(name: &str) -> Box<dyn Any> {
6464
//
6565
// This will silently create one if it doesn't already exist, or it'll
6666
// open up a handle to one if it already exists.
67-
let mutex = CreateMutexA(0 as *mut _, 0, cname.as_ptr() as *const u8);
67+
let mutex = CreateMutexA(std::ptr::null_mut(), 0, cname.as_ptr() as *const u8);
6868
if mutex.is_null() {
6969
panic!("failed to create global mutex named `{}`: {}",
7070
name,

src/librustc_metadata/dynamic_lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ mod dl {
115115
{
116116
use std::sync::{Mutex, Once};
117117
static INIT: Once = Once::new();
118-
static mut LOCK: *mut Mutex<()> = 0 as *mut _;
118+
static mut LOCK: *mut Mutex<()> = ptr::null_mut();
119119
unsafe {
120120
INIT.call_once(|| {
121121
LOCK = Box::into_raw(Box::new(Mutex::new(())));

src/librustc_typeck/error_codes.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3904,7 +3904,7 @@ x as Vec<u8>; // error: non-primitive cast: `u8` as `std::vec::Vec<u8>`
39043904
39053905
// Another example
39063906
3907-
let v = 0 as *const u8; // So here, `v` is a `*const u8`.
3907+
let v = core::ptr::null::<u8>(); // So here, `v` is a `*const u8`.
39083908
v as &u8; // error: non-primitive cast: `*const u8` as `&u8`
39093909
```
39103910
@@ -3914,7 +3914,7 @@ Only primitive types can be cast into each other. Examples:
39143914
let x = 0u8;
39153915
x as u32; // ok!
39163916
3917-
let v = 0 as *const u8;
3917+
let v = core::ptr::null::<u8>();
39183918
v as *const i8; // ok!
39193919
```
39203920
@@ -3954,7 +3954,7 @@ A cast between a thin and a fat pointer was attempted.
39543954
Erroneous code example:
39553955
39563956
```compile_fail,E0607
3957-
let v = 0 as *const u8;
3957+
let v = core::ptr::null::<u8>();
39583958
v as *const [u8];
39593959
```
39603960

src/libstd/sys/wasi/args.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ fn maybe_args() -> io::Result<Args> {
3232
let (mut argc, mut argv_buf_size) = (0, 0);
3333
cvt_wasi(libc::__wasi_args_sizes_get(&mut argc, &mut argv_buf_size))?;
3434

35-
let mut argc = vec![0 as *mut libc::c_char; argc];
35+
let mut argc = vec![core::ptr::null_mut::<libc::c_char>(); argc];
3636
let mut argv_buf = vec![0; argv_buf_size];
3737
cvt_wasi(libc::__wasi_args_get(argc.as_mut_ptr(), argv_buf.as_mut_ptr()))?;
3838

src/libstd/sys/wasm/thread_local_atomics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct ThreadControlBlock {
1111
impl ThreadControlBlock {
1212
fn new() -> ThreadControlBlock {
1313
ThreadControlBlock {
14-
keys: [0 as *mut u8; MAX_KEYS],
14+
keys: [core::ptr::null_mut(); MAX_KEYS],
1515
}
1616
}
1717

src/test/run-make-fulldeps/alloc-extern-crates/fakealloc.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
#![no_std]
33

44
#[inline]
5-
pub unsafe fn allocate(_size: usize, _align: usize) -> *mut u8 { 0 as *mut u8 }
5+
pub unsafe fn allocate(_size: usize, _align: usize) -> *mut u8 {
6+
core::ptr::null_mut()
7+
}
68

79
#[inline]
810
pub unsafe fn deallocate(_ptr: *mut u8, _old_size: usize, _align: usize) { }
911

1012
#[inline]
1113
pub unsafe fn reallocate(_ptr: *mut u8, _old_size: usize, _size: usize, _align: usize) -> *mut u8 {
12-
0 as *mut u8
14+
core::ptr::null_mut()
1315
}
1416

1517
#[inline]

src/test/run-pass/cast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ pub fn main() {
1515
// Test that `_` is correctly inferred.
1616
let x = &"hello";
1717
let mut y = x as *const _;
18-
y = 0 as *const _;
18+
y = core::ptr::null_mut();
1919
}

src/test/run-pass/cleanup-shortcircuit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ pub fn main() {
1616

1717
if args.len() >= 2 && args[1] == "signal" {
1818
// Raise a segfault.
19-
unsafe { *(0 as *mut isize) = 0; }
19+
unsafe { *std::ptr::null_mut::<isize>() = 0; }
2020
}
2121
}

src/test/run-pass/consts/const-block.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ static BLOCK_EXPLICIT_UNIT: () = { () };
2121
static BLOCK_IMPLICIT_UNIT: () = { };
2222
static BLOCK_FLOAT: f64 = { 1.0 };
2323
static BLOCK_ENUM: Option<usize> = { Some(100) };
24-
static BLOCK_STRUCT: Foo = { Foo { a: 12, b: 0 as *const () } };
24+
static BLOCK_STRUCT: Foo = { Foo { a: 12, b: std::ptr::null::<()>() } };
2525
static BLOCK_UNSAFE: usize = unsafe { 1000 };
2626

2727
static BLOCK_FN_INFERRED: fn(usize) -> usize = { foo };
@@ -36,7 +36,7 @@ pub fn main() {
3636
assert_eq!(BLOCK_IMPLICIT_UNIT, ());
3737
assert_eq!(BLOCK_FLOAT, 1.0_f64);
3838
assert_eq!(BLOCK_STRUCT.a, 12);
39-
assert_eq!(BLOCK_STRUCT.b, 0 as *const ());
39+
assert_eq!(BLOCK_STRUCT.b, std::ptr::null::<()>());
4040
assert_eq!(BLOCK_ENUM, Some(100));
4141
assert_eq!(BLOCK_UNSAFE, 1000);
4242
assert_eq!(BLOCK_FN_INFERRED(300), 300);

src/test/run-pass/issues/issue-13259-windows-tcb-trash.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ mod imp {
2323
pub fn test() {
2424
let mut buf: [u16; 50] = [0; 50];
2525
let ret = unsafe {
26-
FormatMessageW(0x1000, 0 as *mut _, 1, 0x400,
27-
buf.as_mut_ptr(), buf.len() as u32, 0 as *const _)
26+
FormatMessageW(0x1000, core::ptr::null_mut(), 1, 0x400,
27+
buf.as_mut_ptr(), buf.len() as u32, core::ptr::null())
2828
};
2929
// On some 32-bit Windowses (Win7-8 at least) this will panic with segmented
3030
// stacks taking control of pvArbitrary

src/test/run-pass/issues/issue-19001.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ struct Loopy {
77
}
88

99
fn main() {
10-
let _t = Loopy { ptr: 0 as *mut _ };
10+
let _t = Loopy { ptr: core::ptr::null_mut() };
1111
}

src/test/run-pass/issues/issue-39367.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn arena() -> &'static ArenaSet<Vec<u8>> {
1515
fn require_sync<T: Sync>(_: &T) { }
1616
unsafe fn __stability() -> &'static ArenaSet<Vec<u8>> {
1717
use std::mem::transmute;
18-
static mut DATA: *const ArenaSet<Vec<u8>> = 0 as *const ArenaSet<Vec<u8>>;
18+
static mut DATA: *const ArenaSet<Vec<u8>> = std::ptr::null_mut();
1919

2020
static mut ONCE: Once = Once::new();
2121
ONCE.call_once(|| {

src/test/run-pass/issues/issue-46069.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn copy_ex() {
1717
}
1818

1919
fn main() {
20-
let _f = 0 as *mut <Fuse<Cloned<Iter<u8>>> as Iterator>::Item;
20+
let _f: *mut <Fuse<Cloned<Iter<u8>>> as Iterator>::Item = std::ptr::null_mut();
2121

2222
copy_ex();
2323
}

src/test/run-pass/structs-enums/enum-null-pointer-opt.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn main() {
3838

3939
// The optimization can't apply to raw pointers or unions with a ZST field.
4040
assert!(size_of::<Option<*const isize>>() != size_of::<*const isize>());
41-
assert!(Some(0 as *const isize).is_some()); // Can't collapse None to null
41+
assert!(Some(std::ptr::null::<isize>()).is_some()); // Can't collapse None to null
4242
assert_ne!(size_of::<fn(isize)>(), size_of::<Option<MaybeUninitUnion<fn(isize)>>>());
4343
assert_ne!(size_of::<&str>(), size_of::<Option<MaybeUninitUnion<&str>>>());
4444
assert_ne!(size_of::<NonNull<isize>>(), size_of::<Option<MaybeUninitUnion<NonNull<isize>>>>());

src/test/ui/casts-issue-46365.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ struct Lorem {
33
}
44

55
fn main() {
6-
let _foo: *mut Lorem = 0 as *mut _; // no error here
6+
let _foo: *mut Lorem = core::ptr::null_mut(); // no error here
77
}

src/test/ui/consts/const-eval/ice-generic-assoc-const.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub trait Nullable {
77
}
88

99
impl<T> Nullable for *const T {
10-
const NULL: Self = 0 as *const T;
10+
const NULL: Self = core::ptr::null::<T>();
1111

1212
fn is_null(&self) -> bool {
1313
*self == Self::NULL

src/test/ui/consts/min_const_fn/min_const_fn.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ const fn i32_ops3(c: i32, d: i32) -> bool { c != d }
6969
const fn i32_ops4(c: i32, d: i32) -> i32 { c + d }
7070
const fn char_cast(u: u8) -> char { u as char }
7171
const unsafe fn ret_i32_no_unsafe() -> i32 { 42 }
72-
const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { 0 as *const T }
73-
const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { 0 as *mut T }
72+
const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { core::ptr::null() }
73+
const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { core::ptr::null_mut() }
7474

7575
// not ok
7676
const fn foo11<T: std::fmt::Display>(t: T) -> T { t }

src/test/ui/consts/min_const_fn/min_const_fn_unsafe.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
//------------------------------------------------------------------------------
44

55
const unsafe fn ret_i32_no_unsafe() -> i32 { 42 }
6-
const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { 0 as *const T }
7-
const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { 0 as *mut T }
6+
const unsafe fn ret_null_ptr_no_unsafe<T>() -> *const T { std::ptr::null() }
7+
const unsafe fn ret_null_mut_ptr_no_unsafe<T>() -> *mut T { std::ptr::null_mut() }
88
const fn no_unsafe() { unsafe {} }
99

1010
const fn call_unsafe_const_fn() -> i32 {

src/test/ui/derived-errors/issue-31997.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn closure<F, T>(x: F) -> Result<T, ()>
1010
}
1111

1212
fn foo() -> Result<(), ()> {
13-
try!(closure(|| bar(0 as *mut _))); //~ ERROR cannot find function `bar` in this scope
13+
try!(closure(|| bar(core::ptr::null_mut()))); //~ ERROR cannot find function `bar` in this scope
1414
Ok(())
1515
}
1616

src/test/ui/derived-errors/issue-31997.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
error[E0425]: cannot find function `bar` in this scope
22
--> $DIR/issue-31997.rs:13:21
33
|
4-
LL | try!(closure(|| bar(0 as *mut _)));
4+
LL | try!(closure(|| bar(core::ptr::null_mut())));
55
| ^^^ not found in this scope
66

77
error: aborting due to previous error

src/test/ui/error-codes/E0605.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ fn main() {
22
let x = 0u8;
33
x as Vec<u8>; //~ ERROR E0605
44

5-
let v = 0 as *const u8;
5+
let v = std::ptr::null::<u8>();
66
v as &u8; //~ ERROR E0605
77
}

src/test/ui/error-codes/E0607.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
fn main() {
2-
let v = 0 as *const u8;
2+
let v = core::ptr::null::<u8>();
33
v as *const [u8]; //~ ERROR E0607
44
}

src/test/ui/error-festival.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fn main() {
3737
let y: u32 = x as u32;
3838
//~^ ERROR E0606
3939

40-
let v = 0 as *const u8;
40+
let v = core::ptr::null::<u8>();
4141
v as *const [u8];
4242
//~^ ERROR E0607
4343
}

src/test/ui/issues/issue-17458.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
static X: usize = unsafe { 0 as *const usize as usize };
1+
static X: usize = unsafe { core::ptr::null::<usize>() as usize };
22
//~^ ERROR: casting pointers to integers in statics is unstable
33

44
fn main() {

src/test/ui/issues/issue-17458.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error[E0658]: casting pointers to integers in statics is unstable
22
--> $DIR/issue-17458.rs:1:28
33
|
4-
LL | static X: usize = unsafe { 0 as *const usize as usize };
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
4+
LL | static X: usize = unsafe { core::ptr::null::<usize>() as usize };
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66
|
77
= note: for more information, see https://github.com/rust-lang/rust/issues/51910
88
= help: add #![feature(const_raw_ptr_to_usize_cast)] to the crate attributes to enable

src/test/ui/issues/issue-20801.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ fn mut_ref() -> &'static mut T {
1515
}
1616

1717
fn mut_ptr() -> *mut T {
18-
unsafe { 0 as *mut T }
18+
unsafe { core::ptr::null_mut() }
1919
}
2020

2121
fn const_ptr() -> *const T {
22-
unsafe { 0 as *const T }
22+
unsafe { core::ptr::null() }
2323
}
2424

2525
pub fn main() {

src/test/ui/issues/issue-22034.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
extern crate libc;
44

55
fn main() {
6-
let ptr: *mut () = 0 as *mut _;
6+
let ptr: *mut () = core::ptr::null_mut();
77
let _: &mut dyn Fn() = unsafe {
88
&mut *(ptr as *mut dyn Fn())
99
//~^ ERROR expected a `std::ops::Fn<()>` closure, found `()`

src/test/ui/mismatched_types/cast-rfc0401.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ enum E {
2121
fn main()
2222
{
2323
let f: f32 = 1.2;
24-
let v = 0 as *const u8;
25-
let fat_v : *const [u8] = unsafe { &*(0 as *const [u8; 1])};
26-
let fat_sv : *const [i8] = unsafe { &*(0 as *const [i8; 1])};
24+
let v = core::ptr::null::<u8>();
25+
let fat_v : *const [u8] = unsafe { &*core::ptr::null::<[u8; 1]>()};
26+
let fat_sv : *const [i8] = unsafe { &*core::ptr::null::<[i8; 1]>()};
2727
let foo: &dyn Foo = &f;
2828

2929
let _ = v as &u8; //~ ERROR non-primitive cast

0 commit comments

Comments
 (0)