Skip to content

Commit 34c670e

Browse files
authored
Merge pull request #6 from stogaru/verify/ptr_mut_integer_types
implemented integer type proof for contract for fn add, sub and offset
2 parents 2be7639 + 75179dc commit 34c670e

1 file changed

Lines changed: 91 additions & 0 deletions

File tree

library/core/src/ptr/mut_ptr.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,6 +2218,97 @@ impl<T: ?Sized> PartialOrd for *mut T {
22182218
#[unstable(feature = "kani", issue = "none")]
22192219
mod verify {
22202220
use crate::kani;
2221+
2222+
// fn <*mut T>::add verification begin
2223+
macro_rules! generate_add_harness {
2224+
($type:ty, $proof_name:ident) => {
2225+
#[allow(unused)]
2226+
#[kani::proof_for_contract(<*mut $type>::add)]
2227+
pub fn $proof_name() {
2228+
let mut test_val: $type = kani::any::<$type>();
2229+
let test_ptr: *mut $type = &mut test_val;
2230+
let count: usize = kani::any();
2231+
unsafe {
2232+
test_ptr.add(count);
2233+
}
2234+
}
2235+
};
2236+
}
2237+
2238+
generate_add_harness!(i8, check_mut_add_i8);
2239+
generate_add_harness!(i16, check_mut_add_i16);
2240+
generate_add_harness!(i32, check_mut_add_i32);
2241+
generate_add_harness!(i64, check_mut_add_i64);
2242+
generate_add_harness!(i128, check_mut_add_i128);
2243+
generate_add_harness!(isize, check_mut_add_isize);
2244+
generate_add_harness!(u8, check_mut_add_u8);
2245+
generate_add_harness!(u16, check_mut_add_u16);
2246+
generate_add_harness!(u32, check_mut_add_u32);
2247+
generate_add_harness!(u64, check_mut_add_u64);
2248+
generate_add_harness!(u128, check_mut_add_u128);
2249+
generate_add_harness!(usize, check_mut_add_usize);
2250+
// fn <*mut T>::add verification end
2251+
2252+
// fn <*mut T>::sub verification begin
2253+
macro_rules! generate_sub_harness {
2254+
($type:ty, $proof_name:ident) => {
2255+
#[allow(unused)]
2256+
#[kani::proof_for_contract(<*mut $type>::sub)]
2257+
pub fn $proof_name() {
2258+
let mut test_val: $type = kani::any::<$type>();
2259+
let test_ptr: *mut $type = &mut test_val;
2260+
let count: usize = kani::any();
2261+
unsafe {
2262+
test_ptr.sub(count);
2263+
}
2264+
}
2265+
};
2266+
}
2267+
2268+
generate_sub_harness!(i8, check_mut_sub_i8);
2269+
generate_sub_harness!(i16, check_mut_sub_i16);
2270+
generate_sub_harness!(i32, check_mut_sub_i32);
2271+
generate_sub_harness!(i64, check_mut_sub_i64);
2272+
generate_sub_harness!(i128, check_mut_sub_i128);
2273+
generate_sub_harness!(isize, check_mut_sub_isize);
2274+
generate_sub_harness!(u8, check_mut_sub_u8);
2275+
generate_sub_harness!(u16, check_mut_sub_u16);
2276+
generate_sub_harness!(u32, check_mut_sub_u32);
2277+
generate_sub_harness!(u64, check_mut_sub_u64);
2278+
generate_sub_harness!(u128, check_mut_sub_u128);
2279+
generate_sub_harness!(usize, check_mut_sub_usize);
2280+
// fn <*mut T>::sub verification end
2281+
2282+
// fn <*mut T>::offset verification begin
2283+
macro_rules! generate_offset_harness {
2284+
($type:ty, $proof_name:ident) => {
2285+
#[allow(unused)]
2286+
#[kani::proof_for_contract(<*mut $type>::offset)]
2287+
pub fn $proof_name() {
2288+
let mut test_val: $type = kani::any::<$type>();
2289+
let test_ptr: *mut $type = &mut test_val;
2290+
let count: isize = kani::any();
2291+
unsafe {
2292+
test_ptr.offset(count);
2293+
}
2294+
}
2295+
};
2296+
}
2297+
2298+
generate_offset_harness!(i8, check_mut_offset_i8);
2299+
generate_offset_harness!(i16, check_mut_offset_i16);
2300+
generate_offset_harness!(i32, check_mut_offset_i32);
2301+
generate_offset_harness!(i64, check_mut_offset_i64);
2302+
generate_offset_harness!(i128, check_mut_offset_i128);
2303+
generate_offset_harness!(isize, check_mut_offset_isize);
2304+
generate_offset_harness!(u8, check_mut_offset_u8);
2305+
generate_offset_harness!(u16, check_mut_offset_u16);
2306+
generate_offset_harness!(u32, check_mut_offset_u32);
2307+
generate_offset_harness!(u64, check_mut_offset_u64);
2308+
generate_offset_harness!(u128, check_mut_offset_u128);
2309+
generate_offset_harness!(usize, check_mut_offset_usize);
2310+
// fn <*mut T>::offset verification end
2311+
22212312
macro_rules! generate_unit_harness {
22222313
($fn_name:ident, $proof_name:ident) => {
22232314
#[allow(unused)]

0 commit comments

Comments
 (0)