@@ -416,6 +416,8 @@ use crate::marker::FnPtr;
416
416
use crate :: ub_checks;
417
417
418
418
use crate :: mem:: { self , align_of, size_of, MaybeUninit } ;
419
+ #[ cfg( kani) ]
420
+ use crate :: kani;
419
421
420
422
mod alignment;
421
423
#[ unstable( feature = "ptr_alignment_type" , issue = "102070" ) ]
@@ -1687,6 +1689,7 @@ pub const unsafe fn write_unaligned<T>(dst: *mut T, src: T) {
1687
1689
#[ stable( feature = "volatile" , since = "1.9.0" ) ]
1688
1690
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
1689
1691
#[ rustc_diagnostic_item = "ptr_read_volatile" ]
1692
+ #[ safety:: requires( ub_checks:: can_dereference( src) ) ]
1690
1693
pub unsafe fn read_volatile < T > ( src : * const T ) -> T {
1691
1694
// SAFETY: the caller must uphold the safety contract for `volatile_load`.
1692
1695
unsafe {
@@ -1766,6 +1769,7 @@ pub unsafe fn read_volatile<T>(src: *const T) -> T {
1766
1769
#[ stable( feature = "volatile" , since = "1.9.0" ) ]
1767
1770
#[ rustc_diagnostic_item = "ptr_write_volatile" ]
1768
1771
#[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
1772
+ #[ safety:: requires( ub_checks:: can_write( dst) ) ]
1769
1773
pub unsafe fn write_volatile < T > ( dst : * mut T , src : T ) {
1770
1774
// SAFETY: the caller must uphold the safety contract for `volatile_store`.
1771
1775
unsafe {
@@ -2290,3 +2294,20 @@ pub macro addr_of($place:expr) {
2290
2294
pub macro addr_of_mut ( $place: expr) {
2291
2295
& raw mut $place
2292
2296
}
2297
+
2298
+ #[ cfg( kani) ]
2299
+ #[ unstable( feature="kani" , issue="none" ) ]
2300
+ mod verify {
2301
+ use crate :: fmt:: Debug ;
2302
+ use super :: * ;
2303
+ use crate :: kani;
2304
+
2305
+ #[ kani:: proof_for_contract( read_volatile) ]
2306
+ pub fn check_read_u128 ( ) {
2307
+ let val = kani:: any :: < u16 > ( ) ;
2308
+ let ptr = & val as * const _ ;
2309
+ let copy = unsafe { read_volatile ( ptr) } ;
2310
+ assert_eq ! ( val, copy) ;
2311
+ }
2312
+ }
2313
+
0 commit comments