Allow zero-size reads/writes on null pointers · qinheping/verify-rust-std@528dda2 (original) (raw)

`@@ -448,7 +448,7 @@

`

448

448

``

449

449

`use crate::cmp::Ordering;

`

450

450

`use crate:📑:FnPtr;

`

451

``

`-

use crate::mem::{self, MaybeUninit};

`

``

451

`+

use crate::mem::{self, MaybeUninit, SizedTypeProperties};

`

452

452

`use crate::{fmt, hash, intrinsics, ub_checks};

`

453

453

``

454

454

`mod alignment;

`

`@@ -1165,10 +1165,12 @@ pub const unsafe fn swap_nonoverlapping(x: *mut T, y: *mut T, count: usize) {

`

1165

1165

` size: usize = size_of::(),

`

1166

1166

` align: usize = align_of::(),

`

1167

1167

` count: usize = count,

`

1168

``

`-

) =>

`

1169

``

`-

ub_checks::is_aligned_and_not_null(x, align)

`

1170

``

`-

&& ub_checks::is_aligned_and_not_null(y, align)

`

1171

``

`-

&& ub_checks::is_nonoverlapping(x, y, size, count)

`

``

1168

`+

) => {

`

``

1169

`+

let zero_size = size == 0 || count == 0;

`

``

1170

`+

ub_checks::is_aligned_and_not_null(x, align, zero_size)

`

``

1171

`+

&& ub_checks::is_aligned_and_not_null(y, align, zero_size)

`

``

1172

`+

&& ub_checks::is_nonoverlapping(x, y, size, count)

`

``

1173

`+

}

`

1172

1174

`);

`

1173

1175

``

1174

1176

`// Split up the slice into small power-of-two-sized chunks that LLVM is able

`

`@@ -1277,7 +1279,8 @@ pub const unsafe fn replace(dst: *mut T, src: T) -> T {

`

1277

1279

`(

`

1278

1280

` addr: *const () = dst as *const (),

`

1279

1281

` align: usize = align_of::(),

`

1280

``

`-

) => ub_checks::is_aligned_and_not_null(addr, align)

`

``

1282

`+

is_zst: bool = T::IS_ZST,

`

``

1283

`+

) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)

`

1281

1284

`);

`

1282

1285

` mem::replace(&mut *dst, src)

`

1283

1286

`}

`

`@@ -1806,7 +1809,8 @@ pub unsafe fn read_volatile(src: *const T) -> T {

`

1806

1809

`(

`

1807

1810

` addr: *const () = src as *const (),

`

1808

1811

` align: usize = align_of::(),

`

1809

``

`-

) => ub_checks::is_aligned_and_not_null(addr, align)

`

``

1812

`+

is_zst: bool = T::IS_ZST,

`

``

1813

`+

) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)

`

1810

1814

`);

`

1811

1815

` intrinsics::volatile_load(src)

`

1812

1816

`}

`

`@@ -1885,7 +1889,8 @@ pub unsafe fn write_volatile(dst: *mut T, src: T) {

`

1885

1889

`(

`

1886

1890

` addr: *mut () = dst as *mut (),

`

1887

1891

` align: usize = align_of::(),

`

1888

``

`-

) => ub_checks::is_aligned_and_not_null(addr, align)

`

``

1892

`+

is_zst: bool = T::IS_ZST,

`

``

1893

`+

) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)

`

1889

1894

`);

`

1890

1895

` intrinsics::volatile_store(dst, src);

`

1891

1896

`}

`