@@ -4528,3 +4528,364 @@ unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for UniqueArc<T, A> {
45284528 unsafe { ptr:: drop_in_place ( & mut ( * self . ptr . as_ptr ( ) ) . data ) } ;
45294529 }
45304530}
4531+
4532+ #[ cfg( kani) ]
4533+ #[ unstable( feature = "kani" , issue = "none" ) ]
4534+ mod verify {
4535+ use core:: any:: Any ;
4536+ use core:: kani;
4537+ use core:: mem:: MaybeUninit ;
4538+
4539+ use crate :: alloc:: Global ;
4540+ use crate :: sync:: { Arc , Weak } ;
4541+
4542+ // === UNSAFE (12 — all required) ===
4543+
4544+ #[ kani:: proof]
4545+ fn verify_assume_init_single ( ) {
4546+ let a: Arc < MaybeUninit < i32 > > = Arc :: new ( MaybeUninit :: new ( 42 ) ) ;
4547+ let a = unsafe { a. assume_init ( ) } ;
4548+ assert ! ( * a == 42 ) ;
4549+ }
4550+
4551+ #[ kani:: proof]
4552+ fn verify_assume_init_slice ( ) {
4553+ let mut a: Arc < [ MaybeUninit < i32 > ] > = Arc :: new_uninit_slice ( 3 ) ;
4554+ let s = Arc :: get_mut ( & mut a) . unwrap ( ) ;
4555+ s[ 0 ] . write ( 1 ) ;
4556+ s[ 1 ] . write ( 2 ) ;
4557+ s[ 2 ] . write ( 3 ) ;
4558+ let a = unsafe { a. assume_init ( ) } ;
4559+ assert ! ( a. len( ) == 3 ) ;
4560+ }
4561+
4562+ #[ kani:: proof]
4563+ fn verify_from_raw ( ) {
4564+ let a = Arc :: new ( 42i32 ) ;
4565+ let raw = Arc :: into_raw ( a) ;
4566+ let a = unsafe { Arc :: from_raw ( raw) } ;
4567+ assert ! ( * a == 42 ) ;
4568+ }
4569+
4570+ #[ kani:: proof]
4571+ fn verify_from_raw_in ( ) {
4572+ let a = Arc :: new_in ( 42i32 , Global ) ;
4573+ let ( raw, alloc) = Arc :: into_raw_with_allocator ( a) ;
4574+ let a = unsafe { Arc :: from_raw_in ( raw, alloc) } ;
4575+ assert ! ( * a == 42 ) ;
4576+ }
4577+
4578+ #[ kani:: proof]
4579+ fn verify_increment_strong_count ( ) {
4580+ let a = Arc :: new ( 42i32 ) ;
4581+ let ptr = Arc :: as_ptr ( & a) ;
4582+ unsafe {
4583+ Arc :: increment_strong_count ( ptr) ;
4584+ }
4585+ let a2 = unsafe { Arc :: from_raw ( ptr) } ;
4586+ assert ! ( * a2 == 42 ) ;
4587+ }
4588+
4589+ #[ kani:: proof]
4590+ fn verify_increment_strong_count_in ( ) {
4591+ let a = Arc :: new_in ( 42i32 , Global ) ;
4592+ let ptr = Arc :: as_ptr ( & a) ;
4593+ unsafe {
4594+ Arc :: increment_strong_count_in ( ptr, Global ) ;
4595+ }
4596+ let a2 = unsafe { Arc :: from_raw_in ( ptr, Global ) } ;
4597+ assert ! ( * a2 == 42 ) ;
4598+ }
4599+
4600+ #[ kani:: proof]
4601+ fn verify_decrement_strong_count ( ) {
4602+ let a = Arc :: new ( 42i32 ) ;
4603+ let a2 = a. clone ( ) ;
4604+ let ptr = Arc :: as_ptr ( & a2) ;
4605+ core:: mem:: forget ( a2) ;
4606+ unsafe {
4607+ Arc :: decrement_strong_count ( ptr) ;
4608+ }
4609+ }
4610+
4611+ #[ kani:: proof]
4612+ fn verify_decrement_strong_count_in ( ) {
4613+ let a = Arc :: new_in ( 42i32 , Global ) ;
4614+ let a2 = a. clone ( ) ;
4615+ let ptr = Arc :: as_ptr ( & a2) ;
4616+ core:: mem:: forget ( a2) ;
4617+ unsafe {
4618+ Arc :: decrement_strong_count_in ( ptr, Global ) ;
4619+ }
4620+ }
4621+
4622+ #[ kani:: proof]
4623+ fn verify_get_mut_unchecked ( ) {
4624+ let mut a = Arc :: new ( 42i32 ) ;
4625+ unsafe {
4626+ * Arc :: get_mut_unchecked ( & mut a) = 99 ;
4627+ }
4628+ assert ! ( * a == 99 ) ;
4629+ }
4630+
4631+ #[ kani:: proof]
4632+ fn verify_downcast_unchecked ( ) {
4633+ let a: Arc < dyn Any + Send + Sync > = Arc :: new ( 42i32 ) ;
4634+ let d = unsafe { a. downcast_unchecked :: < i32 > ( ) } ;
4635+ assert ! ( * d == 42 ) ;
4636+ }
4637+
4638+ #[ kani:: proof]
4639+ fn verify_weak_from_raw ( ) {
4640+ let a = Arc :: new ( 42i32 ) ;
4641+ let weak = Arc :: downgrade ( & a) ;
4642+ let raw = Weak :: into_raw ( weak) ;
4643+ let weak2 = unsafe { Weak :: from_raw ( raw) } ;
4644+ assert ! ( weak2. upgrade( ) . is_some( ) ) ;
4645+ }
4646+
4647+ #[ kani:: proof]
4648+ fn verify_weak_from_raw_in ( ) {
4649+ let a = Arc :: new_in ( 42i32 , Global ) ;
4650+ let weak = Arc :: downgrade ( & a) ;
4651+ let ( raw, alloc) = Weak :: into_raw_with_allocator ( weak) ;
4652+ let weak2 = unsafe { Weak :: from_raw_in ( raw, alloc) } ;
4653+ assert ! ( weak2. upgrade( ) . is_some( ) ) ;
4654+ }
4655+
4656+ // === SAFE (target 32+ of 42) ===
4657+
4658+ #[ kani:: proof]
4659+ fn verify_new ( ) {
4660+ let a = Arc :: new ( 42i32 ) ;
4661+ assert ! ( * a == 42 ) ;
4662+ }
4663+
4664+ #[ kani:: proof]
4665+ fn verify_new_uninit ( ) {
4666+ let _a: Arc < MaybeUninit < i32 > > = Arc :: new_uninit ( ) ;
4667+ }
4668+
4669+ #[ kani:: proof]
4670+ fn verify_new_zeroed ( ) {
4671+ let a: Arc < MaybeUninit < i32 > > = Arc :: new_zeroed ( ) ;
4672+ let a = unsafe { a. assume_init ( ) } ;
4673+ assert ! ( * a == 0 ) ;
4674+ }
4675+
4676+ #[ kani:: proof]
4677+ fn verify_pin ( ) {
4678+ let p = Arc :: pin ( 42i32 ) ;
4679+ assert ! ( * p == 42 ) ;
4680+ }
4681+
4682+ #[ kani:: proof]
4683+ fn verify_try_new ( ) {
4684+ let r = Arc :: try_new ( 42i32 ) ;
4685+ assert ! ( r. is_ok( ) ) ;
4686+ }
4687+
4688+ #[ kani:: proof]
4689+ fn verify_try_new_uninit ( ) {
4690+ let r = Arc :: < i32 > :: try_new_uninit ( ) ;
4691+ assert ! ( r. is_ok( ) ) ;
4692+ }
4693+
4694+ #[ kani:: proof]
4695+ fn verify_try_new_zeroed ( ) {
4696+ let r = Arc :: < i32 > :: try_new_zeroed ( ) ;
4697+ assert ! ( r. is_ok( ) ) ;
4698+ }
4699+
4700+ #[ kani:: proof]
4701+ fn verify_new_in ( ) {
4702+ let a = Arc :: new_in ( 42i32 , Global ) ;
4703+ assert ! ( * a == 42 ) ;
4704+ }
4705+
4706+ #[ kani:: proof]
4707+ fn verify_new_uninit_in ( ) {
4708+ let _a: Arc < MaybeUninit < i32 > , Global > =
4709+ Arc :: new_uninit_in ( Global ) ;
4710+ }
4711+
4712+ #[ kani:: proof]
4713+ fn verify_new_zeroed_in ( ) {
4714+ let a: Arc < MaybeUninit < i32 > , Global > =
4715+ Arc :: new_zeroed_in ( Global ) ;
4716+ let a = unsafe { a. assume_init ( ) } ;
4717+ assert ! ( * a == 0 ) ;
4718+ }
4719+
4720+ #[ kani:: proof]
4721+ fn verify_pin_in ( ) {
4722+ let p = Arc :: pin_in ( 42i32 , Global ) ;
4723+ assert ! ( * p == 42 ) ;
4724+ }
4725+
4726+ #[ kani:: proof]
4727+ fn verify_try_new_in ( ) {
4728+ let r = Arc :: try_new_in ( 42i32 , Global ) ;
4729+ assert ! ( r. is_ok( ) ) ;
4730+ }
4731+
4732+ #[ kani:: proof]
4733+ fn verify_try_new_uninit_in ( ) {
4734+ let r = Arc :: < i32 , Global > :: try_new_uninit_in ( Global ) ;
4735+ assert ! ( r. is_ok( ) ) ;
4736+ }
4737+
4738+ #[ kani:: proof]
4739+ fn verify_try_new_zeroed_in ( ) {
4740+ let r = Arc :: < i32 , Global > :: try_new_zeroed_in ( Global ) ;
4741+ assert ! ( r. is_ok( ) ) ;
4742+ }
4743+
4744+ #[ kani:: proof]
4745+ fn verify_try_unwrap ( ) {
4746+ let a = Arc :: new ( 42i32 ) ;
4747+ let val = Arc :: try_unwrap ( a) ;
4748+ assert ! ( val == Ok ( 42 ) ) ;
4749+ }
4750+
4751+ #[ kani:: proof]
4752+ fn verify_into_inner ( ) {
4753+ let a = Arc :: new ( 42i32 ) ;
4754+ let val = Arc :: into_inner ( a) ;
4755+ assert ! ( val == Some ( 42 ) ) ;
4756+ }
4757+
4758+ #[ kani:: proof]
4759+ fn verify_new_uninit_slice ( ) {
4760+ let a: Arc < [ MaybeUninit < i32 > ] > = Arc :: new_uninit_slice ( 3 ) ;
4761+ assert ! ( a. len( ) == 3 ) ;
4762+ }
4763+
4764+ #[ kani:: proof]
4765+ fn verify_new_zeroed_slice ( ) {
4766+ let a: Arc < [ MaybeUninit < i32 > ] > = Arc :: new_zeroed_slice ( 3 ) ;
4767+ let a = unsafe { a. assume_init ( ) } ;
4768+ assert ! ( a[ 0 ] == 0 ) ;
4769+ }
4770+
4771+ #[ kani:: proof]
4772+ fn verify_into_array ( ) {
4773+ let a: Arc < [ i32 ] > = Arc :: from ( [ 1 , 2 , 3 ] ) ;
4774+ let r: Result < Arc < [ i32 ; 3 ] > , _ > = a. try_into ( ) ;
4775+ assert ! ( r. is_ok( ) ) ;
4776+ }
4777+
4778+ #[ kani:: proof]
4779+ fn verify_into_raw_with_allocator ( ) {
4780+ let a = Arc :: new_in ( 42i32 , Global ) ;
4781+ let ( raw, alloc) = Arc :: into_raw_with_allocator ( a) ;
4782+ let _ = unsafe { Arc :: from_raw_in ( raw, alloc) } ;
4783+ }
4784+
4785+ #[ kani:: proof]
4786+ fn verify_as_ptr ( ) {
4787+ let a = Arc :: new ( 42i32 ) ;
4788+ let ptr = Arc :: as_ptr ( & a) ;
4789+ assert ! ( unsafe { * ptr } == 42 ) ;
4790+ }
4791+
4792+ #[ kani:: proof]
4793+ fn verify_clone ( ) {
4794+ let a = Arc :: new ( 42i32 ) ;
4795+ let a2 = a. clone ( ) ;
4796+ assert ! ( * a2 == 42 ) ;
4797+ }
4798+
4799+ #[ kani:: proof]
4800+ fn verify_get_mut ( ) {
4801+ let mut a = Arc :: new ( 42i32 ) ;
4802+ * Arc :: get_mut ( & mut a) . unwrap ( ) = 99 ;
4803+ assert ! ( * a == 99 ) ;
4804+ }
4805+
4806+ #[ kani:: proof]
4807+ fn verify_drop ( ) {
4808+ let a = Arc :: new ( 42i32 ) ;
4809+ drop ( a) ;
4810+ }
4811+
4812+ #[ kani:: proof]
4813+ fn verify_downcast ( ) {
4814+ let a: Arc < dyn Any + Send + Sync > = Arc :: new ( 42i32 ) ;
4815+ let d = a. downcast :: < i32 > ( ) ;
4816+ assert ! ( d. is_ok( ) ) ;
4817+ }
4818+
4819+ #[ kani:: proof]
4820+ fn verify_weak_as_ptr ( ) {
4821+ let a = Arc :: new ( 42i32 ) ;
4822+ let weak = Arc :: downgrade ( & a) ;
4823+ let ptr = Weak :: as_ptr ( & weak) ;
4824+ assert ! ( unsafe { * ptr } == 42 ) ;
4825+ }
4826+
4827+ #[ kani:: proof]
4828+ fn verify_weak_into_raw_with_allocator ( ) {
4829+ let a = Arc :: new_in ( 42i32 , Global ) ;
4830+ let weak = Arc :: downgrade ( & a) ;
4831+ let ( raw, alloc) = Weak :: into_raw_with_allocator ( weak) ;
4832+ let _ = unsafe { Weak :: from_raw_in ( raw, alloc) } ;
4833+ }
4834+
4835+ #[ kani:: proof]
4836+ fn verify_weak_upgrade ( ) {
4837+ let a = Arc :: new ( 42i32 ) ;
4838+ let weak = Arc :: downgrade ( & a) ;
4839+ let upgraded = weak. upgrade ( ) ;
4840+ assert ! ( upgraded. is_some( ) ) ;
4841+ }
4842+
4843+ #[ kani:: proof]
4844+ fn verify_weak_inner ( ) {
4845+ let a = Arc :: new ( 42i32 ) ;
4846+ let weak = Arc :: downgrade ( & a) ;
4847+ assert ! ( weak. upgrade( ) . is_some( ) ) ;
4848+ }
4849+
4850+ #[ kani:: proof]
4851+ fn verify_weak_drop ( ) {
4852+ let a = Arc :: new ( 42i32 ) ;
4853+ let weak = Arc :: downgrade ( & a) ;
4854+ drop ( weak) ;
4855+ assert ! ( * a == 42 ) ;
4856+ }
4857+
4858+ #[ kani:: proof]
4859+ fn verify_default_i32 ( ) {
4860+ let a: Arc < i32 > = Arc :: default ( ) ;
4861+ assert ! ( * a == 0 ) ;
4862+ }
4863+
4864+
4865+ #[ kani:: proof]
4866+ fn verify_from_str ( ) {
4867+ let a: Arc < str > = Arc :: from ( "hello" ) ;
4868+ assert ! ( a. len( ) == 5 ) ;
4869+ }
4870+
4871+ #[ kani:: proof]
4872+ fn verify_from_vec ( ) {
4873+ let v = crate :: vec![ 1i32 , 2 , 3 ] ;
4874+ let a: Arc < [ i32 ] > = Arc :: from ( v) ;
4875+ assert ! ( a. len( ) == 3 ) ;
4876+ }
4877+
4878+ #[ kani:: proof]
4879+ fn verify_from_arc_str ( ) {
4880+ let a: Arc < str > = Arc :: from ( "hello" ) ;
4881+ let bytes: Arc < [ u8 ] > = Arc :: from ( a) ;
4882+ assert ! ( bytes. len( ) == 5 ) ;
4883+ }
4884+
4885+ #[ kani:: proof]
4886+ fn verify_try_from ( ) {
4887+ let a: Arc < [ i32 ] > = Arc :: from ( [ 1 , 2 , 3 ] ) ;
4888+ let r: Result < Arc < [ i32 ; 3 ] > , _ > = a. try_into ( ) ;
4889+ assert ! ( r. is_ok( ) ) ;
4890+ }
4891+ }
0 commit comments