| // check-fail |
| // run-rustfix |
| #![allow(unnecessary_transmutes)] |
| |
| use std::{mem, ptr}; |
| |
| unsafe fn null_ptr() { |
| ptr::write( |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| ptr::null_mut() as *mut u32, |
| mem::transmute::<[u8; 4], _>([0, 0, 0, 255]), |
| ); |
| |
| let null_ptr = ptr::null_mut(); |
| ptr::write( |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| null_ptr as *mut u32, |
| mem::transmute::<[u8; 4], _>([0, 0, 0, 255]), |
| ); |
| |
| let _: &[usize] = std::slice::from_raw_parts(ptr::null(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| let _: &[usize] = std::slice::from_raw_parts(ptr::null_mut(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| let _: &[usize] = std::slice::from_raw_parts(0 as *mut _, 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| let _: &[usize] = std::slice::from_raw_parts(mem::transmute(0usize), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| let _: &[usize] = std::slice::from_raw_parts_mut(ptr::null_mut(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::copy::<usize>(ptr::null(), ptr::NonNull::dangling().as_ptr(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| ptr::copy::<usize>(ptr::NonNull::dangling().as_ptr(), ptr::null_mut(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::copy_nonoverlapping::<usize>(ptr::null(), ptr::NonNull::dangling().as_ptr(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| ptr::copy_nonoverlapping::<usize>( |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| ptr::NonNull::dangling().as_ptr(), |
| ptr::null_mut(), |
| 0, |
| ); |
| |
| #[derive(Copy, Clone)] |
| struct A(usize); |
| let mut v = A(200); |
| |
| let _a: A = ptr::read(ptr::null()); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| let _a: A = ptr::read(ptr::null_mut()); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| let _a: A = ptr::read_unaligned(ptr::null()); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| let _a: A = ptr::read_unaligned(ptr::null_mut()); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| // These two should *not* fire the lint. |
| let _a: A = ptr::read_volatile(ptr::null()); |
| let _a: A = ptr::read_volatile(ptr::null_mut()); |
| |
| let _a: A = ptr::replace(ptr::null_mut(), v); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::swap::<A>(ptr::null_mut(), &mut v); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| ptr::swap::<A>(&mut v, ptr::null_mut()); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::swap_nonoverlapping::<A>(ptr::null_mut(), &mut v, 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| ptr::swap_nonoverlapping::<A>(&mut v, ptr::null_mut(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::write(ptr::null_mut(), v); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::write_unaligned(ptr::null_mut(), v); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| // This one should *not* fire the lint. |
| ptr::write_volatile(ptr::null_mut(), v); |
| |
| ptr::write_bytes::<usize>(ptr::null_mut(), 42, 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| // with indirections |
| let const_ptr = null_ptr as *const u8; |
| let _a: u8 = ptr::read(const_ptr); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| } |
| |
| unsafe fn zst() { |
| struct Zst; // zero-sized type |
| |
| std::slice::from_raw_parts::<()>(ptr::null(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| std::slice::from_raw_parts::<Zst>(ptr::null(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| std::slice::from_raw_parts_mut::<()>(ptr::null_mut(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| std::slice::from_raw_parts_mut::<Zst>(ptr::null_mut(), 0); |
| //~^ ERROR calling this function with a null pointer is undefined behavior |
| |
| ptr::read::<()>(ptr::null()); |
| ptr::read::<Zst>(ptr::null()); |
| |
| ptr::write(ptr::null_mut(), ()); |
| ptr::write(ptr::null_mut(), Zst); |
| |
| ptr::copy(ptr::null::<()>(), ptr::null_mut::<()>(), 1); |
| ptr::copy(ptr::null::<Zst>(), ptr::null_mut::<Zst>(), 1); |
| } |
| |
| unsafe fn not_invalid() { |
| // Simplified false-positive from std quicksort implementation |
| |
| let mut a = ptr::null_mut(); |
| let mut b = (); |
| |
| loop { |
| if false { |
| break; |
| } |
| |
| a = &raw mut b; |
| } |
| |
| ptr::write(a, ()); |
| } |
| |
| fn main() {} |