33// SPDX-License-Identifier: Apache-2.0
44#![ no_std]
55#![ no_main]
6- #![ feature( pointer_byte_offsets) ]
76
87// used for RefinedRust annotations
98#![ feature( register_tool) ]
109#![ register_tool( rr) ]
1110#![ feature( custom_inner_attributes) ]
1211#![ rr:: coq_prefix( "ace_ptr" ) ]
12+ #![ rr:: include( "stdlib" ) ]
1313
1414
1515mod error;
1616use core:: mem:: size_of;
1717pub use crate :: error:: PointerError ;
1818
1919/// Calculates the offset in bytes between two pointers.
20+ #[ rr:: only_spec]
21+ #[ rr:: returns( "wrap_to_it (pointer1.2 - pointer2.2) isize" ) ]
2022pub fn ptr_byte_offset ( pointer1 : * const usize , pointer2 : * const usize ) -> isize {
21- ( pointer1 as isize ) - ( pointer2 as isize )
23+ // TODO: we should use wrapping arithmetic here, as it might overflow
24+ ( pointer1. addr ( ) as isize ) - ( pointer2. addr ( ) as isize )
2225}
2326
2427/// Aligns the pointer to specific size while making sure that the aligned pointer
@@ -34,11 +37,9 @@ pub fn ptr_align(pointer: *mut usize, align_in_bytes: usize, owned_region_end: *
3437/// the one-past-the-end address. The returned pointer is guaranteed to be valid for accesses
3538/// of size one, if the original pointer is valid. Additional checks are required for making
3639/// larger memory accesses.
37- #[ rr:: skip]
38- #[ rr:: params( "l" , "off" , "lmax" ) ]
39- #[ rr:: args( "l" , "off" , "lmax" ) ]
40- #[ rr:: requires( "⌜l.2 + off < lmax.2⌝" ) ]
41- #[ rr:: returns( "Ok(l +ₗ off)" ) ]
40+ #[ rr:: ok]
41+ #[ rr:: requires( "pointer.2 + offset_in_bytes < owned_region_end.2" ) ]
42+ #[ rr:: ensures( "ret = (pointer +ₗ offset_in_bytes)" ) ]
4243pub fn ptr_byte_add_mut (
4344 pointer : * mut usize , offset_in_bytes : usize , owned_region_end : * const usize ,
4445) -> Result < * mut usize , PointerError > {
@@ -59,6 +60,9 @@ pub fn ptr_byte_add_mut(
5960/// the one-past-the-end address. The returned pointer is guaranteed to be valid for accesses
6061/// of size one, if the original pointer is valid. Additional checks are required for making
6162/// larger memory accesses.
63+ #[ rr:: ok]
64+ #[ rr:: requires( "pointer.2 + offset_in_bytes < owned_region_end.2" ) ]
65+ #[ rr:: ensures( "ret = (pointer +ₗ offset_in_bytes)" ) ]
6266pub fn ptr_byte_add (
6367 pointer : * const usize , offset_in_bytes : usize , owned_region_end : * const usize ,
6468) -> Result < * const usize , PointerError > {
0 commit comments