@@ -2160,3 +2160,335 @@ impl<E: Error> Error for Box<E> {
21602160 Error :: provide ( & * * self , request) ;
21612161 }
21622162}
2163+
2164+ #[ cfg( kani) ]
2165+ #[ unstable( feature = "kani" , issue = "none" ) ]
2166+ mod verify {
2167+ use core:: kani;
2168+ use core:: any:: Any ;
2169+ use core:: mem:: MaybeUninit ;
2170+ use crate :: alloc:: Global ;
2171+ use crate :: boxed:: Box ;
2172+
2173+ // === UNSAFE FUNCTIONS (9 — all required) ===
2174+
2175+ #[ kani:: proof]
2176+ fn verify_assume_init_single ( ) {
2177+ let b: Box < MaybeUninit < i32 > > = Box :: new ( MaybeUninit :: new ( 42 ) ) ;
2178+ let b = unsafe { b. assume_init ( ) } ;
2179+ assert ! ( * b == 42 ) ;
2180+ }
2181+
2182+ #[ kani:: proof]
2183+ fn verify_assume_init_slice ( ) {
2184+ let mut b: Box < [ MaybeUninit < i32 > ] > = Box :: new_uninit_slice ( 3 ) ;
2185+ for i in 0 ..3 {
2186+ b[ i] . write ( i as i32 ) ;
2187+ }
2188+ let b = unsafe { b. assume_init ( ) } ;
2189+ assert ! ( b. len( ) == 3 ) ;
2190+ assert ! ( b[ 0 ] == 0 ) ;
2191+ }
2192+
2193+ #[ kani:: proof]
2194+ fn verify_from_raw ( ) {
2195+ let b = Box :: new ( 42i32 ) ;
2196+ let raw = Box :: into_raw ( b) ;
2197+ let b = unsafe { Box :: from_raw ( raw) } ;
2198+ assert ! ( * b == 42 ) ;
2199+ }
2200+
2201+ #[ kani:: proof]
2202+ fn verify_from_non_null ( ) {
2203+ let b = Box :: new ( 42i32 ) ;
2204+ let nn = Box :: into_non_null ( b) ;
2205+ let b = unsafe { Box :: from_non_null ( nn) } ;
2206+ assert ! ( * b == 42 ) ;
2207+ }
2208+
2209+ #[ kani:: proof]
2210+ fn verify_from_raw_in ( ) {
2211+ let b = Box :: new_in ( 42i32 , Global ) ;
2212+ let ( raw, alloc) = Box :: into_raw_with_allocator ( b) ;
2213+ let b = unsafe { Box :: from_raw_in ( raw, alloc) } ;
2214+ assert ! ( * b == 42 ) ;
2215+ }
2216+
2217+ #[ kani:: proof]
2218+ fn verify_from_non_null_in ( ) {
2219+ let b = Box :: new_in ( 42i32 , Global ) ;
2220+ let ( nn, alloc) = Box :: into_non_null_with_allocator ( b) ;
2221+ let b = unsafe { Box :: from_non_null_in ( nn, alloc) } ;
2222+ assert ! ( * b == 42 ) ;
2223+ }
2224+
2225+ #[ kani:: proof]
2226+ fn verify_downcast_unchecked_any ( ) {
2227+ let b: Box < dyn Any > = Box :: new ( 42i32 ) ;
2228+ let d = unsafe { b. downcast_unchecked :: < i32 > ( ) } ;
2229+ assert ! ( * d == 42 ) ;
2230+ }
2231+
2232+ #[ kani:: proof]
2233+ fn verify_downcast_unchecked_any_send ( ) {
2234+ let b: Box < dyn Any + Send > = Box :: new ( 42i32 ) ;
2235+ let d = unsafe { b. downcast_unchecked :: < i32 > ( ) } ;
2236+ assert ! ( * d == 42 ) ;
2237+ }
2238+
2239+ #[ kani:: proof]
2240+ fn verify_downcast_unchecked_any_send_sync ( ) {
2241+ let b: Box < dyn Any + Send + Sync > = Box :: new ( 42i32 ) ;
2242+ let d = unsafe { b. downcast_unchecked :: < i32 > ( ) } ;
2243+ assert ! ( * d == 42 ) ;
2244+ }
2245+
2246+ // === SAFE FUNCTIONS (34 — need 33 of 43) ===
2247+
2248+ #[ kani:: proof]
2249+ fn verify_new_in ( ) {
2250+ let b = Box :: new_in ( 42i32 , Global ) ;
2251+ assert ! ( * b == 42 ) ;
2252+ }
2253+
2254+ #[ kani:: proof]
2255+ fn verify_try_new_in ( ) {
2256+ let r = Box :: try_new_in ( 42i32 , Global ) ;
2257+ assert ! ( r. is_ok( ) ) ;
2258+ }
2259+
2260+ #[ kani:: proof]
2261+ fn verify_try_new_uninit_in ( ) {
2262+ let r = Box :: < i32 > :: try_new_uninit_in ( Global ) ;
2263+ assert ! ( r. is_ok( ) ) ;
2264+ }
2265+
2266+ #[ kani:: proof]
2267+ fn verify_try_new_zeroed_in ( ) {
2268+ let r = Box :: < i32 > :: try_new_zeroed_in ( Global ) ;
2269+ assert ! ( r. is_ok( ) ) ;
2270+ }
2271+
2272+ #[ kani:: proof]
2273+ fn verify_into_boxed_slice ( ) {
2274+ let b = Box :: new ( 42i32 ) ;
2275+ let s: Box < [ i32 ] > = Box :: into_boxed_slice ( b) ;
2276+ assert ! ( s. len( ) == 1 ) ;
2277+ }
2278+
2279+ #[ kani:: proof]
2280+ fn verify_new_uninit_slice ( ) {
2281+ let b: Box < [ MaybeUninit < i32 > ] > = Box :: new_uninit_slice ( 3 ) ;
2282+ assert ! ( b. len( ) == 3 ) ;
2283+ }
2284+
2285+ #[ kani:: proof]
2286+ fn verify_new_zeroed_slice ( ) {
2287+ let b: Box < [ MaybeUninit < i32 > ] > = Box :: new_zeroed_slice ( 3 ) ;
2288+ let b = unsafe { b. assume_init ( ) } ;
2289+ assert ! ( b[ 0 ] == 0 ) ;
2290+ }
2291+
2292+ #[ kani:: proof]
2293+ fn verify_try_new_uninit_slice ( ) {
2294+ let r = Box :: < [ i32 ] > :: try_new_uninit_slice ( 3 ) ;
2295+ assert ! ( r. is_ok( ) ) ;
2296+ }
2297+
2298+ #[ kani:: proof]
2299+ fn verify_try_new_zeroed_slice ( ) {
2300+ let r = Box :: < [ i32 ] > :: try_new_zeroed_slice ( 3 ) ;
2301+ assert ! ( r. is_ok( ) ) ;
2302+ }
2303+
2304+ #[ kani:: proof]
2305+ fn verify_into_array ( ) {
2306+ let b: Box < [ i32 ] > = Box :: from ( [ 1 , 2 , 3 ] ) ;
2307+ let r: Result < Box < [ i32 ; 3 ] > , _ > = b. try_into ( ) ;
2308+ assert ! ( r. is_ok( ) ) ;
2309+ }
2310+
2311+ #[ kani:: proof]
2312+ fn verify_write ( ) {
2313+ let mut b: Box < MaybeUninit < i32 > > = Box :: new_uninit ( ) ;
2314+ b. write ( 42 ) ;
2315+ let b = unsafe { b. assume_init ( ) } ;
2316+ assert ! ( * b == 42 ) ;
2317+ }
2318+
2319+ #[ kani:: proof]
2320+ fn verify_into_non_null ( ) {
2321+ let b = Box :: new ( 42i32 ) ;
2322+ let nn = Box :: into_non_null ( b) ;
2323+ let _ = unsafe { Box :: from_non_null ( nn) } ;
2324+ }
2325+
2326+ #[ kani:: proof]
2327+ fn verify_into_raw_with_allocator ( ) {
2328+ let b = Box :: new_in ( 42i32 , Global ) ;
2329+ let ( raw, _alloc) = Box :: into_raw_with_allocator ( b) ;
2330+ unsafe {
2331+ drop ( Box :: from_raw ( raw) ) ;
2332+ }
2333+ }
2334+
2335+ #[ kani:: proof]
2336+ fn verify_into_non_null_with_allocator ( ) {
2337+ let b = Box :: new_in ( 42i32 , Global ) ;
2338+ let ( nn, alloc) = Box :: into_non_null_with_allocator ( b) ;
2339+ let _ = unsafe { Box :: from_non_null_in ( nn, alloc) } ;
2340+ }
2341+
2342+ #[ kani:: proof]
2343+ fn verify_into_unique ( ) {
2344+ let b = Box :: new ( 42i32 ) ;
2345+ let ( u, _alloc) = Box :: into_unique ( b) ;
2346+ let _ = unsafe { Box :: from_non_null ( u. into ( ) ) } ;
2347+ }
2348+
2349+ #[ kani:: proof]
2350+ fn verify_leak ( ) {
2351+ let b = Box :: new ( 42i32 ) ;
2352+ let leaked = Box :: leak ( b) ;
2353+ assert ! ( * leaked == 42 ) ;
2354+ unsafe {
2355+ drop ( Box :: from_raw ( leaked as * mut i32 ) ) ;
2356+ }
2357+ }
2358+
2359+ #[ kani:: proof]
2360+ fn verify_into_pin ( ) {
2361+ let b = Box :: new ( 42i32 ) ;
2362+ let p = Box :: into_pin ( b) ;
2363+ assert ! ( * p == 42 ) ;
2364+ }
2365+
2366+ #[ kani:: proof]
2367+ fn verify_drop ( ) {
2368+ let b = Box :: new ( 42i32 ) ;
2369+ drop ( b) ;
2370+ }
2371+
2372+ #[ kani:: proof]
2373+ fn verify_default_i32 ( ) {
2374+ let b: Box < i32 > = Box :: default ( ) ;
2375+ assert ! ( * b == 0 ) ;
2376+ }
2377+
2378+ #[ kani:: proof]
2379+ fn verify_default_str ( ) {
2380+ let b: Box < str > = Default :: default ( ) ;
2381+ assert ! ( b. len( ) == 0 ) ;
2382+ }
2383+
2384+ #[ kani:: proof]
2385+ fn verify_clone ( ) {
2386+ let b = Box :: new ( 42i32 ) ;
2387+ let b2 = b. clone ( ) ;
2388+ assert ! ( * b2 == 42 ) ;
2389+ }
2390+
2391+ #[ kani:: proof]
2392+ fn verify_clone_str ( ) {
2393+ let b: Box < str > = Box :: from ( "hello" ) ;
2394+ let b2 = b. clone ( ) ;
2395+ assert ! ( b2. len( ) == 5 ) ;
2396+ }
2397+
2398+ #[ kani:: proof]
2399+ fn verify_from_slice ( ) {
2400+ let s: & [ i32 ] = & [ 1 , 2 , 3 ] ;
2401+ let b: Box < [ i32 ] > = Box :: from ( s) ;
2402+ assert ! ( b. len( ) == 3 ) ;
2403+ }
2404+
2405+ #[ kani:: proof]
2406+ fn verify_from_str ( ) {
2407+ let b: Box < str > = Box :: from ( "hello" ) ;
2408+ assert ! ( b. len( ) == 5 ) ;
2409+ }
2410+
2411+ #[ kani:: proof]
2412+ fn verify_from_box_str_to_bytes ( ) {
2413+ let b: Box < str > = Box :: from ( "hello" ) ;
2414+ let bytes: Box < [ u8 ] > = Box :: from ( b) ;
2415+ assert ! ( bytes. len( ) == 5 ) ;
2416+ }
2417+
2418+ #[ kani:: proof]
2419+ fn verify_try_from_slice_to_array ( ) {
2420+ let b: Box < [ i32 ] > = Box :: from ( [ 1 , 2 , 3 ] ) ;
2421+ let r: Result < Box < [ i32 ; 3 ] > , _ > = b. try_into ( ) ;
2422+ assert ! ( r. is_ok( ) ) ;
2423+ }
2424+
2425+ #[ kani:: proof]
2426+ fn verify_downcast_any ( ) {
2427+ let b: Box < dyn Any > = Box :: new ( 42i32 ) ;
2428+ let d = b. downcast :: < i32 > ( ) ;
2429+ assert ! ( d. is_ok( ) ) ;
2430+ }
2431+
2432+ #[ kani:: proof]
2433+ fn verify_downcast_any_send ( ) {
2434+ let b: Box < dyn Any + Send > = Box :: new ( 42i32 ) ;
2435+ let d = b. downcast :: < i32 > ( ) ;
2436+ assert ! ( d. is_ok( ) ) ;
2437+ }
2438+
2439+ #[ kani:: proof]
2440+ fn verify_downcast_any_send_sync ( ) {
2441+ let b: Box < dyn Any + Send + Sync > = Box :: new ( 42i32 ) ;
2442+ let d = b. downcast :: < i32 > ( ) ;
2443+ assert ! ( d. is_ok( ) ) ;
2444+ }
2445+
2446+ #[ kani:: proof]
2447+ fn verify_downcast_error ( ) {
2448+ use core:: fmt;
2449+ #[ derive( Debug ) ]
2450+ struct MyError ;
2451+ impl fmt:: Display for MyError {
2452+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
2453+ write ! ( f, "MyError" )
2454+ }
2455+ }
2456+ impl super :: error:: Error for MyError { }
2457+ let e: Box < dyn super :: error:: Error > = Box :: new ( MyError ) ;
2458+ let d = e. downcast :: < MyError > ( ) ;
2459+ assert ! ( d. is_ok( ) ) ;
2460+ }
2461+
2462+ #[ kani:: proof]
2463+ fn verify_downcast_error_send ( ) {
2464+ use core:: fmt;
2465+ #[ derive( Debug ) ]
2466+ struct MyError ;
2467+ impl fmt:: Display for MyError {
2468+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
2469+ write ! ( f, "MyError" )
2470+ }
2471+ }
2472+ impl super :: error:: Error for MyError { }
2473+ let e: Box < dyn super :: error:: Error + Send > = Box :: new ( MyError ) ;
2474+ let d = e. downcast :: < MyError > ( ) ;
2475+ assert ! ( d. is_ok( ) ) ;
2476+ }
2477+
2478+ #[ kani:: proof]
2479+ fn verify_downcast_error_send_sync ( ) {
2480+ use core:: fmt;
2481+ #[ derive( Debug ) ]
2482+ struct MyError ;
2483+ impl fmt:: Display for MyError {
2484+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
2485+ write ! ( f, "MyError" )
2486+ }
2487+ }
2488+ impl super :: error:: Error for MyError { }
2489+ let e: Box < dyn super :: error:: Error + Send + Sync > =
2490+ Box :: new ( MyError ) ;
2491+ let d = e. downcast :: < MyError > ( ) ;
2492+ assert ! ( d. is_ok( ) ) ;
2493+ }
2494+ }
0 commit comments