Skip to content

Commit a9d2ff2

Browse files
committed
Verify byte_offset_from postcondition with a harness
1 parent 30ab88d commit a9d2ff2

File tree

3 files changed

+111
-1
lines changed

3 files changed

+111
-1
lines changed

library/Cargo.lock

+88
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

library/core/src/ptr/const_ptr.rs

+11
Original file line numberDiff line numberDiff line change
@@ -1947,6 +1947,17 @@ mod verify {
19471947
// Array size bound for PointerGenerator
19481948
const ARRAY_LEN: usize = 40;
19491949

1950+
#[kani::proof]
1951+
pub fn check_const_byte_offset_from_fixed_offset() {
1952+
let arr: [u32; ARRAY_LEN] = kani::Arbitrary::any_array();
1953+
let offset: usize = kani::any_where(|&x| x <= ARRAY_LEN);
1954+
let origin_ptr: *const u32 = arr.as_ptr();
1955+
let self_ptr: *const u32 = unsafe { origin_ptr.byte_offset(offset as isize) };
1956+
let result: isize = unsafe { self_ptr.byte_offset_from(origin_ptr) };
1957+
assert_eq!(result, offset as isize);
1958+
assert_eq!(result, (self_ptr.addr() as isize - origin_ptr.addr() as isize));
1959+
}
1960+
19501961
macro_rules! generate_offset_from_harness {
19511962
($type: ty, $proof_name1: ident, $proof_name2: ident) => {
19521963
// Proof for a single element

library/core/src/ptr/mut_ptr.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -2375,9 +2375,20 @@ mod verify {
23752375
use core::mem;
23762376
use kani::PointerGenerator;
23772377

2378-
// bound space for PointerGenerator
2378+
// bound space for PointerGenerator and arrays
23792379
const ARRAY_LEN: usize = 40;
23802380

2381+
#[kani::proof]
2382+
pub fn check_mut_byte_offset_from_fixed_offset() {
2383+
let mut arr: [u32; ARRAY_LEN] = kani::Arbitrary::any_array();
2384+
let offset: usize = kani::any_where(|&x| x <= ARRAY_LEN);
2385+
let origin_ptr: *mut u32 = arr.as_mut_ptr();
2386+
let self_ptr: *mut u32 = unsafe { origin_ptr.byte_offset(offset as isize) };
2387+
let result: isize = unsafe { self_ptr.byte_offset_from(origin_ptr) };
2388+
assert_eq!(result, offset as isize);
2389+
assert_eq!(result, (self_ptr.addr() as isize - origin_ptr.addr() as isize));
2390+
}
2391+
23812392
// Proof for unit size
23822393
#[kani::proof_for_contract(<*mut ()>::byte_offset_from)]
23832394
pub fn check_mut_byte_offset_from_unit() {

0 commit comments

Comments
 (0)