Skip to content

Commit 84dacc1

Browse files
committed
Add more precondition check tests
1 parent 0c41c34 commit 84dacc1

35 files changed

+448
-34
lines changed

library/core/src/ascii/ascii_char.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ impl AsciiChar {
506506
pub const unsafe fn digit_unchecked(d: u8) -> Self {
507507
assert_unsafe_precondition!(
508508
check_language_ub,
509-
"`AsciiChar::digit_unchecked` input cannot exceed 9.",
509+
"`ascii::Char::digit_unchecked` input cannot exceed 9.",
510510
(d: u8 = d) => d < 10
511511
);
512512

library/core/src/ptr/mod.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1432,7 +1432,8 @@ pub const unsafe fn read<T>(src: *const T) -> T {
14321432
(
14331433
addr: *const () = src as *const (),
14341434
align: usize = align_of::<T>(),
1435-
) => ub_checks::is_aligned_and_not_null(addr, align)
1435+
is_zst: bool = T::IS_ZST,
1436+
) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)
14361437
);
14371438
crate::intrinsics::read_via_copy(src)
14381439
}
@@ -1637,7 +1638,8 @@ pub const unsafe fn write<T>(dst: *mut T, src: T) {
16371638
(
16381639
addr: *mut () = dst as *mut (),
16391640
align: usize = align_of::<T>(),
1640-
) => ub_checks::is_aligned_and_not_null(addr, align)
1641+
is_zst: bool = T::IS_ZST,
1642+
) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)
16411643
);
16421644
intrinsics::write_via_move(dst, src)
16431645
}
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: Alignment::new_unchecked requires
4+
5+
#![feature(ptr_alignment_type)]
6+
7+
fn main() {
8+
unsafe {
9+
std::ptr::Alignment::new_unchecked(0);
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: `ascii::Char::digit_unchecked` input cannot exceed 9
4+
5+
#![feature(ascii_char)]
6+
7+
fn main() {
8+
unsafe {
9+
std::ascii::Char::digit_unchecked(b'a');
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: hint::assert_unchecked must never be called when the condition is false
4+
5+
fn main() {
6+
unsafe {
7+
std::hint::assert_unchecked(false);
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: invalid value for `char`
4+
5+
fn main() {
6+
unsafe {
7+
char::from_u32_unchecked(0xD801);
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: ptr::copy_nonoverlapping requires
4+
//@ revisions: null_src null_dst misaligned_src misaligned_dst overlapping
5+
6+
use std::ptr;
7+
8+
fn main() {
9+
let src = [0u16; 3];
10+
let mut dst = [0u16; 3];
11+
let src = src.as_ptr();
12+
let dst = dst.as_mut_ptr();
13+
unsafe {
14+
#[cfg(null_src)]
15+
ptr::copy_nonoverlapping(ptr::null(), dst, 1);
16+
#[cfg(null_dst)]
17+
ptr::copy_nonoverlapping(src, ptr::null_mut(), 1);
18+
#[cfg(misaligned_src)]
19+
ptr::copy_nonoverlapping(src.byte_add(1), dst, 1);
20+
#[cfg(misaligned_dst)]
21+
ptr::copy_nonoverlapping(src, dst.byte_add(1), 1);
22+
#[cfg(overlapping)]
23+
ptr::copy_nonoverlapping(dst, dst.add(1), 2);
24+
}
25+
}

tests/ui/precondition-checks/copy.rs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: ptr::copy requires
4+
//@ revisions: null_src null_dst misaligned_src misaligned_dst
5+
6+
use std::ptr;
7+
8+
fn main() {
9+
let src = [0u16; 3];
10+
let mut dst = [0u16; 3];
11+
let src = src.as_ptr();
12+
let dst = dst.as_mut_ptr();
13+
unsafe {
14+
#[cfg(null_src)]
15+
ptr::copy(ptr::null(), dst, 1);
16+
#[cfg(null_dst)]
17+
ptr::copy(src, ptr::null_mut(), 1);
18+
#[cfg(misaligned_src)]
19+
ptr::copy(src.byte_add(1), dst, 1);
20+
#[cfg(misaligned_dst)]
21+
ptr::copy(src, dst.byte_add(1), 1);
22+
}
23+
}
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: Layout::from_size_align_unchecked requires
4+
//@ revisions: toolarge badalign
5+
//@[toolarge] compile-flags: --cfg toolarge
6+
//@[badalign] compile-flags: --cfg badalign
7+
8+
fn main() {
9+
unsafe {
10+
#[cfg(toolarge)]
11+
std::alloc::Layout::from_size_align_unchecked(isize::MAX as usize, 2);
12+
#[cfg(badalign)]
13+
std::alloc::Layout::from_size_align_unchecked(1, 3);
14+
}
15+
}

tests/ui/precondition-checks/misaligned-slice.rs

-10
This file was deleted.
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: NonNull::new_unchecked requires
4+
5+
fn main() {
6+
unsafe {
7+
std::ptr::NonNull::new_unchecked(std::ptr::null_mut::<u8>());
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: NonZero::from_mut_unchecked requires
4+
5+
#![feature(nonzero_from_mut)]
6+
7+
fn main() {
8+
unsafe {
9+
let mut num = 0u8;
10+
std::num::NonZeroU8::from_mut_unchecked(&mut num);
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: NonZero::new_unchecked requires
4+
5+
fn main() {
6+
unsafe {
7+
std::num::NonZeroU8::new_unchecked(0);
8+
}
9+
}

tests/ui/precondition-checks/null-slice.rs

-10
This file was deleted.

tests/ui/precondition-checks/out-of-bounds-get-unchecked.rs

-11
This file was deleted.

tests/ui/precondition-checks/read.rs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: ptr::read requires
4+
//@ revisions: null misaligned
5+
//@ ignore-test
6+
7+
use std::ptr;
8+
9+
fn main() {
10+
let src = [0u16; 2];
11+
let src = src.as_ptr();
12+
unsafe {
13+
#[cfg(null)]
14+
ptr::read(ptr::null::<u8>());
15+
#[cfg(misaligned)]
16+
ptr::read(src.byte_add(1));
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: ptr::read_volatile requires
4+
//@ revisions: null misaligned
5+
6+
use std::ptr;
7+
8+
fn main() {
9+
let src = [0u16; 2];
10+
let src = src.as_ptr();
11+
unsafe {
12+
#[cfg(null)]
13+
ptr::read_volatile(ptr::null::<u8>());
14+
#[cfg(misaligned)]
15+
ptr::read_volatile(src.byte_add(1));
16+
}
17+
}
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: ptr::replace requires
4+
//@ revisions: null misaligned
5+
6+
use std::ptr;
7+
8+
fn main() {
9+
let mut dst = [0u16; 2];
10+
let dst = dst.as_mut_ptr();
11+
unsafe {
12+
#[cfg(null)]
13+
ptr::replace(ptr::null_mut::<u8>(), 1);
14+
#[cfg(misaligned)]
15+
ptr::replace(dst.byte_add(1), 1u16);
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: slice::from_raw_parts_mut requires
4+
//@ revisions: null misaligned toolarge
5+
6+
fn main() {
7+
unsafe {
8+
#[cfg(null)]
9+
let _s: &mut [u8] = std::slice::from_raw_parts_mut(std::ptr::null_mut(), 0);
10+
#[cfg(misaligned)]
11+
let _s: &mut [u16] = std::slice::from_raw_parts_mut(1usize as *mut u16, 0);
12+
#[cfg(toolarge)]
13+
let _s: &mut [u16] =
14+
std::slice::from_raw_parts_mut(2usize as *mut u16, isize::MAX as usize);
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: slice::from_raw_parts requires
4+
//@ revisions: null misaligned toolarge
5+
6+
fn main() {
7+
unsafe {
8+
#[cfg(null)]
9+
let _s: &[u8] = std::slice::from_raw_parts(std::ptr::null(), 0);
10+
#[cfg(misaligned)]
11+
let _s: &[u16] = std::slice::from_raw_parts(1usize as *const u16, 0);
12+
#[cfg(toolarge)]
13+
let _s: &[u16] = std::slice::from_raw_parts(2usize as *const u16, isize::MAX as usize);
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: slice::get_unchecked requires
4+
//@ revisions: usize range range_to range_from backwards_range
5+
6+
fn main() {
7+
unsafe {
8+
let s = &[0];
9+
#[cfg(usize)]
10+
s.get_unchecked(1);
11+
#[cfg(range)]
12+
s.get_unchecked(1..2);
13+
#[cfg(range_to)]
14+
s.get_unchecked(..2);
15+
#[cfg(range_from)]
16+
s.get_unchecked(2..);
17+
#[cfg(backwards_range)]
18+
s.get_unchecked(1..0);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: slice::get_unchecked_mut requires
4+
//@ revisions: usize range range_to range_from backwards_range
5+
6+
fn main() {
7+
unsafe {
8+
let mut s = &mut [0];
9+
#[cfg(usize)]
10+
s.get_unchecked_mut(1);
11+
#[cfg(range)]
12+
s.get_unchecked_mut(1..2);
13+
#[cfg(range_to)]
14+
s.get_unchecked_mut(..2);
15+
#[cfg(range_from)]
16+
s.get_unchecked_mut(2..);
17+
#[cfg(backwards_range)]
18+
s.get_unchecked_mut(1..0);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: index out of bounds: the len is 2 but the index is 2
4+
//@ revisions: oob_a oob_b
5+
6+
fn main() {
7+
let mut pair = [0u8; 2];
8+
unsafe {
9+
#[cfg(oob_a)]
10+
pair.swap(0, 2);
11+
#[cfg(oob_b)]
12+
pair.swap(2, 0);
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: str::get_unchecked requires
4+
//@ revisions: range range_to range_from backwards_range
5+
6+
fn main() {
7+
unsafe {
8+
let s = "💅";
9+
#[cfg(range)]
10+
s.get_unchecked(4..5);
11+
#[cfg(range_to)]
12+
s.get_unchecked(..5);
13+
#[cfg(range_from)]
14+
s.get_unchecked(5..);
15+
#[cfg(backwards_range)]
16+
s.get_unchecked(1..0);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//@ run-fail
2+
//@ compile-flags: -Copt-level=3 -Cdebug-assertions=no -Zub-checks=yes
3+
//@ error-pattern: unsafe precondition(s) violated: str::get_unchecked_mut requires
4+
//@ revisions: range range_to range_from backwards_range
5+
6+
fn main() {
7+
unsafe {
8+
let mut s: String = "💅".chars().collect();
9+
let mut s: &mut str = &mut s;
10+
#[cfg(range)]
11+
s.get_unchecked_mut(4..5);
12+
#[cfg(range_to)]
13+
s.get_unchecked_mut(..5);
14+
#[cfg(range_from)]
15+
s.get_unchecked_mut(5..);
16+
#[cfg(backwards_range)]
17+
s.get_unchecked_mut(1..0);
18+
}
19+
}

0 commit comments

Comments
 (0)