ăăăŻăRFCăć°ăăMaybeUninit
ăżă¤ăăĺŞĺ
ăăŚuninitialized
ăéć¨ĺĽ¨ăŤăăăďźrust-lang / rfcsďź1892ďźăŽčż˝čˇĄăŽĺéĄă§ăă
ćé ďź
ćŞč§ŁćąşăŽčłŞĺďź
&mut T
ăčżăĺŽĺ
¨ăŞăťăăżăźăĺż
čŚă§ăăďźMaybeUninit
ĺĺăĺ¤ć´ăăĺż
čŚăăăăžăăďźinto_inner
ĺĺăĺ¤ć´ăăĺż
čŚăăăăžăăďźMaybeUninit<T>
ăŻCopy
ăŤĺŻžăăŚT: Copy
ăžăăďźget_ref
ă¨get_mut
ĺźăłĺşăă訹ĺŻăăĺż
čŚăăăăžăăďźăă ăăčżăăăĺç
§ăăăŽčŞăżĺăăŻč¨ąĺŻăăžăăďźďź ďźĺĽĺďźăĺćĺăăăŚăăŞăăăźăżă¸ăŽĺç
§ăŻinsta-UBă§ăăăăăă¨ăčŞăżĺăćăŤUBăŽăżă§ăăďźăďź into_inner
ăăăŤĺĺăĺ¤ć´ăăĺż
čŚăăăăžăăďźmem::uninitialized
ăçžĺ¨čĄăŁăŚăăăăăŤă T
ăçĄäşşăŽĺ ´ĺă into_inner
ďźăžăăŻăăăĺźăłĺşăăăăă¨ăŤăŞăŁăăăŽďźăăăăăŻăŤăăăă¨ăŻă§ăăžăăďźmem::zeroed
éć¨ĺĽ¨ăŤăăăcc @RalfJung
[] RFCăĺŽčŁ ăă
RFCăŽĺŽčŁ ăćäźăăă¨ăă§ăăžăă
ç´ ć´ăăăăç§ăŻăŹăăĽăźăćäźăăă¨ăă§ăăžă:)
RFCăŽăăŽé¨ĺăŤă¤ăăŚčŞŹćăăéĄăăăžăă
犺ăŽĺă§ĺćĺăăăŚăăŞăĺźăłĺşăăĺŽčĄăăă¨ăăŠăłăżă¤ă ăăăăŻăçşçăăéć¨ĺĽ¨ăĄăăťăźă¸ăĺşĺăăăžăă
ĺŻä¸ĺż
čŚăăăăžămem::uninitialized::<!>()
ăăăăŻďź ăžăăŻăăăăŻçŠşăŽĺďź (!, u8)
ďźăĺŤăć§é ä˝ďźăăăłăăăăĺćĺďźăăŤăăźăăĺż
čŚăăăăžăăďź
AFAIKăŻă !
ăŤĺŻžăăŚăŽăżćŹĺ˝ăŤć厳ăŞăłăźăçćăčĄăăžăă mem::uninitialized
äťăŽăťă¨ăăŠăŽä˝żç¨ćłăĺć§ăŤćŁăăăăăžăăăăăłăłăă¤ăŠăźăăăăăćŞç¨ăăăă¨ăŻăăăžăăă
ă ăăç§ăŻ!
ă ăă§ăŞăă mem::zeroed
ă§ăăăăžăă ďźRFCăŤzeroed
ăčż˝ĺ ăăă¨ăăŤăăăŽé¨ĺă俎ćŁăăăŽăĺżăăăăă§ăăďź
ăăăä˝ćăăăă¨ăăĺ§ăăăă¨ăă§ăăžăďź
https://github.com/rust-lang/rust/blob/8928de74394f320d1109da6731b12638a2167945/src/librustc_codegen_llvm/intrinsic.rs#L184 -L198
fn_ty.ret.layout.abi
ăAbi::Uninhabited
ă§ăăăăŠăăă確čŞçşčĄăăžăăäžďź //github.com/rust-lang/rust/blob/8928de74394f320d1109da6731b12638a2167945/src/librustc_codegen_llvm/mir/ăŞăăŠăłă.rsďźL400 -L403
ăăŠăăďźă¤ăžăintrinsics::abort
ďźăŽĺä˝ă確čŞăăăăăăăăŻăĺźă辡ăăčŻăćšćłăăăăăŠăăă確čŞă§ăăžăă 塝ăćťăăŽăăăŤćł¨ćăĺż
čŚă§ăăăăă§çšćŽăŞăąăźăšăŤăăĺż
čŚăăăăžăďź https ďź
ĺŽéăŤăăăăŻăŤăăăŤăŻă揥ăŽăăăŞăăŽăĺż
čŚă§ăďź https ďź
ďź EvalErrorKind::BoundsCheck
ă˘ăźă ăŻçĄčŚă§ăăžăďź
@eddybăă¤ăłăżăăăăă¨ăă
ç§ăŻçžĺ¨ăďźăăă¤ăăŽďźéć¨ĺĽ¨ăŽčŚĺă俎ćŁăăŚăăŚăďźé常ăŤďź sed -i s/mem::uninitialized()/mem::MaybeUninit::uninitialized().into_inner()/g
ĺŽčĄăăăă¨ćăŁăŚăăžăăăăăăŻčŚçšăčŚéăăŚăăă¨ćăăžă...ăžăăŻăĺ¤ăĺ
ˇä˝çă§ăăăă¨ăăăăŁăŚăăĺ ´ĺăŻĺéĄăăăžăăďźăłăăźďźăżă¤ăďź äžďź let x: [u8; 1024] = mem::uninitialized();
ă
ăăăăăăŻćŁç˘şăŤčŚçšăčŚéăăžăă^^
ĺ°ăŞăă¨ăäťăŽă¨ăăăăăšăŚăŽéăŚăăŞăłăżă¤ăăŤĺŻžăăŚmem::MaybeUninit::uninitialized().into_inner()
UBăć¤č¨ăăăă¨ćăăžăă Copy
ăŻç˘şăăŤĺĺă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăă bool
ă¨&'static i32
ăŻăŠăĄăăCopy
ăăăăšăăăăăŻăăăăŽinsta-UBă§ăăăă¨ăćĺłăăăŚăăžăă ăăăšăŚăŽăăăăăżăźăłăĺéĄăŞăăżă¤ăăďźĺşćŹçăŤć´ć°ăżă¤ăďźăŽäžĺ¤ăĺż
čŚăŞĺ ´ĺăăăăžăăă undef
ăŻé常ăŽăăăăăżăźăłă§ăŻăŞăăăăăăŽăăăŞäžĺ¤ăä˝ćăăăă¨ăŤăŻĺ寞ă§ăă ăăăăRFCăinto_inner
ĺźăłĺşăĺăŤĺŽĺ
¨ăŤĺćĺăăĺż
čŚăăăă¨č¨ăŁăŚăăççąă§ăă
ăžăă get_mut
ăŤă¤ăăŚăčż°ăšăŚăăžăăăRFCăŽč°čŤăŻăăăă§ăŽĺśéă硊ĺăăăă¨ăćăäşşă
ăŤăăŁăŚć辡ăăăžăăă ăăăŻç§ăä¸çˇăŤćŽăăăă¨ăă§ăăăŞăăˇă§ăłă§ăă ăă ăă into_inner
ăŻăăăžăăă
uninitialized
ăăăăăšăŚăŽä˝żç¨ćłăăă注ć桹ăć¤č¨ăăĺż
čŚăăăăŽă§ăŻăŞăăă¨ćăăžăăĺŽéăăăăŻRFCăŽćĺłăŽ1ă¤ă§ăăă ăăă§ăŻăăăĺşăă¨ăłăˇăšăă ăŤăăŁă¨ćł¨ćăćăŁăŚăăăăăă¨ćăăžăă誰ăăăăăŤinto_inner
使ç¨ăăă ăăŞăăRFCăŻçĄäžĄĺ¤ă§ăăă
ăăă§ăŻăăăĺşăă¨ăłăˇăšăă ăŤăăŁă¨ćł¨ćăćăŁăŚăăăăăă¨ćăăžăă誰ăăăăăŤ
into_inner
使ç¨ăăă ăăŞăăRFCăŻçĄäžĄĺ¤ă§ăăă
ăăăŻç§ăŤčăăä¸ăăžă...ĺ¤ĺç§éăŻăăŽç¨ŽăŽăłăźăăŽăăăŤlintďźă°ăŤăźăďź "ćŁăă"ďźăăăšăă§ăăăăďź cc @ oli-obk
çžĺ¨ăďźăăă¤ăăŽďźéć¨ĺĽ¨ăŽčŚĺă俎ćŁăăŚăăžă
ć¨ĺĽ¨ăăă交ćĺăĺ°ăŞăă¨ăStableă§ĺŠç¨ĺŻč˝ăŤăŞăŁăĺ ´ĺăŤăŽăżăăăăăŽčŚĺă¨ă¨ăăŤNightlyăĺşčˇăăĺż čŚăăăăžăă https://github.com/rust-lang/rust/pull/52994#issuecomment-411413493ă§ĺć§ăŽč°čŤăĺç §ăăŚ
@RalfJung
ăăăšăŚăŽăăăăăżăźăłăŤĺéĄăăŞăăżă¤ăăďźĺşćŹçăŤć´ć°ăżă¤ăďźăŽäžĺ¤ăĺż čŚăŤăŞăĺ ´ĺăăăăžăă
ăăŞăăŻäťĽĺăŤăăăŤă¤ăăŚăŽč°čŤăŤĺĺ ăăžăăăăăăŁă¨ĺşăĺ茧ăăăăăŤăăăŤć稿ăăžăďźăăăŻăă§ăŤăăŻăˇă˘ă§ĺ¤ăăŽć˘ĺăŽăŚăźăšăąăźăšăćăŁăŚăăăăŽă§ăăăăăăŤăŻçšĺž´ăăăăžăďź FromBytes
ďźăăăłăăăăŽăżă¤ăăŽć´žçăăŻăă ăăăăć¨ćşăŠă¤ăăŠăŞďźcc @gnzlbg @joshlfďźăŤčż˝ĺ ăăăăăŽĺ
é¨Pre-RFCăăăăžăăă
undefăŻé常ăŽăăăăăżăźăłă§ăŻăŞăăăăăăŽăăăŞäžĺ¤ăä˝ćăăăă¨ăŤăŻĺ寞ă§ăă
ăăăăăăŻmem::zeroed()
ămem::uninitialized()
ă¨ĺ¤§ĺš
ăŤç°ăŞăĺ´é˘ă§ăă
@cramertj
ăăŞăăŻäťĽĺăŤăăăŤă¤ăăŚăŽč°čŤăŤĺĺ ăăžăăăăăăŁă¨ĺşăĺ茧ăăăăăŤăăăŤć稿ăăžăďźăăăŻăă§ăŤăăŻăˇă˘ă§ĺ¤ăăŽć˘ĺăŽăŚăźăšăąăźăšăćăŁăŚăăăăŽă§ăăăăăăŽçšĺž´ďźFromBytesďźă¨ć´žçăăŻăăăăăžăăăăăŽăżă¤ăăŽĺ ´ĺă ăăăăć¨ćşăŠă¤ăăŠăŞăŤčż˝ĺ ăăăăăŽĺ é¨Pre-RFCăăăăžăăďźcc @gnzlbg @joshlfďźă
ăăăăŽč°čŤăŻăăżă¤ăéă§ĺŽĺ
¨ăŞmemcpy
ă訹ĺŻăăćšćłăŤé˘ăăăăŽă§ăăăăăłăăźăăăăĄă˘ăŞăĺćĺăăăăăŠăăă¨ăťăźç´äş¤ăăŚăăă¨ćăăžăăĺćĺăăăŚăăŞăăĄă˘ăŞăćżĺ
Ľăăă¨ăĺćĺăăăŚăăŞăăĄă˘ăŞăĺşĺăăăžăă
ăžăăĺŽĺ ¨ăŞRustă§ăĺćĺăăăŚăăŞăăĄă˘ăŞăŽĺ˝˘ĺźă§ăăăăăŁăłă°ăă¤ăăŽčŞăżĺăă訹ĺŻăăăă¨ăŻăč°čŤăăăăŠăŽă˘ăăăźăăŤă¨ăŁăŚăä¸ĺĽĺ ¨ă§ăăă¨ăăăłăłăťăłăľăšăăăăžăăă ă¤ăžăăĺćĺăăăăĄă˘ăŞăćżĺ Ľăăĺ ´ĺăĺćĺăăăŚăăŞăăĄă˘ăŞăĺăĺşăăă¨ăŻă§ăăžăăă
IIRCăĺćĺăăăŚăăŞăăĄă˘ăŞăĺ ĽăăăăĺćĺăăăăĄă˘ăŞăĺăĺşăăăăăă˘ăăăźăăććĄăăăč°čŤăăăăăäşşăŻčŞ°ăăăŞăăŁăăŽă§ăăăăăŽč°čŤăăăă¨ăŠăé˘äżăăŚăăăŽăăŤă¤ăăŚăŻčŞŹćăăžăăă ç§ăŤă¨ăŁăŚăăăăăŻĺŽĺ ¨ăŤç´äş¤ăăŚăăžăă
ăă¤ăłăăăăĺ°ă厜ăŤĺ¸°ăăăăŤăLLVMăŻĺćĺăăăŚăăŞăăăźăżăPoisonă¨ăăŚĺŽçžŠăăžăăăăăŻăăäťťćă§ăăćĺšăŞăăăăăżăźăłăă¨ăŻç°ăŞăăžăă Poisonĺ¤ăŤĺşăĽăăŚĺĺ˛ăăăăăăă使ç¨ăăŚă˘ăăŹăšăč¨çŽăăăăăéĺç §ăăăŽăŻUBă§ăă ăăŽăăăćŽĺżľăŞăăăăăăšăŚăŽăăăăăżăźăłăŤĺéĄăăŞăăżă¤ăăăŻăĺĺĽăŤĺćĺăăăŤä˝żç¨ăăă¨UBăŤăŞăăăăăžă ĺŽĺ ¨ăŤć§çŻă§ăăžăăă
ăăă§ăăăăżăžăăăç§ăä˝ăćĺłăăăŽăăć確ăŤăăšăă§ăăă ăăăšăŚăŽăăăăăżăźăłăĺéĄăŞăăżă¤ăăăŻăäťăŽççąă§ăă§ăŤĺŽçžŠăăăăăŽă ă¨č¨ăăăăŁăăŽă§ăă @RalfJungăä¸ă§č¨ăŁăăăăŤă
undefăŻé常ăŽăăăăăżăźăłă§ăŻăŞăăăăăăŽăăăŞäžĺ¤ăä˝ćăăăă¨ăŤăŻĺ寞ă§ăă
ăŠăăăç§ăŤăŻčŞăăŞăăŽă§ăčŞăăäşşăăăăă¨ăçĽăŤćčŹăăžă...
ăăă§ăăç§ăč¨ăăăăŁăăŽăŻăĺćĺăăăăăšăŚăŽăăăăăżăźăłăĺéĄăŞăăżă¤ăăăăăă¨ă§ăăăăšăŚăŽi*
u*
ăżă¤ăă¨f*
ă ă¨ćăăžăă
ćŞč§ŁćąşăŽčłŞĺă¨ăŻăăăăăŽăżă¤ăăŽăŠăăĺćĺăăăŞăăă¨ă訹ĺŻăăăŚăăăăă¤ăžăćŻă§ăă ç§čŞčşŤăŽĺĽ˝ăżăŽçăăŻăćąşăăŚăă§ăŻăăăžăăă
ăžăăĺŽĺ ¨ăŞRustă§ăĺćĺăăăŚăăŞăăĄă˘ăŞăŽĺ˝˘ĺźă§ăăăăăŁăłă°ăă¤ăăŽčŞăżĺăă訹ĺŻăăăă¨ăŻăč°čŤăăăăŠăŽă˘ăăăźăăŤă¨ăŁăŚăä¸ĺĽĺ ¨ă§ăăă¨ăăăłăłăťăłăľăšăăăăžăăă ă¤ăžăăĺćĺăăăăĄă˘ăŞăćżĺ Ľăăĺ ´ĺăĺćĺăăăŚăăŞăăĄă˘ăŞăĺăĺşăăă¨ăŻă§ăăžăăă
ăăăŁăłă°ăă¤ăăMaybeUninit<u8>
ă¨ăăŚčŞăżĺăăă¨ăŻĺéĄăăăžăăă
ăžăăĺŽĺ ¨ăŞRustă§ăĺćĺăăăŚăăŞăăĄă˘ăŞăŽĺ˝˘ĺźă§ăăăăăŁăłă°ăă¤ăăŽčŞăżĺăă訹ĺŻăăăă¨ăŻăč°čŤăăăăŠăŽă˘ăăăźăăŤă¨ăŁăŚăä¸ĺĽĺ ¨ă§ăăă¨ăăăłăłăťăłăľăšăăăăžăăă ă¤ăžăăĺćĺăăăăĄă˘ăŞăćżĺ Ľăăĺ ´ĺăĺćĺăăăŚăăŞăăĄă˘ăŞăĺăĺşăăă¨ăŻă§ăăžăăă
ăăăŁăłă°ăă¤ăăMaybeUninită¨ăăŚčŞăżĺă
大ä¸ĺ¤ŤăŞăŻăă§ăă
ä¸č¨ă§č¨ăă°č°čŤăŻă形質ăä¸ăăç¨ĺşŚă§ăăŁăCompatible<T>
ĺŽĺ
¨ăŞćšćłă§ă fn safe_transmute(self) -> T
ăăŽ"ĺ解é" / "memcpys"ăŽăăăself
ăŤT
ă ăăŽăĄă˝ăăăŽäżč¨źăŻă self
ăéŠĺăŤĺćĺăăăŚăăĺ ´ĺăçľćăŽT
ăéŠĺăŤĺćĺăăăăă¨ă§ăă ăłăłăă¤ăŠăć¨ç§ťçăŞĺŽčŁ
ăčŞĺçăŤĺ
Ľĺăăăă¨ăććĄăăăžăăăăă¨ăă°ă impl Compatible<V> for U
ă¨impl Compatible<W> for V
ăăăĺ ´ĺăŻă impl Compatible<W> for U
ďźćäžăăăăăďźăćĺă§ăăžăăŻăłăłăă¤ăŠăčŞĺçćăăžă-ăăăĺŽčŁ
ăăćšćłăŻĺŽĺ
¨ăŤćä˝ćĽă§čĄăăăžăăďźă
ăăŹă¤ăăĺŽčŁ
ăăăŤăŻunsafe
ă§ăăĺż
čŚăăăăă¨ăććĄăăăžăăă Self
ăŤăăŁăźăŤăăăăăăăŁăłă°ăă¤ăăćă¤T
ĺŽčŁ
ăăĺ ´ĺăĺ°ăŞăă¨ăăăšăŚăćŁĺ¸¸ă§ăă T
ă使ăăă¨ăăă¨ăĺćĺăăăŚăăŞăăĄă˘ăŞăŽĺ
厚ăŤĺżăăŚăăă°ăŠă ăŽĺä˝ăçľäşăăăžă§ă
ăăăMaybeUninit<u8>
ă¨ä˝ăŽé˘äżăăăăŽăââăăăăžăăăă芳ăă誏ćăăŚăăă ăăžăăďź
ç§ăćłĺă§ăăĺŻä¸ăŽăă¨ăŻăăăŠăłăąăăimplăčż˝ĺ ă§ăăăă¨ă§ăďź unsafe impl<T> Compatible<[MaybeUninit<u8>; size_of::<T>()]> for T { ... }
äťťćăŽăżă¤ăăăăŽăľă¤ăşăŽ[MaybeUninit<u8>; N]
ăŤĺ¤ćăăăă¨ăŻăăăšăŚăŽăżă¤ăăŤĺŻžăăŚĺŽĺ
¨ă§ăăăăă§ăă MaybeUninit
ăĺéĺă§ăăă [MaybeUninit<u8>; N]
ă使ç¨ăăäşşăŻčŞ°ă§ăăé
ĺăŽçšĺŽăŽčŚç´ ăĺćĺăăăŚăăăăŠăăăăăăŞăăŽă§ăăăŽăăăŞimplăăŠăăťăŠĺ˝šçŤă¤ăăăăăžăăă ă
@gnzlbgĺ˝ćăăăŞăăŻFromBits<T> for [u8]
ăŤă¤ăăŚčŠąăăŚăăžăăă 䝣ăăăŤ[MaybeUninit<u8>]
ă使ç¨ăăĺż
čŚăăăă¨ç§ăŻč¨ăăžăă
ç§ăŻăăŽććĄăŤă¤ăăŚRustConfăŽ@nikomatsakisă¨čŠąăĺăă彟ăŻç§ăŤRFCăé˛ăăăăăŤĺ§ăăžăăă ć°éąéă§ăăăă¨ćăŁăŚăăăŽă§ăăăčĺłăăăă°äťéąćŤăŤăăŁăŚăżăăă¨ćăăžăă ăăăŻăăŽč°čŤăŤĺ˝šçŤăĄăžăăďź
@joshlfăŠăŽććĄăŤă¤ăăŚčŠąăăŚăăăŽă§ăăďź
@RalfJung
@gnzlbgĺ˝ćăăŞăăŻFromBitsăŤă¤ăăŚčŠąăăŚăăžăă
[u8]ăŽĺ ´ĺă ăăăŻç§ăăĄă使ç¨ăăŞăăă°ăŞăăŞăă¨ç§ăč¨ăă¨ăăă§ă[MaybeUninit ]䝣ăăăŤă
ăŹăăăŁăăăă§ĺŽĺ ¨ăŤĺćăăžăă ç§ăăĄăăăăăăăăăŁăăă¨ăĺŽĺ ¨ăŤĺżăăŚăăžăăđ
@joshlfăŠăŽććĄăŤă¤ăăŚčŠąăăŚăăăŽă§ăăďź
FromBits
/ IntoBits
ććĄă TLDRďź T: FromBits<U>
ć掾ăăŽćĺšăŞäťťćăŽăăăăăżăźăłU
ćĺšăŤç¸ĺ˝T
ă U: IntoBits<T>
ăŻĺăăă¨ăćĺłăăžăă ăłăłăă¤ăŠăźăŻăçšĺŽăŽăŤăźăŤăä¸ăăăăĺ ´ĺăăżă¤ăăŽăăšăŚăŽăă˘ăŤă¤ăăŚä¸ĄćšăčŞĺçăŤć¨ć¸ŹăăžăăăăăŤăăăçžĺ¨unsafe
ĺż
čŚă¨ăăĺ¤ăăŽćĽ˝ăăćŠč˝ă解ăćžăăăžăă ăă°ăăĺăŤć¸ăăăăŽRFCăŽăăŠăăăăăăŤăăăžăăăăăŽĺ¤§é¨ĺăĺ¤ć´ăăă¤ăăăŞăŽă§ăăăŽăăăšăă大ăžăăŞăŹă¤ă䝼ä¸ăŽăăŽă¨čŚăŞăăŞăă§ăă ăăă
@joshlfăăŽăăăŞçšć§ăŽăă˘ăŻăăăŽč°čŤăŽä¸é¨ă§ăăăăăăăăŽč°čŤăŽä¸ăŤć§çŻăăăă¨ćăăžăă AFAIKăŤăŻă匼ĺ˝ć§ăŤé˘ăăŚ2ă¤ăŽćŞč§ŁćąşăŽčłŞĺăăăăžăă
MaybeUninit::get_mut
ăăăĽăĄăłăăéŠĺżăăăĺż
čŚăăăăžăďźĺćĺăĺŽäşăăĺăŤăăă使ç¨ăăăŽăŻĺŽéăŤăŻUBă§ăŻăăăžăăăăĺćĺăĺŽäşăăĺăŤéĺç
§ăăăŽăŻUBă§ăďźă ăăăăç§ăăĄăŻćĺăŤăăŽćĺšć§ăćąşĺŽăăĺż
čŚăăăăăăŽăăăŽéŠĺăŞĺ ´ćăä˝ă§ăăăăŻăăăăžăăă ăăăăĺ°ç¨ăŽRFCďźu8
ďźăăăłäťăŽć´ć°ĺă澎ĺĺ°ć°çšăçăŽăă¤ăłăżăźďźăĺćĺăăĺż
čŚăăăăžăăďźă¤ăžăă MaybeUinit<u8>::uninitialized().into_inner()
insta-UBă§ăăďź ç§ăŻăăćăăžăăăăťă¨ăăŠăŽĺ ´ĺă poison
/ undef
ă訹ĺŻăăĺ ´ćăćĺ°éăŤćăăăă¨ăăç´ćăŤĺşăĽăăŚăăžăă ăă ăăăăŽăăżăźăłăŽä˝żç¨ćłăăăăăăăĺ ´ĺăŻăăăă§ăŞăăă°čŞŹĺžăăăĺŻč˝ć§ăăăăžăďźăăăŚăăăăćąşĺŽăăăăăŤăăŞă使ç¨ăăăă¨ćăăžăďźăăăăŻĺç §ăŽä¸ă§çš°ăčżăăăžăăďź
@RalfJungăŻăăĺç §ăŽä¸ă§çš°ăčżăăăŽćĺłăŽäžă示ăăă¨ăă§ăăžăăďź
u8ďźăăăłäťăŽć´ć°ĺă澎ĺĺ°ć°çšăçăă¤ăłăżăźďźăĺćĺăăĺż čŚăăăăžăăďźă¤ăžăăMaybeUinită§ă
:: uninitializedďźďźăinto_innerďźďźinsta-UBďź
ă¤ăłăšăżăłăUBă§ăŞăĺ ´ĺăŻăŠăăŞăăžăăďź ăăŽĺ¤ă§ä˝ăă§ăăžăăďź ăăăŤĺăăăŚăăăă§ăăďź ăăăăăŞăăăăă°ăŠă ăŽćŻăčăăŻćąşĺŽčŤçă§ăăďź
UBăĺ°ĺ
ĽăăăŤĺ¤ăä¸č´ăăăăă¨ăă§ăăŞăĺ ´ĺăŻă mem::uninitialized
ăĺçşćăăăăăŤćăăžăă ĺ¤ăä¸č´ăăăăă¨ăă§ăăăăšăŚăŽă˘ăźăăăŻăăŁăăŞăăăŹăăŤăŞăŠă§ĺ¸¸ăŤĺăăăŠăłăă使ç¨ăăăĺ ´ĺă mem::zeroed
ăĺçşćăăžăăďź MaybeUninit
ĺŠç¨ăăŚăăăăăŞăăŽă§ăďźă
u8
ďźăăăłäťăŽć´ć°ĺă澎ĺĺ°ć°çšăçăŽăă¤ăłăżăźďźăĺćĺăăĺż čŚăăăăžăăďźă¤ăžăăMaybeUinit<u8>::uninitialized().into_inner()
insta-UBă§ăăďź ç§ăŻăăćăăžăăăăťă¨ăăŠăŽĺ ´ĺăpoison
/undef
ă訹ĺŻăăĺ ´ćăćĺ°éăŤćăăăă¨ăăç´ćăŤĺşăĽăăŚăăžăă ăă ăăăăŽăăżăźăłăŽä˝żç¨ćłăăăăăăăĺ ´ĺăŻăăăă§ăŞăăă°čŞŹĺžăăăĺŻč˝ć§ăăăăžăďźăăăŚăăăăćąşĺŽăăăăăŤăăŞă使ç¨ăăăă¨ćăăžăďźă
FWIWăăăăUBă§ăŻăŞăăă¨ăŽ2ă¤ăŽĺŠçšăŻăaďźLLVMăŽćŠč˝ă¨ä¸č´ăăăă¨ăăăăłbďźćéŠĺăŤăăćčťć§ăĺ˘ăăă¨ă§ăă ăžăăĺťşč¨ćă§ăŻăŞăă使ç¨ćăŤĺŽĺ ¨ć§ăĺŽçžŠăăă¨ăăćčżăŽććĄă¨ăăä¸č´ăăŚăăăăă§ăă
ă¤ăłăšăżăłăUBă§ăŞăĺ ´ĺăŻăŠăăŞăăžăăďź ăăŽĺ¤ă§ä˝ăă§ăăžăăďź ăăăŤĺăăăŚăăăă§ăăďź ăăăăăŞăăăăă°ăŠă ăŽćŻăčăăŻćąşĺŽčŤçă§ăăďź
UBăĺ°ĺ ĽăăăŤĺ¤ăä¸č´ăăăăă¨ăă§ăăŞăĺ ´ĺăŻă
mem::uninitialized
ăĺçşćăăăăăŤćăăžăă ĺ¤ăä¸č´ăăăăă¨ăă§ăăăăšăŚăŽă˘ăźăăăŻăăŁăăŞăăăŹăăŤăŞăŠă§ĺ¸¸ăŤĺăăăŠăłăă使ç¨ăăăĺ ´ĺămem::zeroed
ăĺçşćăăžăăďźMaybeUninit
ĺŠç¨ăăŚăăăăăŞăăŽă§ăďźă
ĺćĺăăăŚăăŞăăăŽăŤä¸č´ăăăăăŽăŻăŞăă§ăăďź ĺćĺăăăŚăăŞăĺ¤ăŤĺşăĽăăŚĺĺ˛ăžăăŻă¤ăłăăăŻăšäťăăăUBă¨ăăŚĺŽçžŠăăă¨ăLLVMăŤćéŠĺăŽä˝ĺ°ăĺ˘ăăăăăçšăŤčŞŹĺžĺăŽăăăŚăźăšăąăźăšăăŞăĺ ´ĺăŻăćăçľăśăă¨ăŻčŻăčăă§ăŻăŞăă¨ćăăžăă
ĺćĺăăăŚăăŞăăăŽăŤä¸č´ăăăăăŽăŻăŞăă§ăăďź
ăăăăă¨ăŻč¨ăăŞăăŁăăŽă§ăăăăăăă§ăăŞăă¨ă MaybeUinit<u8>::uninitialized().into_inner()
ă¨mem::uninitialized()
ăŽéăăăăăăŞăă¨č¨ăăžăăă
@RalfJungăŻăăĺç §ăŽä¸ă§çš°ăčżăăăŽćĺłăŽäžă示ăăă¨ăă§ăăžăăďź
ĺşćŹçăŤăĺéĄăŻćŹĄăŽăă¨ă訹ĺŻăăăăŠăăă§ăă
let mut b = MaybeUninit::<bool>::uninitialized();
let bref = b.get_mut(); // insta-UB?
ĺç §ăćĺšăŞăăŽăćăăŚăăĺ ´ĺăŤăŽăżĺç §ăćĺšă§ăăă¨ĺ¤ćăăĺ ´ĺďźăăăŻăăĺç §ăŽä¸ă§çš°ăčżăăă¨ăăćĺłă§ăďźăăăŽăłăźăăŻUBă§ăă
ă¤ăłăšăżăłăUBă§ăŞăĺ ´ĺăŻăŠăăŞăăžăăďź ăăŽĺ¤ă§ä˝ăă§ăăžăăďź ăăăŤĺăăăŚăăăă§ăăďź ăăăăăŞăăăăă°ăŠă ăŽćŻăčăăŻćąşĺŽčŤçă§ăăďź
ĺćĺăăăŚăăŞău8
ăć¤ćťăăăă¨ăŻă§ăăžăăă match
ăŻăĺĺăŽăă¤ăłăă¨ĺŽéăŽĺçć§ăŽăăšăăŽä¸Ąćšă§ăĺ¤ăăŽăă¨ăĺŽčĄă§ăăžăă ĺč
ăŻĺ¤§ä¸ĺ¤Ťă§ăăăĺžč
ăŻăăă§ăŻăăăžăăă ăă ăăăĄă˘ăŞăŤć¸ăćťăăă¨ăŻă§ăăžăă
ĺşćŹçăŤăăăăŻmiriăçžĺ¨ĺŽčŁ ăăŚăăăăŽă§ăă
UBăĺ°ĺ ĽăăăŤĺ¤ăä¸č´ăăăăă¨ăă§ăăŞăĺ ´ĺăŻămem :: uninitializedăĺçşćăăăăăŤćăăžăă
ăŠăăăŚďź mem::uninitialized
ăŽć大ăŽĺéĄăŻăćĺšăŞĺ¤ăä˝ă§ăăăăŤă¤ăăŚĺśéăăăĺăŤé˘ăăăăŽă§ăăă u8
ăŻăăŽăăăŞĺśéăăŞăă¨ĺ¤ćă§ăăăŽă§ă mem::uninitialized()
ăŻu8
ĺéĄăăăžăă
ăăăăŤăăăĺćĺăăăŚăăŞău8
ăĺŽĺ
¨ăŞăłăźăăŤć¸Ąăăă¨ăŻăžă ĺéĄăăăžăăăăĺŽĺ
¨ă§ăŞăăłăźăă§ć
éăŤä˝żç¨ăăăă¨ăŻĺéĄăŞăăăăăăžăăă
çĄĺšăŞăăźăżăćă&mut
ă§ăăä¸č´ăăăăă¨ăŻă§ăăžăăă IOWăä¸č¨ăŽbool
äžăŻĺéĄăŞăă¨ćăăžăăă䝼ä¸ăŻç˘şăăŤăăă§ăŻăăăžăăă
let mut b = MaybeUninit::<bool>::uninitialized();
let bref = b.get_mut();
match bref {
&b => // insta-UB! We have a bad bool in scope.
}
ăăăŻă match
ă使ç¨ăăŚé常ăŽăă¤ăłăżăźéĺç
§ăĺŽčĄăăŚăăžăă
FWIWăăăăUBă§ăŻăŞăăă¨ăŽ2ă¤ăŽĺŠçšăŻăaďźLLVMăŽćŠč˝ă¨ä¸č´ăăăă¨ăăăăłbďźćéŠĺăŤăăćčťć§ăĺ˘ăăă¨ă§ăă ăžăăĺťşč¨ćă§ăŻăŞăă使ç¨ćăŤĺŽĺ ¨ć§ăĺŽçžŠăăă¨ăăćčżăŽććĄă¨ăăä¸č´ăăŚăăăăă§ăă
ăăăŤăăăăŠăŽćéŠĺăĺŻč˝ăŤăŞăăžăăďź
LLVMăŻćŹčłŞçăŤĺćĺŽăăăŚăăŞăăłăźăăŤĺŻžăăŚćéŠĺăčĄăăăăăăăŻĺéĄă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăă ăăă§ăŻăMIRăŽćéŠĺăŤă¤ăăŚăŽăżčŞŹćăăžăă
ç§ăŻćŹčłŞçăŤăć確ăŤä˝żç¨ă§ăăăăăŤăŞăăžă§ăă§ăăă ă訹ĺŻăăŞăă¨ăă茳çšăăćĽăŚăăžăă ĺžă§ăă¤ă§ăăăĺ¤ăăŽăăŽă訹ĺŻă§ăăžăăăăăŽéăŻă§ăăžăăă ă¨ăŻč¨ăăăŽăŽăćčżăăăźăżăĺ¤ăăăĺŻč˝ć§ăŽăăăă¤ăăšăŠă¤ăšăŽăăă¤ăăŽčŻă使ç¨ćłăçťĺ ´ăăžăăăăăăŻăĺ°ăŞăă¨ău*
ă¨i*
ăăăčĄăăŤăŻĺĺăŞč°čŤăŤăŞăăăăăăžăăă
ĺç §ăćĺšăŞăăŽăćăăŚăăĺ ´ĺăŤăŽăżĺç §ăćĺšă§ăăă¨ĺ¤ćăăĺ ´ĺďźăăăŻăăĺç §ăŽä¸ă§çš°ăčżăăă¨ăăćĺłă§ăďźăăăŽăłăźăăŻUBă§ăă
ăŹăăăŁă
mem :: uninitializedăŽć大ăŽĺéĄăŻăćĺšăŞĺ¤ăä˝ă§ăăăăŤă¤ăăŚĺśéăăăĺăŤé˘ăăăăŽă§ăăă
mem::uninitialized
ăŤăŻăä¸č¨ă§ććăăĺéĄăăăăžăăĺćĺăăăŚăăŞăĺ¤ă¸ăŽĺç
§ăä˝ćăăă¨ăćŞĺŽçžŠăŽĺä˝ăŤăŞăďźăžăăŻăăŞăďźĺŻč˝ć§ăăăăžăă ăăă§ă揥ăŽUBăŻăăăžăăďź
let mut b = MaybeUninit::<u8>::uninitialized().into_inner();
let bref = &mut b; // Insta UB ?
MaybeUninit
ăĺ°ĺ
ĽăăççąăŽ1ă¤ăŻăăŚăăŞăłă常ăŤĺćĺďźăă¨ăă°ăăŚăăăďźăăăă¨ă§ăăŽĺéĄăĺéżăăăă¨ă§ăăă¨čăăžăăăăăăŤăăăăŚăăŞăłăĺç
§ăăăă¨ăă°č¨ĺŽăăăă¨ă§ăăăŽĺ
厚ăĺ¤ć´ă§ăăžăăă˘ăŻăăŁăăăŁăźăŤăău8
ăŤčż˝ĺ ăăUBăĺ°ĺ
ĽăăăŤptr::write
ăäťăăŚĺ¤ăćĺŽăăžăă
ă ăăç§ăŻĺ°ă桡䚹ăăŚăăăŽă§ăă into_inner
ă揥ăăăĺŞăăŚăăăăŠăăăăăăžăăă
let mut b: u8 = uninitialized();
let bref = &mut b; // Insta UB ?
ăŠăĄăăç§ăŤăŻćŞĺŽçžŠăŽćŻăčăăŽćéçĺźžăŽăăăŤčŚăăžăă
ăăăŤăăăăŠăŽćéŠĺăĺŻč˝ăŤăŞăăžăăďź
LLVMăŻćŹčłŞçăŤĺćĺŽăăăŚăăŞăăłăźăăŤĺŻžăăŚćéŠĺăčĄăăăăăăăŻĺéĄă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăă ăăă§ăŻăMIRăŽćéŠĺăŤă¤ăăŚăŽăżčŞŹćăăžăă
ćŞĺŽçžŠăŽăĄă˘ăŞăŤä˝ăăăŽäžĄĺ¤ăăăă¨č¨ăŁăŚăRustăŽăťăăłăăŁăŻăšăŤĺžăŁăŚĺĺ˛ă§ăăĺ ´ĺăLLVMăŽăăźă¸ă§ăłăŽundefinedăŤä¸ăăăă¨ăŻă§ăăžăăăăăăŻăăľăŚăłăăćŁăăăŞăăăă§ăă
ç§ăŻćŹčłŞçăŤăć確ăŤä˝żç¨ă§ăăăăăŤăŞăăžă§ăă§ăăă ă訹ĺŻăăŞăă¨ăă茳çšăăćĽăŚăăžăă ĺžă§ăă¤ă§ăăăĺ¤ăăŽăăŽă訹ĺŻă§ăăžăăăăăŽéăŻă§ăăžăăă
ăăăŻĺ ŹćŁă§ăă
ă¨ăŻč¨ăăăŽăŽăćčżăăăźăżăĺ¤ăăăĺŻč˝ć§ăŽăăăă¤ăăšăŠă¤ăšăŽăăă¤ăăŽčŻă使ç¨ćłăçťĺ ´ăăžăăăăăăŻăĺ°ăŞăă¨ă
u*
ă¨i*
ăŤĺŻžăăŚăăăčĄăăŤăŻĺĺăŞč°čŤăŤăŞăăăăăăžăăă
ăăăăŽăŚăźăšăąăźăšăŽăăăăăŤăĺćĺăăăŚăăŞăĺ¤ăäżćăăăă¤ăăšăŠă¤ăšăĺŤăžăăŚăăžăăďź
ĺćĺăăăŚăăŞăăćŻă§ăŻăŞă&mut [u8]
ă䞥ĺ¤ăăăĺŻč˝ć§ăăăĺ ´ćăŽ1ă¤ăŻă Read::read
-ĺĽĺŚăŞRead
ă¨ăăççąă ăă§ăăăăăĄăăźăăŤăăĺż
čŚăĺéżă§ăăăăăŤăăăă¨ćăăžăă
ĺćĺăăăŚăăŞăăćŻă§ăŻăŞă
&mut [u8]
ă䞥ĺ¤ăăăĺŻč˝ć§ăăăĺ ´ćăŽ1ă¤ăŻăRead::read
-ĺĽĺŚăŞRead
ă¨ăăççąă ăă§ăăăăăĄăăźăăŤăăĺż čŚăĺéżă§ăăăăăŤăăăă¨ćăăžăă
ăŞăăťăŠă MaybeUninit
ăŻĺćĺăăăŚăăăĺ
厚ăĺŽçžŠăăăŚăăŞăăżă¤ăă襨ăăäťăŽăżă¤ăăŽĺćĺăăăŚăăŞăăăźăżďźăă¨ăă°ăăăăŁăłă°ăăŁăźăŤăďźăŻLLVMăă¤ăşăłăŽćĺłă§ĺŽĺ
¨ăŤĺćĺăăăŚăăŞăă¨ăăčăă§ăăďź
ä¸čŹçăŤMaybeUninităŤéŠç¨ăăĺż čŚăŻăŞăă¨ćăăžăă çčŤçăŤăŻăăłăłăăłăăćŞĺŽçžŠăăĺŽçžŠć¸ăżă ăäťťćăŽăłăłăăłăăŤăăăŞăźăşăăăAPIăĺĺ¨ăăĺŻč˝ć§ăăăăžăă
ćŞĺŽçžŠăŽăĄă˘ăŞăŤä˝ăăăŽäžĄĺ¤ăăăă¨č¨ăŁăŚăRustăŽăťăăłăăŁăŻăšăŤĺžăŁăŚĺĺ˛ă§ăăĺ ´ĺăLLVMăŽăăźă¸ă§ăłăŽundefinedăŤä¸ăăăă¨ăŻă§ăăžăăăăăăŻăăľăŚăłăăćŁăăăŞăăăă§ăă
ăăăŻćąşăăŚććĄă§ăŻăăăžăăă§ăăă poison
ĺĺ˛ăăăŽăŻUBă§ăăăäťĺžăUBăŽăžăžă§ăă
ĺéĄăŻăăăźăŤăŤăŽu8
poison
ăĺăŤăćă¤ăăă¨ăUBă§ăăăăŠăăă§ăă
ăăăăŽăŚăźăšăąăźăšăŽăăăăăŤăĺćĺăăăŚăăŞăĺ¤ăäżćăăăă¤ăăšăŠă¤ăšăĺŤăžăăŚăăžăăďź
ăšăŠă¤ăšăŻĺç
§ăŽăăăŞăăŽăŞăŽă§ăĺćĺăăăŚăăŞăăăźăżăŽ&mut [u8]
ăŻăć¸ăčžźăžăăă ăă§ăăă°ĺéĄăăăžăăďźăăăĺç
§ăŽćĺšć§ăŽăăăŤćĄç¨ăăă˝ăŞăĽăźăˇă§ăłă§ăăă¨ćłĺŽăăŚăăžăďźă
@sfackler
ĺćĺăăăŚăăŞăăăă¤ăşăłă§ăŻăŞăďźmut [u8]ă彚çŤă¤ĺŻč˝ć§ăăăĺ ´ćăŽ1ă¤ăŻăRead :: readă§ăăĺĽĺŚăŞReadimplăăăăăĄăčŞăżĺăĺŻč˝ć§ăăăă¨ăăççąă ăă§ăăăăăĄăăźăăŤăăĺż čŚăăŞăăăăŤăăăă¨čăăŚăăžăăĺăŤć¸ăčžźăăŽă§ăŻăŞăă
ăăă¨ă &out
ăăŞăăă°ăăăŞăăŻimplăçĽăŁăŚăăĺ ´ĺăŤăŽăżăăăčĄăăă¨ăă§ăăžăă ĺéĄăŻăĺŽĺ
¨ăŞăłăźăău8
poison
ăĺŚçăăĺż
čŚăăăăăŠăăă§ăŻăŞăďźĺŽĺ
¨ăŞăłăźăăŽä˝żç¨ăŻĺéĄăăăžăăďźďźăĺŽĺ
¨ă§ăŞăăłăźăă§ăăăăŠăăă§ăăăăĄăă§ăă ďźĺŽĺ
¨ć§ä¸ĺ¤éă¨ĺŚĽĺ˝ć§ä¸ĺ¤éăŽéăăŤă¤ăăŚăäťćĽć¸ăăăăŁăăăă°ć稿ăĺç
§ăăŚăă ăă...ďź
é
ăăŚăăăăăăăžăăăă set()
ăĄă˝ăăăŽç˝˛ĺăĺ¤ć´ăăŚ&mut T
ăčżăăă¨ăăĺ§ăăăžăă ăăŽăăăŤă MaybeUninit
ĺä˝ăăĺŽĺ
¨ăŤĺŽĺ
¨ăŞăłăźăăć¸ăăŽăŻĺŽĺ
¨ă§ăďźĺ°ăŞăă¨ăăăă¤ăăŽçśćłă§ăŻďźă
fn init(dest: &mut MaybeUninit<u8>) -> &mut u8 {
dest.set(produce_value())
}
ăăăŻäşĺŽä¸ă init()
ăĺ¤ăĺćĺăăăçşćŁăăă¨ăăéçăŞäżč¨źă§ăă ďźä˝ăäťăŽăăŽăčżăăă¨ăăă¨ăăŠă¤ăăżă¤ă ăééăŁăŚăăžăăĺŽĺ
¨ăŞăłăźăă§ăŻ&'static mut u8
ăŻä¸ĺŻč˝ăŤăŞăăžăăďźĺ°ćĽăé
罎APIăŽä¸é¨ă¨ăăŚä˝żç¨ăăăĺŻč˝ć§ăăăăžăă
@Kixunil䝼ĺăŻăăă ăŁăăăăăă¨ćăă ĺăset
ăăä˝ăăčżăé˘ć°ă桡䚹ăăăŚăăăă¨ăŤć°ăĽăăžăăă
@Kixunil
ăăăŻäşĺŽä¸ă
init()
ăĺ¤ăĺćĺăăăçşćŁăăă¨ăăéçăŞäżč¨źă§ăă ďźä˝ăäťăŽăăŽăčżăăă¨ăăă¨ăĺçśćéăééăŁăŚăăžăăĺŽĺ ¨ăŞăłăźăă§ăŻ&'static mut u8
ăŻä¸ĺŻč˝ăŤăŞăăžăăďź
ĺŽĺ
¨ă§ăŻăăăžăăă Box::leak
ĺ
Ľćă§ăăžăă
ćčżć¸ăăăłăźăăăźăšă§ăç§ăŻĺć§ăŽăšăăźă ăćăă¤ăăă ăăăŻĺ°ăč¤éă§ăăăćäžăăăĺç §ăĺćĺăăăăă¨ăçăŤéçăŤäżč¨źăăžăă ăŽäťŁăăăŤ
fn init(dest: &mut MaybeUninit<u8>) -> &mut u8
ç§ăŻćăŁăŚăăžă
fn init<'a>(dest: Uninitialized<'a, u8>) -> DidInit<'a, u8>
ç§č¨ŁăŻă Uninitialized
ă¨DidInit
ăŻăŠăĄăăăŠă¤ăăżă¤ă ăăŠăĄăźăżă§ä¸ĺ¤ă§ăăăăă DidInit
ăĺĽăŽăŠă¤ăăżă¤ă ăăŠăĄăźăżă§ĺĺŠç¨ăăćšćłăŻăăăžăăăăă¨ăă°ă 'static
ă
DidInit
Deref
ă¨DerefMut
ćĺłăăăŽă§ăĺŽĺ
¨ăŞăłăźăăŻăăŞăăŽäžăŽăăăŤăăăĺç
§ă¨ăăŚä˝żç¨ă§ăăžăă ăă ăăĺćĺăăăăŽăŻĺŽéăŤăŻĺ
ăŽć¸Ąăăăĺç
§ă§ăăăăŠăłăă ăŞäťăŽĺç
§ă§ăŻăŞăă¨ăăäżč¨źăŻăĺŽĺ
¨ă§ăŞăăłăźăăŤĺ˝šçŤăĄăžăă ăăăŻăĺćĺĺăć§é çăŤĺŽçžŠă§ăăăă¨ăćĺłăăžăă
struct Foo {
a: i32,
b: u8,
}
fn init_foo<'a>(dest: Uninitialized<'a, Foo>,
init_a: impl for<'x> FnOnce(Uninitialized<'x, i32>) -> DidInit<'x, i32>,
init_b: impl for<'x> FnOnce(Uninitialized<'x, u8>) -> DidInit<'x, u8>)
-> &'a mut DidInit<'a, Foo> {
let ptr: *mut Foo = dest.ptr;
unsafe {
init_a(Uninitialized::new(&mut (*ptr).a));
init_b(Uninitialized::new(&mut (*ptr).b));
dest.did_init()
}
}
ăăŽé˘ć°ăŻăăŚăźăśăźćäžăŽĺćĺăłăźăŤăăăŻă使ç¨ăăŚăĺăăŁăźăŤăăé çŞăŤĺćĺăăăă¨ăŤăăăć§é ä˝Foo
ă¸ăŽăă¤ăłăżăźăĺćĺăăžăă ăłăźăŤăăăŻăŻDidInit
čżăĺż
čŚăăăăžăăăăăăăŽĺ¤ăŻć°ăŤăăžăăă ăăăăĺĺ¨ăăă¨ăăäşĺŽă§ĺĺă§ăă ăăšăŚăŽăăŁăźăŤăăĺćĺăăăă¨ă Foo
ĺ
¨ä˝ăćĺšă§ăăăă¨ăăăăăžăăăăăăŁăŚă Uninitialized<'a, Foo>
ă§did_init()
ăĺźăłĺşăăžăăăăăŻăăŤăăŁăšăăăă ăăŽĺŽĺ
¨ă§ăŞăăĄă˝ăăă§ăă寞ĺżăăDidInit
ăżă¤ăă§ă init_foo
ăčżăăžăă
ăăŽăăăŞé˘ć°ăä˝ćăăăăăťăšăčŞĺĺăăăăŻăăăăăžăăĺŽéăŽăăźă¸ă§ăłă§ăŻăăăšăăŠăŻăżă¨ăăăăŻăŤăăĺ°ă注ćăĺż čŚă§ăďźăă ăăćšĺăĺż čŚă§ăďźă
ă¨ăŤăăăăăŽăăăŞăăŽăć¨ćşăŠă¤ăăŠăŞăŤĺŽčŁ ă§ăăăŽă§ăŻăŞăăă¨ćăăžăă
ďźćł¨ďź DidInit<'a, T>
ăŻăĺŽéăŤăŻ&'a mut _DidInitMarker<'a, T>
ăżă¤ăă¨ă¤ăŞă˘ăšă§ăăă DerefMut
ĺçśćéăŽĺéĄăĺéżăăžăăďź
ăĄăŞăżăŤăä¸č¨ăŽăŞăłăŻăăăă˘ăăăźăăŻăăšăăŠăŻăżăçĄčŚăăžăăăăăăăŤç°ăŞăă˘ăăăźăăŻă DidInit<âa, T>
T
ăŽăăšăăŠăŻăżăŽĺŽčĄăć
ĺ˝ăăăăă¨ă§ăă ăăŽĺ ´ĺăă¨ă¤ăŞă˘ăšă§ăŻăŞăć§é ä˝ă§ăăĺż
čŚăăăăžăă ăžăă âa
ăăšăŚă§ăŻăŞăă DidInit
čŞä˝ă¨ĺăéˇăăŽT
ă¸ăŽĺç
§ăŽăżăé
ĺ¸ă§ăăžăďźăăă§ăŞăĺ ´ĺăŻăç ´ćŁĺžăă˘ăŻăťăšăçśçśă§ăăžăďźă
䝼ĺăŤset
ă§čŚćąăăĺä˝ăä¸ăăăĄă˝ăăăĺŤăăăăăŽ+1ă§ăăăĺĽăŽĺĺă§ĺŠç¨ă§ăăăŽă§ĺéĄăăăžăăă
ăăŽĺĺăä˝ă§ăăăăŤă¤ăăŚăŽčŻăă˘ă¤ăă˘ăŻăăăžăăďź set_and_as_mut
ďź^^
set_and_borrow_mut
ďź
insert
/ insert_mut
ďź Entry
ăżă¤ăăŤăŻĺ¤ĺ°äźźăor_insert
ăĄă˝ăăăăăăžăďźăă ăă OccupiedEntry
ăĺ¤ăĺ¤ăčżăinsert
ăăăăăăžăŁăăäźźăŚăăžăăďźă
2ă¤ăŽĺĽă
ăŽćšćłăćă¤ćŹĺ˝ăŤčŞŹĺžĺăŽăăççąăŻăăăžăăďź ćťăĺ¤ăçĄčŚăăăŽăŻç°ĄĺăŞăăă§ăăé˘ć°ăŻ#[inline]
ă¨ăăŚăăźăŻăăăăŽă§ăĺŽéăŽĺŽčĄćăłăšăăŻäşćłăăăžăăă
2ă¤ăŽĺĽă ăŽćšćłăćă¤ćŹĺ˝ăŤčŞŹĺžĺăŽăăççąăŻăăăžăăďź ćťăĺ¤ăçĄčŚăăăŽăŻç°ĄĺăŞăăă§ă
ĺŻä¸ăŽççąăŻă set
ăä˝ăăčżăăŽăčŚăăŽăŻăăŞăéŠăăšăăă¨ă ă¨ćăăžăă
ä˝ăăčśłăăŞăăăăăăžăăăăçĄĺšăŞĺ¤ăćă¤ăă¨ăăç§ăăĄăćăăă¨ăă§ăăă§ăăăăďź ă¤ăžăă
let mut foo: MaybeUninit<T> = MaybeUninit {
uninit: (),
};
let mut foo_ref = &mut foo as *mut MaybeUninit<T>;
unsafe {
some_native_function(&mut (*foo_ref).value, val);
}
some_native_function
ăno-opă§ăăăĺŽéăŤĺ¤ăĺćĺăăŞăĺ ´ĺăŻăŠăăŞăăžăăďź ăăăŻăžă UBă§ăăďź ăŠăŽăăăŤĺŚçă§ăăžăăďź
@PzixelăăăŻăăšăŚMaybeUninit
ăŽAPIăăăĽăĄăłăă§ăŤăăźăăăŚăăžăă
some_native_function
ăNOPăŽĺ ´ĺăä˝ă辡ăăăžăăă ăăŽĺžăĺžă§foo_ref.value
使ç¨ăăĺ ´ĺďźăžăăŻăăăăŞăăŻAPIăă使ç¨ă§ăăŞăăăfoo_ref.as_mut()
ă使ç¨ăăĺ ´ĺďźăé˘ć°ăŻăăšăŚăĺćĺăăăĺžăŤăŽăżĺźăłĺşăăăĺŻč˝ć§ăăăăăăUBă§ăă
MaybeUninit
ăŻçĄĺšăŞĺ¤ăćă¤ăă¨ăé˛ăăžăă-ĺŻč˝ă§ăăă°ăăăăŻĺŽĺ
¨ă§ăăăăăăŻä¸ĺŻč˝ă§ăă ăă ăăăłăłăă¤ăŠă¨ăăă°ăŠăăŽä¸Ąćšă確čŞă§ăăăăăŤăĺ¤ăçĄĺšă§ăăĺŻč˝ć§ăăăă¨ăăć
ĺ ąăĺăŤă¨ăłăłăźăăăăăăăŤăŞăŁăăăăçĄĺšăŞĺ¤ăŽćä˝ăç°ĄĺăŤăŞăăžăă
ĺ°ćĽçşçăăĺŻč˝ć§ăŽăăćśçŠşăŽĺéĄăŤé˘ăăŚă @ sfackleră¨ăŽIRCäźčŠąăćć¸ĺăăăă¨
丝ăŞčłŞĺăŻă mem::zeroed
ăMaybeUninit<NonZeroU8>
ăŽçžĺ¨ăŽĺŽčŁ
ććĄăŽćĺšăŞăĄă˘ăŞĺ
襨çžă§ăăăăŠăăă§ăă ç§ăŽčăă§ăŻăăuninităçść
ă§ăŻăĺ¤ăŻăăăŁăłă°ăŽăżă§ăăăăłăłăă¤ăŠăźăŻăăăäťťćăŽçŽçăŤä˝żç¨ă§ăăžăăăvalueăçść
ă§ăŻă mem::zeroed
ăé¤ăăăšăŚăŽĺŻč˝ăŞĺ¤ăćĺšă§ăďź NonZero
ăăďź
ďźçžĺ¨ăăăďźăăéŤĺşŚăŞĺćĺĺ¤ĺĽăăăăłă°ăĺăăĺ°ćĽăŽăżă¤ăăŽăŹă¤ă˘ăŚăăˇăšăă ă§ăŻăĺ¤ĺĽĺźăăuninităçść
/ăźăĺăĄă˘ăŞăŽăvalueăçść
ăŽăăăŁăłă°ăŤć źç´ăăĺŻč˝ć§ăăăăžăă ăăŽćśçŠşăŽăˇăšăă ă§ăŻă Option<MaybeUninit<NonZeroU8>>
ăŽăľă¤ăşăŻ1ă§ăăăçžĺ¨ăŻ2ă§ăăăăăŤăăăŽćśçŠşăŽăˇăšăă ă§ăŻă Some(MaybeUninit::uninitialized())
ăŻNone
ă¨ĺşĺĽă§ăăžăăă ăăŽăăăŞăˇăšăă ăŤç§ťčĄăăăă MaybeUninit
ďźăăăŞăăŻAPIă§ăŻăŞăďźăŽĺŽčŁ
ăĺ¤ć´ăăăă¨ă§ăăăăăăăă俎ćŁă§ăăă¨ćăăžăă
ăăŽçšă§NonZeroU8
ă¨&'static i32
éăŤéăăŻčŚăăăžăăă ăăăăŻä¸Ąćšă¨ăă0ăăçĄĺšăŞăżă¤ăMaybeUninit<T>::zeroed().into_inner()
ăŻinsta-UBă§ăă
Option<Union>
ăăŹă¤ă˘ăŚăăŽćéŠĺăĺŽčĄă§ăăăăŠăăăŻăăŚăăŞăłăŽćĺšć§ăŤăăŁăŚç°ăŞăăžăă ăăăŻăăšăŚăŽĺ ´ĺă§ăžă ćąşĺŽăăăŚăăžăăăăăżă¤ă()
ăăŞă˘ăłăăćă¤ăŚăăŞăłăŽĺ ´ĺăäťťćăŽăăăăăżăźăłăćĺšă§ăăăăăăŹă¤ă˘ăŚăăŽćéŠĺăŻä¸ĺŻč˝ă§ăăă¨ăăä¸čŹçăŞĺćăăăăžăă ăăăŻMaybeUninit
ăŤăăźăăžăă ăăăăŁăŚă Option<MaybeUninit<NonZeroU8>>
ăľă¤ăşă1ăŤăŞăăă¨ăŻăăăžăăă
ăżă¤ăďźďźăŽăăŞă˘ăłăăćă¤ăŚăăŞăłăŽĺ ´ĺăäťťćăŽăăăăăżăźăłăćĺšă§ăăăăăăŹă¤ă˘ăŚăăŽćéŠĺăŻä¸ĺŻč˝ă§ăăă¨ăăä¸čŹçăŞĺćăăăăžăă
ăăăŻăăżă¤ăďźďźăŽăăŞă˘ăłăăćă¤ăŚăăŞăłăăŽçšćŽăŞăąăźăšă§ăăďź ăăŽćŠč˝ăŽĺŽĺŽĺăŻăRust ABIăŽăăŽé¨ĺăćéťçăŤĺŽĺŽĺăăžăăďź struct UnitType;
ăžăăŻstruct NewType(());
ăĺŤăunion
struct NewType(());
ăŠăă§ăăďź struct Padded
ďźä¸č¨ďźăŻăŠăă§ăăďź ä˝ăŤă¤ăăŚunion
ĺŤăstruct Padded
ďź
#[repr(C, align(4))]
struct Padded {
a: NonZeroU8,
b: (),
c: NonZeroU16
}
ç§ăŽč¨ăĺăăŻă˛ăŠăĺ ˇä˝çă§ăăăăŞăăŞăăăăăŻćĺéăăç§ăăĄăä¸čŹçăŤĺćăăŚăăă¨ç˘şäżĄăăŚăăĺŻä¸ăŽăă¨ă ăăă§ăă :)ăăăăľă¤ăşăŽăżăŤäžĺăăăăă¨ćăăžăďźă¤ăžăăăăšăŚăŽZSTăăăăĺĺžăăžăďźăăĺŽéăŤăŻăăŽăăŞă˘ăłăăŻĺż čŚăŞăăŻăă§ăăăăŚăăŞăłăŻăăăŠăŤăă§ăŹă¤ă˘ăŚăăŽćéŠĺăĺĺžăăŞăă¨ćă
çžĺ¨ăŽăłăłăťăłăľăšăčŠäžĄăăăăăŽéŠĺăŞčŠąăĺăăăăăUCGăŹăăŽćŹĄăŽč°čŤăŽ1ă¤ă§ăăăŤĺ¤ăăŽăă¨ăŤă¤ăăŚĺćăĺžăăăĺŻč˝ć§ăăăăžăăăăăçşçăăĺ ´ĺăŻăăă˛ĺĺ ăăŚăă ăăă
ăăŽćŠč˝ăŽĺŽĺŽĺăŻăRust ABIăŽăăŽé¨ĺăćéťçăŤĺŽĺŽĺăăžăăďź
ăăă§ăŻăăăźăżăŹă¤ă˘ăŚăă§ăŻăŞăăćĺšć§ăŽä¸ĺ¤ćĄäťśăŤă¤ăăŚčŞŹćăăžăďźABIă辡ĺăăă¨ăăŤĺç §ăăă¨ćăăžăďźă ăăăăŁăŚăăăăŤăăŁăŚABIăĺŽĺŽăăăă¨ăŻăăăžăăă ăăăăŻé˘éŁăăŚăăžăăć確ă§ăăăĺŽéăçžĺ¨ăçľĺăŽABIăŤă¤ăăŚçśçśçăŞč°čŤăčĄăăăŚăăžăă
ăăăăŻé˘éŁăăŚăăžăăć確ă§ăăăĺŽéăçžĺ¨ăçľĺăŽABIăŤă¤ăăŚçśçśçăŞč°čŤăčĄăăăŚăăžăă
č°čŤăŻăŚăăŞăłăŽăĄă˘ăŞčĄ¨çžăŤă¤ăăŚăŽăżă§ăăăăŚăăŞăłăé˘ć°ăŽĺ˘çăABIăŤé˘éŁăăĺŻč˝ć§ăŽăăăăŽäťăŽăăŽăăŠăŽăăăŤééăăăăŻĺŤăžăăŚăăžăăă UCGăŹăăŽçŽçăŻRustăŽABIăä˝ćăăăă¨ă§ăŻăŞăă¨ćăăžăă
çŽçăŻăCă¨ăŽç¸äşéç¨ăŤĺĺăŞăăŽăĺŽçžŠăăăă¨ă§ăăăRust bool
ă¨C bool
ăŻABIäşćă§ăăăŞăŠă§ăă
ăăăăĺŽéă repr(Rust)
ĺ ´ĺăé˘ć°ĺźăłĺşăABIăĺŽçžŠăăč¨çťăŻăŞăă¨ćăăžăăăă ăăçćłçăŤăŻăççĽă ăă§ăŞăăçľćăŽăăăĽăĄăłăăăŠăŽăăăŞĺ˝˘ĺźă§ăăŁăŚăăć示çăŞăšăăźăăĄăłăă§ăăĺż
čŚăăăăžăă
Foo
ă揥ăŽăăăŤĺŽçžŠăăăŚăăOption<Foo>
ăŹă¤ă˘ăŚăćéŠĺăŤĺ寞ăăč°čŤăăăăăŠăăçĽăăăă§ăă
union Foo {
bar: NonZeroUsize,
baz: &'static str,
}
@KixunilăŻhttps://github.com/rust-rfcs/unsafe-code-guidelines/issues/13ă§ăăăä¸ăăăă¨ăă§ăăžăMaybeUninit
ă¨ăŻé˘äżăăăžăăă
ĺćĺăăăŤéçĺ¤ć°ăĺŤăžăăăťăŻăˇă§ăłăçĽăăăă§ăăďź
ăCăă§ăŻăéŤăŹăăŤăŽăăĄă¤ăŤăŤuint8_t a[100];
ăć¸ăčžźăăă¨ăă§ăă .bssăťăŻăˇă§ăłăŤăˇăłăăŤăé
罎ăăăăă¨ăçĽăŁăŚăăžăă uint8_t a[100] = {};
ă¨ć¸ăă¨ăăˇăłăăŤăŻ.dataăťăŻăˇă§ăłăŤé
罎ăăăĄă¤ăłăŽĺăŤFLASHăăRAMăŤăłăăźăăăžăďźă
ăăăŻăMaybeUninită使ç¨ăăRustăŽĺ°ăăŞäžă§ăă
struct A {
data: MaybeUninit<[u8; 100]>,
len: usize,
}
impl A {
pub const fn new() -> Self {
Self {
data: MaybeUninit::uninitialized(),
len: 0,
}
}
}
static mut a: MaybeUninit<[u8; 100]> = MaybeUninit::uninitialized();
static mut b: A = A::new();
ăŠăŽăťăŻăˇă§ăłăŤaă¨băŽč¨ĺˇăĺŤăžăăžăăďź
PSç§ăŻăˇăłăăŤăăłă°ăŞăłă°ăŤă¤ăăŚçĽăŁăŚăăžăăăăăŽčłŞĺăŤăŻé˘äżăăăžăăă
@ qwerty19106ăăŞăăŽäžă§ăŻă a
ă¨b
严ćšă.bss
ăžăă LLVMăŻăĺ¤ć°ăĺ
ĽăăťăŻăˇă§ăłăé¸ćăăă¨ăăŤă MaybeUninit::uninitialized()
ăăăŞundef
ĺ¤ăăźăă¨ăăŚćąăăžăă
A::new()
len
ă1ăŤĺćĺăăĺ ´ĺă b
ăŻ.data
çľäşăăžăă static
ăŤăźă䝼ĺ¤ăŽĺ¤ăĺŤăžăăŚăăĺ ´ĺăĺ¤ć°ăŻ.data
ăžăă ăăăŁăłă°ăŻăźăĺ¤ă¨ăăŚćąăăăžăă
ăăăŻLLVMăčĄăăă¨ă§ăă RustăŻă static
ĺ¤ć°ăăŠăŽăŞăłăŤăźăťăŻăˇă§ăłăŤĺ
ĽăăŽăăŤă¤ăăŚăäżč¨źăăç´ćăăžăăďź*ďźăLLVMăŽĺä˝ăçśćżăăă ăă§ăă
ďź*ďź #[link_section]
ă使ç¨ăăŞăéă
ăăăăăäşĺŽďźăăćçšă§ăLLVMăŻundef
ăăźă䝼ĺ¤ăŽĺ¤ă¨čŚăŞăăăăăäžăŽĺ¤ć°a
ăŻ.data
çľăăăžăăă ďź41315ăĺç
§ăăŚăă ăăă
çăăŚăăăŚăăăă¨ă@japaric ă ă¨ăŚăĺŠăăăžăăă
ç§ăŻć°ăăčăăćăŁăŚăăžăă
mainăĺźăłĺşăĺăŤă .init_arrayăťăŻăˇă§ăłă使ç¨ăăŚéçmutĺ¤ć°ăĺćĺă§ăăžăă
ăăăŻćŚĺżľĺŽč¨źă§ăă
#[macro_export]
macro_rules! static_singleton {
($name_var: ident, $ty:ty, $name_init_fn: ident, $name_init_var: ident, $init_block: block) => {
static mut $name_var: MaybeUninit<$ty> = unsafe {MaybeUninit::uninitialized()};
extern "C" fn $name_init_fn() {
unsafe {
$init_block
}
}
#[link_section = ".init_array"]
#[used]
static $name_init_var: [extern "C" fn(); 1] = [$name_init_fn];
};
}
ăăšăăłăźăďź
static_singleton!(A, u8, a_init_fn, A_INIT_VAR, {
let ptr = A.get_mut();
*ptr = 5;
});
fn main() {
println!("A inited to {}", unsafe {&A.get_ref()});
}
çľćďź5ăŤĺćĺ
ĺŽĺ ¨ăŞäžďźéăłĺ ´
ćŞč§ŁćąşăŽčłŞĺďź
ç§ăŻa_init_fnă¨A_INIT_VARăçćăăăăăŤconcat_identsă使ç¨ă§ăăžăăă§ăăă ďź1628ăŻăžă 使ç¨ă§ăăçść
ăŤăŞăŁăŚăăŞăăăă§ăă
ăăŽăăšăăŻăăžă彚ăŤçŤăĄăžăăă ăă ăăč¤éăŞć§é ä˝ăĺćĺăăăăăŽçľăżčžźăżăŤĺ˝šçŤă¤ĺ ´ĺăăăăžăďź .bssăŤé 罎ăăăăăă FLASHăçŻç´ă§ăăžăďźă
rustcă.init_arrayăťăŻăˇă§ăłă使ç¨ăăŞăăŽăŻăŞăă§ăăďź ELF形ĺźăŽć¨ćşĺăăăăťăŻăˇă§ăłă§ăďźăŞăłăŻďźă
@ qwerty19106 mainďźďźăŽĺăŽçć´ťăŻčޤăŁăćŠč˝ă¨čŚăŞăăăRustăŽăťăăłăăŁăŻăšăăć示çăŤćĺž ăăăŞăăŁăăăă§ăă
ăăăăžăăăăăăŻčŻăăŠăłă°ăăśă¤ăłă§ăă
ăăăă ďź[no_std]ăŤăŻăäťăŽă¨ăăčŻăé¸ćč˘ăăăăžăăďźăăśăç§ăŻćŞăć¤ç´˘ăăăŚăăžăăďźă
spin :: Onceă使ç¨ă§ăăžăăăé常ăŤăłăšăăăăăăžăďźăăšăŚăŽĺç §getă§Ordering :: SeqCst ďźă
çľăżčžźăżăŽăłăłăă¤ăŤćăă§ăăŻăăăăăŽă§ăăă
ăăăŻé常ăŤéŤäžĄă§ăďźăăšăŚăŽĺç §ĺĺžă§
Ordering::SeqCst
ďźă
ăăăŻç§ăŤăŻćŁăăčăăăžăăă ăăšăŚăŽă1ĺăăŽć˝čąĄĺăŻăă˘ăŻăťăšćăŤçˇŠĺăăăĺćĺćăŤĺćăăăăŻăă§ăŻăăăžăăăďź ăăă¨ăç§ăŻä˝ăäťăŽăă¨ăčăăŚăăžăăďź
cc @Amanieu @alexcrichton
@ qwerty19106 ďź
ăçľăżčžźăżăă¨ăŻăăă˘ăĄăżăŤăŽăă¨ă§ăăďź .init_array
ăŻăĺŽéăŤăŻELF形ĺźčŞä˝ăŽä¸é¨ă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăš-ăăăćĄĺźľăăSystemVABI²ăŽä¸é¨ă§ăăăăžăăă .init
ă§ăă LinuxABIăçśćżăăSystemV ABIăăŠăăă˘ăăăăźăăŤĺ°éăăăžă§ă .init_array
ăŻčŚă¤ăăăžăăă
ăăŽçľćăăă˘ăĄăżăŤă§ĺŽčĄăăŚăăĺ ´ĺă .init_array
ăŻăŚăźăšăąăźăšăŤĺŻžăăŚç˘şĺŽăŤćŠč˝ăăŞăĺŻč˝ć§ăăăăžă-çľĺąăŽă¨ăăăăă¤ăăăăŻăăźăăźălibcăŽăłăźăăŤăăŁăŚéăă˘ăĄăżăŤăŤĺŽčŁ
ăăăŚăăžăă ăăźăăăźăăźă.init_array
ă§ĺç
§ăăăŚăăăłăźăăŽĺŽčĄăŤč˛Źäťťăč˛ ăăŞăéăăä˝ăăăžăăă
1ďź28ăăźă¸ăŽĺł1-13ăçšĺĽăŞăťăŻăˇă§ăłăăĺç
§ăăŚăă ăăă
2ďź63ăăźă¸ăŽĺł4-13ăçšĺĽăŞăťăŻăˇă§ăłďźçśăďźăăĺç
§ăăŚăă ăăă
@eddyb Once
čŞăżĺăă¨ăăŻăĺ°ăŞăă¨ăAcquire
ăăźăăĺż
čŚă§ăă ăăăŻăx86ăŽé常ăŽč˛ čˇă§ăăăARMăŽč˛ čˇ+ăă§ăłăšă§ăă
çžĺ¨ăŽĺŽčŁ
ă§ăŻload(SeqCst)
ă使ç¨ăăŚăăžăăăĺŽéăŤăŻăăăăŤăăăăăšăŚăŽă˘ăźăăăŻăăŁă§load(Acquire)
ă¨ĺăasmăçćăăăžăă
ďźăăăăŽăăŁăšăŤăăˇă§ăłăĺĽăŽĺ ´ćăŤç§ťĺăăŚăăăăăă§ăăďźMaybeUninită¨mem :: uninitializedă¨ăŻé˘äżăăăžăăăăŠăĄăăăLLVMă¨ĺăăăăŤĺä˝ăăžă-undefăçćăăžăăĺžă§ăăŽundefă§ä˝ă辡ăăăăŤă¤ăăŚăŻăăăă§ăŻĺăä¸ăăžăăă ďź
ă˘ă 13. 2018ĺš´9ćĺ¤12ć59ĺ20ç§MESZ schrieb Amanieu [email protected] ďź
@eddybăčŞăă¨ăăŻăĺ°ăŞăă¨ă
Acquire
ăăźăăĺż čŚă§ăă
Once
ă ăăăŻăx86ăŽé常ăŽč˛ čˇă§ăăăARMăŽč˛ čˇ+ăă§ăłăšă§ăăçžĺ¨ăŽĺŽčŁ ă§ăŻ
load(SeqCst)
ă使ç¨ăăŚăăžăăăĺŽéăŤăŻăă
ăăšăŚăŽă˘ăźăăăŻăăŁă§load(Acquire)
ă¨ĺăasmăçćăăžăă-
ăăŞăăč¨ĺăăăăŽă§ăăŞăăŻăăăĺăĺăŁăŚăăžăă
ăăŽăĄăźăŤăŤç´ćĽčżäżĄăăăăGitHubă§čĄ¨ç¤şăăŚăă ăăă
https://github.com/rust-lang/rust/issues/53491#issuecomment -420825802
MaybeUninit
ăŻăăšăżăźăŤçé¸ăă揥ăŽĺ¤ăŤăŞăăžăă :)
https://github.com/rust-lang/rust/issues/54470ăŻă使ç¨ăăăă¨ăććĄăăŚăăBox<[MaybeUninit<T>]>
ăŤRawVec<T>
ă ăăă¨ăăăăăäťăŽčĺłćˇąăçľăżĺăăăăć ¸ĺ¤ćăŽĺ°ăŞăăăăŻăšă¨ăšăŠă¤ăšă§ćĺšăŤăăăŤăŻăć¨ćşăŠă¤ăăŠăŞăŤAPIăčż˝ĺ ă§ăăă§ăăăăă
çšăŤĺćĺăăăŤĺ˛ăĺ˝ăŚăĺ ´ĺďź Box::new(MaybeUninit::uninitialized())
ăŻsize_of::<T>()
ăăăŁăłă°ăă¤ăăăłăăźăăă¨ćăăžăăďźďźďź
impl<T> Box<MaybeUninit<T>> {
pub fn new_uninit() -> Self {âŚ}
pub unsafe fn assert_init(s: Self) -> Box<T> { transmute(s) }
}
impl<T> Box<[MaybeUninit<T>]> {
pub fn new_uninit_slice(len: usize) -> Self {âŚ}
pub unsafe fn assert_init(s: Self) -> Box<[T]> { transmute(s) }
}
core::slice
/ std::slice
ă§ăŻăăľăăšăŠă¤ăšăĺĺžăăĺžăŤä˝żç¨ă§ăăžăă
pub unsafe fn assert_init<T>(s: &[MaybeUninit<T>]) -> &[T] { transmute(s) }
pub unsafe fn assert_init_mut<T>(s: &mut [MaybeUninit<T>]) -> &mut [T] { transmute(s) }
Box :: newďźMaybeUninit :: uninitializedďźďźďźăŻăžă size_of ::ăăłăăźăăă¨ćăăžă
ďźďźăăăŁăłă°ăă¤ă
ăăăăšăă§ăŻăŞăăăăăăăšăăăăă¨ăçŽçă¨ăăcodegenăăšăăăăăžăă
ăăă襨çžăŻéčŚă§ăŻăŞăăăăăăăŁăłă°ăă¤ăăăłăăźăăĺż čŚăŻăăăžăăďźăăă襨çžăçŁčŚăăăăŽăŻăăšăŚUBă§ăďźă
ăăŚăĺ¤ĺBox::new_uninit
ăŻä¸čŚă§ăăďź ăă ăă Box::new
ăŻT: Sized
ăĺż
čŚăŞăăăăšăŠă¤ăšăăźă¸ă§ăłăŻç°ăŞăăžăă
MaybeUninit::zeroed
ăconst fn
ăăăă¨ăćĺąăăăă¨ćăăžăă ç§ăăăăŤĺŻžăăŚćă¤ă§ăăăăăă¤ăăŽFFIé˘éŁăŽä˝żç¨ćłăăăďźäžăă°ăăźăăŤĺćĺăăăŞăăă°ăŞăăŞăéçďźăäťăŽäşşăăăă彚ăŤçŤă¤ă¨ćăăăăăăŞăă¨ç§ăŻäżĄăăŚăăžăă zeroed
é˘ć°ăć§ćăăăăăŤăăăŠăłăăŁă˘ă§ćéăĺ˛ăăŚăăă ăăă°ĺš¸ăă§ăă
@mjbshaw zeroed
ăŻmin_const_fn
ăă§ăăŻăŤĺć źăăŞăăă¨ăčĄăăăăăăŽăăăŤ#[rustc_const_unstable(feature = "const_maybe_uninit_zeroed")]
ă使ç¨ăăĺż
čŚăăăăžăďźhttps://github.com/rust-lang/ rust / issues / 53555ďźăăăŻăé˘ć°ăĺŽĺŽăăŚăăŚăă MaybeUninit::zeroed
ăŽĺŽć°ăä¸ĺŽĺŽăŤăŞăăă¨ăćĺłăăžăă
MaybeUninităżă¤ăăăăĺşăă¨ăłăˇăšăă ă§ăăćŠăĺŠç¨ă§ăăăăăŤăăăăăŤăăăăŽĺŽčŁ /ĺŽĺŽĺăăăă¤ăăŽăšăăăăŤĺĺ˛ă§ăăžăăďź ćé ăŻćŹĄăŽă¨ăăă§ăă
1ďźMaybeUninităčż˝ĺ ăăžă
2ďźmem :: uninitialized / zeroedăŽăăšăŚăŽä˝żç¨ăĺ¤ćăăéć¨ĺĽ¨ăŤăăžă
@scottjmaddox
MaybeUninităčż˝ĺ
https://doc.rust-lang.org/nightly/core/mem/union.MaybeUninit.html :)
ăăăďź ă§ăŻăMaybeUninităă§ăăă ăćŠăĺŽĺŽăăăč¨çťăŻăăăžăăďź
揥ăŽăšăăăăŻă httpsďź//github.com/rust-lang/rust/pull/54668ăăăăŠăźăăłăšăăăăťăŠă˛ăŠăä˝ä¸ăăăççąăç解ăăăă¨ă§ăďźăăă¤ăăŽăăłăăăźăŻă§ďźă äťéąăŻăăăčŚăćéăăăžăăŞăăŽă§ăăă誰ăäťăŽäşşăčŚăŚăăăăĺŹăăă§ăă ďźD
ăžăăăăăćĽăăšăă§ăŻăŞăă¨ćăăžăă ĺćĺăăăŚăăŞăăăźăżăĺŚçăăăăăŽćĺžăŽAPIăééăŁăŚĺĺžăăžăăăćĽăă§ăăăä¸ĺşŚĺ¤ąćăăŞăăăăŤăăžăăăă ;ďź
ăăăŻč¨ăŁăŚăăç§ăŻä¸ĺż čŚăŞé ĺťśăčż˝ĺ ăăăăŞăăŽă§ăćçľçăŤĺ¤ăăăăăŹăłăéć¨ĺĽ¨ăŤăăăă¨ăă§ăăžăă :)
ăăăăăăŚç§ăŤä˝ăäťăŽăă¨ă辡ăăŁă... https://github.com/rust-lang/rust/pull/54667ăçé¸ăăă¨ăĺ¤ăAPIăŻĺŽéăŤććŞăŽăăăăŹăłăŽăăă¤ăăăäżčˇăăžăă MaybeUninit
ă§ăăăŽä¸é¨ăćăŤĺ
Ľăăăă¨ăă§ăăăŽă ăăăďź ăăăŻĺŽĺŽĺă匨ăăŚăăžăăăăçĄäşşăŽăżă¤ăă§ĺźăłĺşăăăă¨ăăŤMaybeUninit::into_inner
ăăăăŻăŤăăćšćłăčŚă¤ăăăă¨ă芌ăżăăă¨ăă§ăăžăă ăăăă°ăăŤăă§ăŻă T
çĄäşşăŽx: &[mut] T
ă¨ăăŤă *x
ăăăăăŻăŤăŞăăă¨ăćłĺă§ăăžăă
ăšăăźăżăšăŽć´ć°ďźhttpsďź//github.com/rust-lang/rust/pull/54668ăé˛ăăăŤăŻăăŚăăŞăłăŽăŹă¤ă˘ăŚăč¨çŽă垎調ć´ăăäşşăĺż čŚăŤăŞăĺŻč˝ć§ăăăăžăă @eddybăŻĺăă§ćĺ°ăăžăăăĺŽčŁ ăčĄăäşşăĺż čŚă§ăă :)
ăŠăăăźăă秝ĺăăŚăĺââćĺăăăŚăăŞăĺ¤ăŤç˝ŽăćăăăĄă˝ăăă彚çŤă¤ă¨ćăăžăă
pub unsafe fn take(&mut self) -> T
ăăăćĺşăăžăăăďź
@shepmasterăăăŻăć˘ĺăŽinto_inner
ăĄă˝ăăă¨é常ăŤăăäźźăŚăăžăă ăăśăăăăă§éč¤ăéżăăăă¨ăăăă¨ăă§ăăžăăďź
ăžăăă罎ćăăŻăăă§ăŻééăŁăĺłă§ăăĺŻč˝ć§ăăăăžăăăăăŤăăŁăŚself
ăŽĺ
厚ăăžăŁăăĺ¤ăăăă¨ăŻăăăžăăă ćć樊ă ăăč˛ć¸ĄăăăăăăĺćĺăăăŚăăŞăçść
ă§ć§çŻăăăĺ ´ĺă¨ĺŽčłŞçăŤĺăçść
ăŤăŞăăžăă
self
ăŽĺ 厚ăĺ¤ć´ăă
確ăăŤăĺŽčŁ
ăŻĺşćŹçăŤptr::read
ăŤăŞăăžăăă使ç¨ćłăŽčŚłçšăăăćĺšăŞĺ¤ăĺćĺăăăŚăăŞăĺ¤ăŤç˝ŽăćăăăăŽă¨ăăŚăăŹăźăăłă°ăăăă¨ăăĺ§ăăăžăă
éč¤ăéżăă
ä¸ćšăŽĺŽčŁ ăăăä¸ćšăĺźăłĺşăăă¨ăćĺž ăăŚăăăŽă§ăç§ăŻĺźˇăç°č°ăŻăăăžăăă ćçľçăŞçść ăăŠăăŞăăăăăăžăăă
into_inner
ăŻăăžăăŤăçĄéŞć°ăŞé˘ć°ĺă ă¨ćăăžăă äşşă
ăŻăăăăăăăăĽăĄăłăă注ć桹ăčŞăžăŞăăŚăă MaybeUninit::uninitialized().into_inner()
ăžăă ĺĺăwas_initialized_unchecked
ăăăŞĺĺăŤĺ¤ć´ăăŚăăăźăżăĺćĺăăăĺžăŤăŽăżăăăĺźăłĺşăĺż
čŚăăăăă¨ă示ăăă¨ăŻă§ăăžăăďź
ĺăăă¨ăăăăătake
ĺ˝ăŚăŻăžăă¨ćăăžăă
ĺ°ăĺäťă§ăăă unchecked_into_initialized
ăăăŞăăŽăćŠč˝ăăĺŻč˝ć§ăăăăžăăďź
ăžăăŻăăăăăŽăĄă˝ăăăĺŽĺ
¨ăŤĺé¤ăăăăăĽăĄăłăăŤx.as_ptr().read()
äžă示ăĺż
čŚăăăăžăăďź
@SimonSapin into_inner
ăŻself
ćśč˛ťăăžăăăăăăŻç´ ć´ăăăăă¨ă§ăă
ăăăă @ shepmasterăŽtake
ĺ ´ĺă as_mut_ptr().read()
ăĺŽčĄăăŚăĺăăă¨ăčĄăăăžă...ăăĄăăăăŞăĺŻĺ¤ăă¤ăłăżăźăć°ăŤăăĺż
čŚăăăăŽă§ăăăăă
take_unchecked
ă¨into_inner_unchecked
ăŠăă§ăăďź
ăăăŻç§ăć¨ć¸ŹăăăăăŻă˘ăăč¨çťă§ăăăăăăăăŞăăĺćĺăăăŤéăăŞăăă¨ă示ăăă¨ăă§ăăă°ç§ăŻĺĽ˝ăă§ăăăă
ĺćĺăăĺż
čŚăăăăă¨ă埡調ăăăă¨ă¨ăăăăčĄăăă¨ăŽčŞŹćďźunwrap / into_inner /etcăďźăŽä¸Ąćšă1ă¤ăŽĺĺăŤĺ
Ľăăă¨ăăăŞăćąăăŤăăăŞăăŽă§ăĺč
ăassert_initialized
ă§ĺŽčĄăăĺžč
ăćŽăăŽăŻăŠăă§ăăăăă署ĺăŤăăŁăŚć示ăăăžăăďź assert!()
ăăăŤăŠăłăżă¤ă ăă§ăăŻăć示ăăăă¨ăéżăăăăăŤăĺŻč˝ăŞunchecked_assert_initialized
ă
assertďźďźďźăŽăăăŞăŠăłăżă¤ă ăă§ăăŻăć示ăăăă¨ăéżăăăăăŤăunchecked_assert_initializedăŽĺŻč˝ć§ăăăăžăă
ăă§ăŤintrinsics::assume(foo)
ă¨assert!(foo)
ăäťăăŚäťŽĺŽă¨ă˘ăľăźăˇă§ăłăĺşĺĽăăŚăăăŽă§ăăăăăassume_initialized
ďź
assume
ăŻä¸ĺŽĺŽăŞAPIă§ăăăassumeă¨assertăŽĺŽĺŽăăäžăŻunreachable_unchecked
vs unreachable
ă¨get_unchecked
vs get
ă§ăă ă§ăăăă unchecked
ăćŁăăç¨čŞă ă¨ćăăžăă
foo_unchecked
ăŻă寞ĺżăăfoo
ăăăĺ ´ĺăŤăŽăżćĺłăăăăžăăăăă§ăŞăĺ ´ĺăé˘ć°ăŽç´ç˛ăŞć§čłŞăŻunsafe
ăăăăç°ăŞăăä˝ăă辡ăăŁăŚăăăă¨ă示ăăžăăăŞăłă
ăăŽčŞčť˘čťĺ°ĺąăŻćăăăŤééăŁăč˛ă§ă
ăăŽçšĺŽăŽAPIă使ç¨ăăă¨ăăăă°ăŠăăźăŻăćĺłăăăăăăĺźăłĺşăăŽăŻUBă§ăăăă§ăŻăŞăăăĺćĺăăăŚăăŞăăăźăżăŻăŹăăźă¸ă§ăăăăăä¸ćł¨ćăŤĺŚçăăă¨UBăçşçăăĺŻč˝ć§ăăăăăăă§ăăă¨ăăă°ăŠăăźăćłĺŽăăŚăăăă¨ă確čŞăçśăăžăăĺćĺăăăŚăăŞăăăźăżăćéăă unchecked
ăăăŞăťăźééăăŞăĺéˇăŞâ ď¸ăăăăĺŠăăăăŠăăăŻăăăăžăăăăăăŁă¨ĺ°ćăăďź=äşşă
ăŤčłŞĺăăăăăăĽăĄăłăăčŞăă ăăăĺŻč˝ć§ăéŤăďźă¨ăăĺ´é˘ăŤčޤăăăăăžăé常ăŤć
éăŤďźă
@RalfJung
into_inner
ăŻăăžăăŤăçĄéŞć°ăŞé˘ć°ĺă ă¨ćăăžăă äşşă ăŻăăăăăăăăĽăĄăłăă注ć桹ăčŞăžăŞăăŚăăMaybeUninit::uninitialized().into_inner()
ăžăă ĺĺăwas_initialized_unchecked
ăăăŞĺĺăŤĺ¤ć´ăăŚăăăźăżăĺćĺăăăĺžăŤăŽăżăăăĺźăłĺşăĺż čŚăăăăă¨ă示ăăă¨ăŻă§ăăžăăďź
ç§ăŻ_ćŹĺ˝ăŤ_ăăŽă˘ă¤ăă˘ă弽ăă§ăă ăťăăłăăŁăŻăšăŤă¤ăăŚćŁăăăă¨ăč¨ăŁăŚăăăă¨ă¨ăăăăŻć˝ĺ¨çăŤĺąéşă§ăăă¨ĺźˇăćăăŚăăžăă
@rkruppe
ĺćĺăăĺż čŚăăăăă¨ă埡調ăăăă¨ă¨ăăăăčĄăăă¨ăŽčŞŹćďźunwrap / into_inner /etcăďźăŽä¸Ąćšă1ă¤ăŽĺĺăŤĺ Ľăăă¨ăăăŞăćąăăŤăăăŞăăŽă§ăĺč ă
assert_initialized
ă§ĺŽčĄăăĺžč ăćŽăăŽăŻăŠăă§ăăăăă署ĺăŤăăŁăŚć示ăăăžăăďźassert!()
ăăăŤăŠăłăżă¤ă ăă§ăăŻăć示ăăăă¨ăéżăăăăăŤăĺŻč˝ăŞunchecked_assert_initialized
ă
ç§ăŻĺąéşăŞăăŽăŽćąăăŤăăéˇăăĺ°ťăŽĺĺăŤă¤ăăŚăŻä˝ăŽĺżé
ăăăăžăăă ăăăăăĺ¤ăăŽäşşă
ăŤäşĺşŚčăăăăăŞăă was_initialized_into_inner_unchecked
ăăç§ăŤăŻăžăŁăăĺéĄăăăžăăă ĺŽĺ
¨ă§ăŞăăłăźăăć¸ăăă¨ăďźççąăŽçŻĺ˛ĺ
ă§ďźéäşşéçăŤăăăă¨ăŻćŠč˝ă§ăăăăă°ă§ăŻăăăžăă;ďź
大ĺ¤ć°ăŽäşşăä˝ăăăŽĺ˝˘ăŽăŞăźăăłăłăăŞăźăăĺăăIDEă使ç¨ăăŚăăĺŻč˝ć§ăéŤăăăăéˇăĺĺăŻăă¤ăăźăŞăăźăăăłăă§ăăăă¨ăĺżăăŞăă§ăă ăăă
ăăŽé˘ć°ă使ç¨ăăäşşé塼ĺŚăŻçšăŤć°ăŤăăžăăăăçšĺŽăŽăă¤ăłăăéăăă¨ăĺĺăŻčŞăăŽă§ăŻăŞăăšăăăłă°ăăăĺžĺăăăă¨ćăăžăăăăŽĺĺăŻăä˝ă辡ăăŁăŚăăăŽăăç解ăăăăăŤĺŽéăŤčŞăĺż čŚăăăăžăă ăăăŤăăăŽé˘ć°ăŻĺŽéăŤä˝żç¨ăăăăŽă¨ăťăźĺăé ťĺşŚă§čŞŹć/誏ćăăăă¨ćăăžăďźćŻčźçăăăă§é常ăŤĺžŽĺŚăŞăŽă§ďźăă˝ăźăšăłăźăăŤéˇăčĺĽĺăĺ ĽĺăăŚăĺéĄăăăžăăăďźIDEăŽăăăă§ďźăăăŁăăăˇăšăă ăŽăĄă˘ăŞăŻ...ăăžăčŻăăăăžăăďźç§ăŻăăŽçšăŤă¤ăăŚĺĺĺčŤăč¨ăŁăŚăăžăăăĺĺă ăă§ăďźă
@shepmasterăăĄăăă§ăă ăŞăźăăłăłăăŞăźăäťăăŽIDEă使ç¨ăăŚăăžăă ăăăă unsafe
ăăăăŻĺ
ăĺŤăăĺ
é¨ăŤunchecked
ăĺŤăžăăéˇăĺĺă使ç¨ăăă¨ăĺ°ăŞăă¨ăĺ°ăäźć˘ăăăă¨ăŤăŞăăžăă
@rkruppe
ăăŁăăăˇăšăă ăŽăĄă˘ăŞăăăăăăĺ ĽĺăăăŽăŻ...ăăžăčŻăăăăžăăďźç§ăŻăăŽçšăŤă¤ăăŚĺĺĺčŤăč¨ăŁăŚăăžăăăĺĺă ăă§ăďźă
ç§ăŻăăŽăăŹăźăăŞăăčĄăăžăă ĺĺăĺ°ăçšĺĽăŞĺ ´ĺăŻăăăăăăăŤćăĺşćˇąăăăŽăŤăăăă¨ăă§ăăžăă ;ďź
ăăăăďźăžăăŻĺăćĺłçĺŤćăĺŤăéĄäźźăŽĺĺďźďź
was_initialized_unchecked
was_initialized_into_inner_unchecked
is_initialized_unchecked
is_initialized_into_inner_unchecked
was_init_unchecked
was_init_into_inner_unchecked
is_init_unchecked
is_init_into_inner_unchecked
assume_initialized_unchecked
assume_init_unchecked
ç§ăŻĺ ć°ă§ăă
initialized_into_inner
ăŠăă§ăăďź ăžăăŻinitialized_into_inner_unchecked
ăăăŞăăăăăă¨ăćăă°unchecked
ç§ăăăăă¨ă@shepmasterăŤĺćăăĺžĺăăăăăŽăŽăĺŽéăŤăŻĺż
čŚă§ăăunchecked
ĺăăŽăăă¤ăăŽäťăŽ_checked_ĺ¤ç¨ŽăăĺşĺĽăăăă¨ăĺż
čŚăŞă ăă§ăăŠăłăżă¤ă ăă§ăăŻăčĄăăăŚăăŞăćŠč˝ă
čŞĺˇąĺç¨ă¸ă§ăăŹăźăżăptr::drop_in_place(maybe_uninit.as_mut_ptr())
č¤ć°ĺ使ç¨ăăăă¨ăŤăŞăăžăăăăăăăŻMaybeUninit
ĺşćăŽăĄă˝ăăunsafe fn drop_in_place(&mut self)
ă¨ăăŚăăžăćŠč˝ăăăăă§ăă
ManuallyDrop::drop
ĺäžăăăăžăă
foo_uncheckedăŻă寞ĺżăăfooăăăĺ ´ĺăŤăŽăżćĺłăăăă¨ćăăžăăăăă§ăŞăĺ ´ĺăé˘ć°ăĺŽĺ ¨ă§ăŞăă¨ăăć§čłŞăŻăä˝ăăç°ăŞăăăă¨ă辡ăăŁăŚăăăă¨ă示ăăžăă
ĺŽĺ ¨ăŞăăźă¸ă§ăłăăŞăăă¨ăăĺŽĺ ¨ă§ăŞăăăźă¸ă§ăłăăčŚĺăľă¤ăłăĺé¤ăăćŁĺ˝ăŞççąă§ăŻăŞăă¨ćăăžăă
ĺŽĺ ¨ă§ăŞăăăźă¸ă§ăłăăčŚĺăľă¤ăłăĺé¤ăăžă
ĺ°ăĺć˛çˇăŞăŽă§ă unsafe
é˘ć°ăŽćĺžăŤ_unchecked
ăšăżăăŻăăŞăăăăŤăăĺż
čŚăăăăŽăŻăă¤ă§ăăďź ĺăăă¨ăč¨ă2ă¤ăŽčŚĺăăăăă¨ăŽćĺłăŻä˝ă§ăăďź
ăăăŻĺ
ŹćŁăŞčłŞĺă§ăă :)ăăăăçăăŻăăťă¨ăăŠăŞăăă¨ćăăžăăĺŽéăăă¤ăłăżăŽĺŽĺ
¨ă§ăŞăé˘ć°ă¨ăăŚoffset
ăăăăăăĺŽĺ
¨ă§ăŞăăă¨ă襨ăăăŽă§ăŻăŞăăă¨ăćŽĺżľăŤćăăžăă ćĺéăunchecked
ă§ăăĺż
čŚăŻăăăžăăăăIMOăŤăŻä˝ăăăăăŻă.offset
ăŽäťŁăăăŤ.wrapping_offset
ăç§ăŻç§ăăăă¤ăăăŻăŞăăŁăăă¨ăăłăłăă¤ăŠăŤç´ćăăžăăă
ĺŽĺ ¨ă§ăŞăăă¨ăćąşăăŚčĄ¨çžăăŞăăă¤ăłăżăŽĺŽĺ ¨ă§ăŞăé˘ć°ă¨ăăŚ
ăăăŻăăăŽćŽľéă§ăŽç§ăŽé˘ç˝ăăčŚç´ăăŚăăžăă
@shepmasterăŞăŽă§ă誰ăăć˘ĺăŽunsafe
ăăăăŻĺ
ăŽăłăźăă硨éăăăŽăŻçžĺŽçă§ăŻăŞăă¨ćăăžăďźăăăă大ăăŞăăăăŻăăăăăćéťçăŤunsafe
ćă¤ĺ¤§ăăŞunsafe fn
ĺ
ďź unsafe
ăăăăŻďźăăăăŚĺ˝źăăčż˝ĺ ăăŚăăĺźăłĺşăăunsafe
ăă¨ăŤć°ăĽăăŚăăžăăăďź
誰ăăć˘ĺăŽ
unsafe
ăăăăŻĺ ăŽăłăźăă硨éăăžă[...]ăăăŚĺ˝źăăčż˝ĺ ăăŚăăĺźăłĺşăăunsafe
ăă¨ăŤć°ăĽăăŚăăžăă
çłă訳ăăăžăăăăç§ăŻăăŽĺŻč˝ć§ăĺ´ä¸ăăă¤ăăăŻăăăžăăă§ăăăăăăŚăăăŻćŹĺ˝ăŽăăă§ăă ç§ăŽćčŚă§ăŻăć˘ĺăŽunsafe
俎飞ĺăŻĺ˝šăŤçŤăăŞăăă¨ă示ăă¨ăăă桹ĺťăŞé厳ă示ă
ä¸ä˝äşćć§ăŽăăćšćłă§äżŽćŁă§ăăŞăăŽăŻĺ¤ąćăăăăăžăăăĺĺăŤĺčŞăčż˝ĺ ăăăă¨ăĺŻä¸ăŽĺŻč˝ăŞč§Łćąşçă§ăăăăăă§ăŻăŞăăă¨ăéĄăŁăŚăăžăă
ĺ¤ĺ大ăăŞăăŽăĺ¤ĺ
unsafe
ăăăăŻăćéťçăŤćăŁăŚăă大ăăŞunsafe fn
ä¸ăŤ
ć°çžčĄăŽé˘ć°ăăăĺ ´ĺăăˇăŁăăŚă¤ăłă°ăŻćăăăŤćŞăčăă§ăăăăăRustă§ĺ¤ć°ăăˇăŁăăŚă¤ăłă°ă§ăăççąăĺ°ăăăăžăăă ç§ăŻĺäşşçăŤăăŽăăăŞăąăźăšăé常ăŤĺŚĺŽăăŚăăžăăăŞăăŞăăăăŽăăăŞăłăźăăŻăăăăćŞă形ĺźă¨ăăŚä¸čŹăŤĺăĺ ĽăăăăŚăăă¨äżĄăăŚăăăăă§ăă
ăăŚăRustăŽăăĺ´é˘ăĺŽĺ ¨ă§ăŞăăăăăŻăăĺż čŚăăăă大ăăăăăă¨ă埡ĺśăăĺ ´ĺăăăăŻăăăăăăć šćŹçăŞĺéĄă示ăăŚăăžăă
ä˝čŤă§ăăăIDE + RLSăŻăĺŽĺ
¨ă§ăŞăă¨ăăźăŻăăăćŠč˝ăčĺĽăăăăăăçšĺĽăŤĺźˇčŞżčĄ¨ç¤şă§ăăăŽă§ăŻăŞăăă¨ćăăžăă ăă¨ăă°ăç§ăŽçˇ¨éč
ăŻăă§ăŤunsafe
ăăźăŻăźăă埡調襨示ăăŚăăžăă
ăăŚăRustăŽăăĺ´é˘ăĺŽĺ ¨ă§ăŞăăăăăŻăăĺż čŚăăăă大ăăăăăă¨ă埡ĺśăăĺ ´ĺăăăăŻăăăăăăć šćŹçăŞĺéĄă示ăăŚăăžăă
https://github.com/rust-lang/rfcs/pull/2585ăăăăžă;ďź
ä˝čŤă§ăăăIDE + RLSăŻăĺŽĺ ¨ă§ăŞăă¨ăăźăŻăăăćŠč˝ăčĺĽăăăăăăçšĺĽăŤĺźˇčŞżčĄ¨ç¤şă§ăăăŽă§ăŻăŞăăă¨ćăăžăă
ăăăŻç´ ć´ăăăăă¨ă§ăďź ăă ăăăăšăŚăŽäşşăIDEă§ăłăźăăčŞăżĺăă ăă§ăŻăăăžăăăă¤ăžăăăŹăăĽăźăŻé常IDEă§čĄăăăăăă§ăŻăăăžăăă
ăăŚăRustăŽăăĺ´é˘ăĺŽĺ ¨ă§ăŞăăăăăŻăăĺż čŚăăăă大ăăăăăă¨ă埡ĺśăăĺ ´ĺăăăăŻăăăăăăć šćŹçăŞĺéĄă示ăăŚăăžăă
ăă§ăźăłĺ
ăŽĺŽĺ
¨ă§ăŞăăĄă˝ăăăŻăăă大ăăŞäžăŽ1ă¤ă ă¨ćăăžăăéä¸ă§ăĄă˝ăăălet
ĺĺ˛ăăăă¨ăŻăăăŞăéäşşéçă§ăăăăăăăŞăéăăăă§ăźăłĺ
¨ä˝ăăŤăăźăăăžăă
ĺŽĺ ¨ăŤăĺăă§ăŻăăăžăăăăééăăŞăăĺćŠäťăăă§ăă
l rust-lang / rfcsďź2585ăăăăžă;ďź
ăăăă§ăĺŽéăŤăŻăăŞăăŽăąăźăšăŤă彚çŤăăŞăăŽă§ăç§ăŻăăăŤă¤ăăŚč¨ĺăăžăăă§ăăă äşşă
ăŻăă¤ă§ăďźăłăĄăłăă§č¨ĺăăăŚăăăăăŤďźĺ
¨čşŤăŽĺ¨ăăŤunsafe
ăăăăŻăčż˝ĺ ăăă ăă§ăĺăĺéĄăŤăăăŤćťăăžăăĺŽĺ
¨ă§ăŞăé˘ć°ăăĺżăłčžźăżăăĺźăłĺşăăžăă
ăăăă誰ăăIDEă§ăłăźăăčŞăă ăă§ăŻăăăžăă
ăăăăăăç§ăăăăčăŤç˝Žăăççąă§ăă ăăŁă¨ăŻăŁăăč¨ăŁăŚăăăšăă ăŁăă¨ćăăžăă
ç§ăŽĺéĄăŻăäşĺŽä¸ăăăŞăăăăăćŻćăăŚăăă¨ăăăă¨ă ă¨ćăăžăă
unsafe fn unsafe_real_name_of_function() { ... }
^~~~~~ for humans
^~~~~~ for the compiler
ăăăŤăăăăłăźăăčŞăżĺăă¨ăăŤăĺŽĺ ¨ă§ăŞăăăšăŚăŽé˘ć°ăć確ăŤç˘şčŞă§ăăžăă çš°ăčżăăŻç§ă大ăăŤčçŤăăăä˝ăăćéŠă§ăŻăŞă
ăăăŤăăăăłăźăăčŞăżĺăă¨ăăŤăĺŽĺ ¨ă§ăŞăăăšăŚăŽé˘ć°ăć確ăŤç˘şčŞă§ăăžăă çš°ăčżăăŻç§ă大ăăŤčçŤăăăä˝ăăćéŠă§ăŻăŞăăă¨ă示ăăžăă
ăăăăžăă ăăŽçš°ăčżăăŻăăłăłăă¤ăŠă2ă¤ăŽçŽăćäžăă4ă¤ăŽçŽăŽĺĺăĺŽčŁ ăăŚăăă¨čŚăŞăăă¨ăă§ăăžăă ;ďź
@shepmasterăăăŻĺ°ăčťéăŤäšăŁăŚăăŞăăăă§ăăăIMOăŽĺ
ăŽăă¤ăłăăŻăăăŽăĄă˝ăăăŽä¸ĺ¤ćĄäťśăä˝ă§ăăăăć確ă§ăŞăăă¨ă§ăăă¤ăžăă unsafe
ăłăźăăĺŽéăŤUBă§ăŻ
ăăă§ăăŻăŞăăăćĺăŽé¸ćč˘ă§ăŻăŞăăă¨ăŤĺćăăžăăăăä¸ĺ¤ćĄäťśăŤç°ĄĺăŤéĺăăăă¨ăăĺäžăăăăžăă
ăăăŤăăă initialized_or_ub
沿ăŁăĺ˝ĺčŚĺăăăă°ăăăŽăŤă¨ćăăžăă
ăăăŻĺ°ăčťéăăĺ¤ăăŚăăă¨ćăăžă
ç§ăŻčŞĺă§ăăč¨ăă¨ăăă ăŁăă ç§ăŻčŞĺăŽä˝ĺăč¨ăŁăăŽă§ďźăăăŚćăăăŤčŞ°ăç§ăŤĺćăăžăăďźăăăăĺăŤăăžăă ăăŞăăćăăăŽăŻä˝ă§ăé¸ăă§ăă ăăă
initialized_or_ub
沿ăŁăĺ˝ĺčŚĺăăăăžăă
maybe_uninit(ialized)
ăăăŞćĺłă§ăăďź ăŠăăăăăăăé˘éŁăăăĄă˝ăăăŽăťăăăŤĺşăéŠç¨ă§ăăăăŽăŻăăăžăăďź đ
ăăăăç§ăŻunwrap_or_else
ăăăŞćĺłă§ă-ăĄă˝ăăĺăŤăä¸ĺš¸ăŞăąăźăšăă§ä˝ă辡ăăăăĺ
Ľăăžăă
@eddybăăăăăăťăŠćŞăăŻăŞă... .initialized_or_unsound
ĺ¤ĺďź
ä¸čŹăŤăčĺĽĺĺăŤĺć
ĺ ąăčż˝ĺ ăăăă¨ăŻă˘ăłăăăżăźăłă¨čŚăŞăăăžăďźăă¨ăă°ă foo_i32
ă bar_mutex
ă baz_iterator
ďźă
é˘ć°ăŤé˘ăăŚăŻă unsafe
ăŻfn
ăżă¤ăăŽä¸é¨ă§ăăă _unchecked
ă _unsafe
ă _you_better_know_what_you_are_doing
čż˝ĺ ăăă¨ăăŞăä¸čŹçă§ăă
ăŞăăăăŞăŽăăăďź
ăžăăĺčăžă§ăŤă rust-analyzer
ăé˘ć°ăunsafe
ăăŠăăăćăăăŤăăĺéĄďźhttps://github.com/rust-analyzer/rust-analyzer/issues/190ďźăăăăžăă 硨éč
ă¨IDEăŻă unsafe
ăăăăŻĺ
ă§unsafe
ăĺż
čŚă¨ăăćä˝ă埡調ă§ăăĺż
čŚăăăăžăăăăăŤăŻă unsafe
é˘ć°ăŽĺźăłĺşăă ăă§ăŞăă揥ăŽăăăŞčĺĽĺăćĽĺ°žčžă¨ăăŚäťăăŚăăăăŠăăăŻé˘äżăăăžăăăăă¨ăă°ă _unchecked
ăăŠăăďźă ăă§ăŞăăçăŽăă¤ăłăżăŽéĺç
§ăŞăŠăčĄăăžăă
ééăăŞăă rust-analyzer
ăŻăžă ăăăčĄăăă¨ăă§ăăžăăďźçˇ¨éďźintellij-RustăŽç¨ŽéĄăŽçźśďźhttpsďź//github.com/intellij-rust/intellij-rust/issues/3013#issuecomment-440442306ďźăăăăăunsafe
ăăăăŻĺ
ă§ĺźăłĺşăăŤăŻă unsafe
ăĺż
čŚă§ăăăă¨ăć確ăŤăăăă¨ăçŽçă¨ăăŚăăžăăć§ćăŽĺźˇčŞżčĄ¨ç¤şăŻăăăăŤä˝ăăäťăă䝣ăăăŤä˝żç¨ă§ăăĺŻč˝ć§ăăăăžăă ă¤ăžăăäťăăăăăćŹĺ˝ăŤĺż
čŚăŞĺ ´ĺăŻăăăŽé˘ć°ăŽĺĺăăăăźăŻăźăăă¨ăăŚć°ĺă§ć§ćăă¤ăŠă¤ăăŤčż˝ĺ ăă1ćĽă§ĺźăłĺşăăă¨ăă§ăăžăă
@gnzlbg
ä¸čŹăŤăčĺĽĺĺăŤĺć ĺ ąăčż˝ĺ ăăăă¨ăŻă˘ăłăăăżăźăłă¨čŚăŞăăăžăďźăă¨ăă°ă
foo_i32
ăbar_mutex
ăbaz_iterator
ďźă
確ăăŤăăăłăŹăŞă˘ăłč¨ćłăŻä¸čŹçăŤă˘ăłăăăżăźăłă¨čŚăŞăăăžăă ĺćăăžăă ăăăăä¸čŹçăŤăăăăăŽč°čŤă§ăŻĺŽĺ ¨ć§ăŻčć ŽăăăŚăăăăUBăć示ăăĺąéşć§ăčăăă¨ăăăă§äžĺ¤ăč¨ăăćŁĺ˝ăŞççąăăăă¨ćăăžăă
é˘ć°ăŤé˘ăăŚăŻă
unsafe
ăŻfn
ăżă¤ăăŽä¸é¨ă§ăăă_unchecked
ă_unsafe
ă_you_better_know_what_you_are_doing
čż˝ĺ ăăă¨ăăŞăä¸čŹçă§ăăăŞăăăăŞăŽăăăďź
ç°ĄĺăŤč¨ăă°ăĺŽĺ ¨ă§ăŻăăăžăăă ĺŽĺ ¨ć§ăćăŞăăăŚăăĺ ´ĺăĺéˇć§ăŻăăŞăăŽĺäşşă§ăă ăăăŻăăłăźăă¨ăťăźăăăŁăŻăŞăăŁăŤăŤăŞăăźăăŚă§ă˘ăŞăŠăŽä¸ĄćšăŤĺ˝ăŚăŻăžăăžăă
ăžăăĺčăžă§ăŤă
rust-analyzer
ăé˘ć°ăunsafe
ăăŠăăăćăăăŤăăĺéĄďź rust-analyzer / rust-analyzerďź190 ďźăăăăžăă 硨éč ă¨IDEăŻăunsafe
ăăăăŻĺ ă§unsafe
ăĺż čŚă¨ăăćä˝ă埡調ă§ăăĺż čŚăăăăžăăăăăŤăŻăunsafe
é˘ć°ăŽĺźăłĺşăă ăă§ăŞăă揥ăŽăăăŞčĺĽĺăćĽĺ°žčžă¨ăăŚäťăăŚăăăăŠăăăŻé˘äżăăăžăăăăă¨ăă°ă_unchecked
ăăŠăăďźă ăă§ăŞăăçăŽăă¤ăłăżăŽéĺç §ăŞăŠăčĄăăžăăééăăŞăă
rust-analyzer
ăŻăžă ăăăčĄăăă¨ăă§ăăžăăăăunsafe
ăăăăŻĺ ă§ăăăĺźăłĺşăăŤăŻunsafe
ăĺż čŚă§ăăăă¨ăć確ăŤăăăă¨ăçŽçăŽĺ ´ĺăć§ćăŽĺźˇčŞżčĄ¨ç¤şăŻćĽĺ°žčžăŽäťŁăăăŤăŞăăžăăăăăŻä˝ă§ăă
ăăăŻăăšăŚăăŞăç´ ć´ăăăă§ăă ăă ăă @ RalfJungăććăăăăăŤă ăăăšăŚăŽäşşăIDEă§ăłăźăăčŞăżĺăă ăă§ăŻăăăžăăăă¤ăžăăăŹăăĽăźăŻé常IDEă§čĄăăăăăă§ăŻăăăžăăăă ĺźăłĺşăăăé˘ć°/ćä˝ăĺŽĺ ¨ă§ăŞăăăŠăăă示ăăăăŤăGitHubăUIăŤrust-analyzerăĺăčžźăĺŻč˝ć§ăŻä˝ăă¨ćăăžăă
ăăŹăźăăŞăăéăăă¨ă¨unsafe
誤ăŁăďźăăăăŁăŚä¸ĺĽĺ
¨ăŞďźä˝żç¨ăŤăŞăăăĄăŞăă¨ăŽéă§ăăĺ ´ĺăç§ăăĄăŻĺ¸¸ăŤĺč
ă弽ăăšăă ă¨ćăăžăă ăăă°ăŠăăźăä¸ćĺć˘ăăŚăăĺž
ăŁăŚăç§ăŻăăăćŁăăăăŁăŚăăăŽăăă¨čăăăăăŤăăăă¨ăŤă¤ăăŚăŻăĺ¤ăăŽăă¨ăč¨ăăžăă
ăă¨ăă°ăMundaneă§ĺŽĺ ¨ă§ăŞăćĺˇĺćä˝ă使ç¨ăăĺ ´ĺăŻă揥ăŽăă¨ăčĄăĺż čŚăăăăžăă
insecure
ă˘ă¸ăĽăźăŤăăă¤ăłăăźăăăžăallow(deprecated)
ăć¸ăčžźăăăăăŽćä˝ă使ç¨ăăăăłăŤçşčĄăăăăłăłăă¤ăŠčŚĺăăăŽăžăžä˝żç¨ăăžălet mut hash = InsecureSha1::default(); hash.insecure_write(bytes); ...
ăăăŞăłăźăăć¸ăăăăŻăăšăŚăăă§ăă芳細ăŤćć¸ĺ
95ďź
ăăăŽăżă¤ăăŽčޤç¨ăĺżé
ăăŚăăă5ďź
ă ăăéˇăĺĺăĺżé
ăăŚăăăŽă§ăăżă¤ăăŽĺĺăMaybeUninitialized
ĺ¤ć´ăăăă¨ăăĺ§ăăžăăăă ä˝ĺăŞ7ćĺăŻăăă ăăŽäžĄĺ¤ăăăăžăă
ĺĺăMaybeUninitializedOrUndefinedBehavior
ăăŚăă¨ăłăăŚăźăśăźăŤĺŽéăŤă˘ăăźăŤăăžăă
ăăŽăżă¤ăăé¸ćăăŚăĄă˝ăăăćăăăăăšăŚăé˘éŁäťăăăăé˘ć°ăŤăăăă¨ăă§ăăĺż čŚăŤĺżăăŚăăăšăŚăŽé˘ć°ĺźăłĺşăăŽăă¤ăłăă埡ĺăăžăă
MaybeUninitializedOrUndefinedBehavior::into_inner(value)
MaybeUninitializedOrUndefinedBehaviorReadTheDocsAllOfThemYesThisMeansYou
ăăă¨...ćŁç´ăŞă¨ăăăăżă¤ăăŤMaybeUninitializedOrUndefinedBehavior
ăăăŞéˇăĺĺăăăăŽăŻăç§ăŤăŻčŚĺ˝éăăŽăăă§ăă éŠĺăŞĺĺăĺż
čŚăŞăŽăŻćä˝.into_inner()
ă§ăăăăăŻăĺéĄăçşçăăĺŻč˝ć§ăŽăăăăăă§ăăăçšĺĽăŞćł¨ćăĺż
čŚăŞăăă§ăă ăĄă˝ăăăăŞăăŽăŻčŻăčăăăăăăžăăă MaybeUninit::initialized_or_undefined(foo)
ăŻăăŞăć確ăŤčŚăăžăă
IMOăŻăăăŽăăăŤĺŽĺ ¨ă§ăŞăćä˝ăéäşşéçăŞăăŽăŤăăăăăŤéŞéăăăăšăă§ăŻăăăžăăă äşşé塼ĺŚăŤĺşăĽăăĺĺă¨ăĺŽĺ ¨ă§ăŞăćŁăăăłăźăăć¸ăćšćłăĺż čŚă§ăă é庌ăŤéˇăĺĺă¨ä¸ć確ăŞăŚăźăăŁăŞăăŁă¨ĺ¤ćă§ăăăäšąéăŤăăă¨ăăŚăźăśăźăćŁăăĺŽĺ ¨ă§ăŞăăłăźăăć¸ăăă¨ăćăă¨ăŠăžăăăĺŽĺ ¨ă§ăŞăăłăźăăčŞăżăć¤č¨źăăăŽăéŁăăăŞăăžăă
大ĺ¤ć°ăŽäşşăä˝ăăăŽĺ˝˘ăŽăŞăźăăłăłăăŞăźăăĺăăIDEă使ç¨ăăŚăăĺŻč˝ć§ăéŤăăăăéˇăĺĺăŻăă¤ăăźăŞăăźăăăłăă§ăăăă¨ăĺżăăŞăă§ăă ăăă
RLSăăăćŠč˝ăăăžă§ăŻăĺ°ăŞăă¨ăç§ăŤăŻĺ˝ăŚăŻăžăăžăăă
ç§ăăĄăŽăťă¨ăăŠăŻăăăŤĺćăă
ăăăăăăăăĺĺăčŻă
äşşé塼ĺŚăŤĺşăĽăăŚăăŞăĺĺăŻćŞă
ăăăŚĺéĄăŻăăăăăçˇĺźľăăŚăăă¨ăăŤçŠäşă解湺ăăćšćłăŤă¤ăăŚă§ăă
ăăă§ăăçšăŤinto_inner
ăŻăăăŽćšćłăŽćŞăĺĺă ă¨ćăăžăďźć´žćăŞç¨čŞă使ç¨ăăăăăŤăăăŹăźăăăăłăăŁă˘ăŤăŻăăăžăăďźă ä¸čŹçăŞčŚĺă§ăŻăćă
ăćăŁăŚăăă¨ăăăă¨ă§ăinto_inner
ă¨ăFoo<T>
ćŁç˘şăŤä¸ă¤ĺŤăžăăŚăăT
ăăăăŚăăŞăăăăăĺĺžăăăă§ăă ăăăăăăăŻMaybeUninit<T>
ăŻĺ˝ăŚăŻăžăăžăăă ăăăŤăŻă 0ĺăžăăŻ1ĺăŽT
ăĺŤăžăăžăă
ăăăăŁăŚăĺ°ăŞăă¨ăăăăăťăŠćŞăăŞăăŞăăˇă§ăłăŻăăăăunwrap
ăăžăăŻăăăăunwrap_unchecked
ă¨ĺźăśăă¨ă§ăă
ăžăă from_initialized
ăžăăŻfrom_initialized_unchecked
ăŻĺéĄăŞăă¨ćăăžăăăé常ăéçăĄă˝ăăăŽĺĺăŤăŻăfromăă襨示ăăăžăă
ăăśăunwrap_initialized_unchecked
ăŻĺ¤§ä¸ĺ¤Ťă§ăăăăďź
ăăăĺźăłĺşătake_initialized
ă¨ăăä˝ă&mut self
ăŽäťŁăăăŤself
ă ăăŽĺĺăŻăĺ
é¨ĺ¤ăĺćĺăăăăă¨ăćĺž
ăăŚăăăă¨ăć確ăŤăăŚăăžăă MaybeUninit
ă unsafe
ăŽăłăłăăăšăă§ăŻă Option
/ Result
čżăăăŞăă¨ăăäşĺŽăăăăăăŽćä˝ăăŞăăŤăŞăŁăŚăăăă¨ăăăăăžăă
&mut self
ĺăă¨ăăťăăłăăŁăăŻăŤMaybeUninit
ăă秝ĺăăăăŠăăăčŚĺ¤ąăăăăăŞăăăăăŹăłăŽăăăŤčŚăăžăă
ĺĽĺďź into
ă¨ăăĺĺăŽăĄă˝ăăăćĺłăăăăăŤăĺŽéăŤăŻćć樊ă秝ĺăăŚăăăŽă§ăăăăăinto_initialized_unchecked
ďź
ďźmutčŞĺˇąăĺăăă¨ăŻăMaybeUninităăćĺłçăŤç§ťĺăăăăŠăăăčŚĺ¤ąăăă¨ă厚ââćăŤăăăăăăŹăłăŽăăăŤčŚăăžăă
ăăăŻčŚćąăăăćšćłă§ă
ăăăŚăĺăăăăŽă¨ćśč˛ťăăăăŽăŽä¸Ąćšăćă¤äžĄĺ¤ăŻăŞăăăă§ăă
ç§ăŻtake_initialized
ăăžăăŻăăć示çăŞăăŞă˘ăłătake_initialized_unchecked
弽ăă§ăă
ăżă¤ăăŽĺĺăMaybeUninitializedăŤĺ¤ć´ăăăă¨ăăĺ§ăăžăăă
PRăŽćşĺăăăŚăăäşşăŻăăžăăďź
PRăćşĺăăăăăŤďź
ç§ăŻăăăććĄăăăŽă§ăç§ăŻç§ăŽç´ ć´ăăăsed
ăšăăŤă使ăăă¨ăă§ăăžă;-)
into_inner
ăĄă˝ăăăăĺćĺăăăŚăăăă¨ăĺćă¨ăăŚăăăă¨ă埡調ăăăăŽă¨ĺźăśăŽăŻćšĺă ă¨ćăăžăăă unchecked
ăŽčż˝ĺ ăŻä¸čŚă§ĺ˝šăŤçŤăăŞăă¨ćăăžăă ĺŽĺ
¨ă§ăŞăé˘ć°ăĺŽĺ
¨ă§ăŞăăă¨ăăŚăźăśăźăŤéçĽăăćšćłăăăăžăăăŚăźăśăźăĺŽĺ
¨ă§ăŞăăăăăŻă§ăŠăăăăŞăă¨ăăłăłăă¤ăŠă¨ăŠăźăçćăăăžăă
硨éďź take_initialized
ăŻčŻăăăă§ă
assume_initialized
ăŠăă§ăăďź ăăŽďź
assume
çľăżčžźăżăŽăăăŤă誤ăŁăŚćłĺŽăăăĺ ´ĺăŻUBă§ăPRăŽćşĺăăăŚăăäşşăŻăăžăăďź
ć°ăŤăăŞăă§ă libsăăźă ăŻăăăăŻäžĄĺ¤ăăŞăă¨ĺ¤ćăăžăăă
T: Copy
ă¨ăăŤMaybeUninit<T>
ăCopy
ăŻăŞăççąăŻăăăžăăďź
@tommităŻă MaybeUninit<T>
ăManuallyDrop<T>
ăŤäžĺăăŚăăăăăăăă°ăŠăăźăŻăć§é ä˝ăăšăłăźăĺ¤ăŽĺ ´ĺăŤĺ
é¨ĺ¤ăĺé¤ăăăăă¨ăäżč¨źăăĺż
čŚăăăăžăă Copy
ĺŽčŁ
ăăŚăăĺ ´ĺăRustăŽć°čŚĺĺ
Ľč
ăŤă¨ăŁăŚăć§é ä˝čŞä˝ăžăăŻăăŽăłăăźăŽăăăăăŽĺ
é¨ĺ¤T
ćŻĺĺé¤ăăăă¨ăčŚăăŚăăăŽăŻéŁăăăăăăăžăăă ăăŽăăăŤăăŚăç§ăăĄăäşćăăŚăăŞăăăăçŽçŤăăŞăăĄă˘ăŞăŞăźăŻăçşçăăĺŻč˝ć§ăăăăžăă
@ luojia65 ManuallyDrop
ă¨MaybeUninit
ăä˝ăăăăăŤé˘äżăŞăă T
čŞä˝ăCopy
ĺ ´ĺăć¨čŤăŽčĄăéŠç¨ăăăăăŠăăăŻăăăăžăăă
ççąăŻăŞăă¨ćăăžăă #[derive(Copy)]
ăčż˝ĺ ăăăă¨ă誰ăčăăŚăăžăă
ăăăŽĺ¤ĺ垎ĺŚăŞĺ´é˘ăŽčŚłĺŻďź
ç§ăăăăăăăă¨äżĄăăŚăăžăMaybeUninit<T>
ăăăšăCopy
ă¨ăT: Copy
ă MaybeUninit<T>
ăăšăă§ăŻăŞăClone
ă¨ăT: Clone
ă¨T
ăŻCopy
ăŻăăăžăăă
ăŻăăç§ăăĄăŻééăăŞăclone
ĺźăłĺşăăă¨ăŻă§ăăžăăă
ç§ăŻăăŽCopy: Clone
ĺżăçśăăŚăăžă...
ç´°ăăăă¨ăăćă
ăŻăĺŽčŁ
ăăăă¨ăă§ăăžăClone for MaybeUninit<T> where T: Copy
čżăăŤĺşăĽăăŚă *self
ă
ăăă§ĺşăŚăăăăšăŚăŽčłŞĺă§ĺéĄăŽčŞŹćăć´ć°ăăăăăŤćĺăĺ°˝ăăăžăăă ç§ăä˝ăăéăăăăŠăăç§ăŤçĽăăăŚăă ăăďź
ManuallyDrop::drop
ăŽăăăĽăĄăłăăŤăŻ
ăăŽé˘ć°ăŻăĺŤăžăăŚăăĺ¤ăŽăăšăăŠăŻăżăĺŽčĄăăăăăăŠăăăăăĺ¤ăŻĺćĺăăăŚăăŞăăăźăżă襨ăăžăă ĺćĺăăăŚăăŞăăăźăżăĺŽéăŤä˝żç¨ăăăŞăăăăŤăăăŽăŻăăăŽăĄă˝ăăăŽăŚăźăśăźćŹĄçŹŹă§ăă
MaybeUninit
ăĺŚçăăăĺćĺăăăŚăăŞăă税éĄă¨ćˇˇĺăăăŞăăăăŤăăăŽčĄ¨çžăćšĺăăćšćłăŤă¤ăăŚăŽććĄăŻăăăžăăďź
ç§ăŽčŚłçšă§ăŻăăăăăManuallyDrop<T>
ăăŻăĺŽĺ
¨ă§ăŻăăăžăăT
ăăăăăćĺšă§ăăT
ăĺ°ăŞăă¨ăăăăžă§ăŽăŹă¤ă˘ăŚăăŽćéŠĺăŻć°ăŽăăăŤ...ă
ăĺ¤ăă/ăçĄĺšăăăăăăďź ĺćĺăăăžăă
FWIWč¨čéŁăăŻďźĺ°ăŞăă¨ăç§ăŤăŻďźć確ă ă¨ćăăžăă
ăŞăă¸ă§ăŻăă2ĺăăăăăăăŞăăă¨ăŻăăĺŽĺ
¨ć§ăăŽĺéĄă§ăă ĺ°ăăŞćć¸ăăăŁăă
ăĺŽĺ
¨ć§ăăĺŽçžŠăăUCGă§ăŻăăăăăăăăăă¤ăăźăŞăłăŻăăĺż
čŚăăăăžăă ăăŞăăŻĺşćĽă
TăŻăćĺšăă§ăăăăă¤ăăźăŞăłăŻăŻăćĺšăă§ăăĺż
čŚăăăăă¨ăčż˝ĺ ăăžăă
ăăăăŽĺŽçžŠăŻăžă ăŠăăŤăć¸ăçăăăăŚăăžăă...ăăăăžăăă ç§
ăăăĽăĄăłăĺ
¨ä˝ă§ăăăăč¨ăćăăăšăă ă¨ăŻćăăŞăă§ăă ăăă
ĺćĺăăăŚăăŞăăăŽăéć¨ĺĽ¨ăŤăăĺăŤăMaybeUninităĺŽĺŽăăăăă¨ăŻă§ăăžăăďź
@RalfJungç§ăŻăăŽĺ ´ćăăăă秝ĺăăăă¨č¨ăă§ăăăă FWIW std::ptr::read
ă§ăĺă税éĄăŽç¨čŞă使ç¨ăăĺż
čŚăăăăžăăăăăă§ăăăžăć確ă§ăŻăăăžăăă
@blussĺşă使ç¨ăăăŚăăăăŽăăăăăčŻăăăŞăă§éć¨ĺĽ¨ăŤăăăšăă§ăŻăăăžăăă
çžĺ¨ăŽăŚăźăśăźăŽăă˝ăŞăĽăźăˇă§ăłă/ă秝čĄăăšăă
éć¨ĺĽ¨ăŽčŚĺăŻćŹĄăŽăăăŤăŞăăžăďźăXăŻéć¨ĺĽ¨ă§ăă䝣ăăăŤYă使ç¨ăăŚăă ăăăă ăăç§é
YăăŞăăXăĺşă使ç¨ăăăŚăăžă...ăăăŞăăäżćăăăă¨ăć¤č¨ăăĺż
čŚăăăăžă
YăŤăŞăăžă§éć¨ĺĽ¨ăŽčŚĺă
ăăă§ăŞăăă°ăç§ăăĄăŻćŹĺ˝ăŤĺĽĺŚăŞăĄăăťăźă¸ăéăă§ăăăă
@cramertj "invalid"ăŻă匼ĺ˝ć§ăŽä¸ĺ¤ćĄäťśăćşăăăŚăăăăăéŠĺăŞé¸ćă§ăŻăăăžăăă
ăĺŽĺ ¨ć§ăăĺŽçžŠăăĺ°ăăŞăăăĽăĄăłăăUCGăŤăăĺ ´ĺăŻăăăăăăăăăă¤ăăźăŞăłăŻăăĺż čŚăăăăžăă TăŻăćĺšăă§ăăăăă¤ăăźăŞăłăŻăŻăćĺšăăŞĺŽçžŠă§ăăĺż čŚăăăăă¨ăčż˝ĺ ă§ăăžăăăăăăăŽĺŽçžŠăŻăžă ăŠăăŤăć¸ăçăăăăŚăăŞăăă...
ä˝ăăĺžăă羜寞ăŤăăăšăă§ăďźD
@RalfJungăťă¨ăăŠăŽďźăťăźăăšăŚăŽďźďźRustăŚăźăśăźăŽăŹăăˇăłăłăŤăćĺšć§ä¸ĺ¤ăăĺŤăžăăŚăăă¨ăŻćăăžăă-ăçĄĺšăŞăăźăżăăĺŁčŞçăŤĺç
§ăăăă¨ăŻč¨ąĺŽšă§ăăă¨ćăăžăďź ManuallyDrop<T>
ăŻăăŻă使ç¨ă§ăăžăăă T
ďźă ăłăłăă¤ăŠăćéŠĺăŤä˝żç¨ăăçšĺŽăŽčĄ¨çžä¸ĺ¤ćĄäťśăçśćăăĺż
čŚăăăă¨č¨ăŁăŚăăçĄĺšăŞăăźăżăĺ°ăŞăăŞăăăă§ăŻăăăžăăă
ăťă¨ăăŠăŽďźăťăźăăšăŚăŽďźďźRustăŚăźăśăźăŽăŹăăˇăłăłăŤă匼ĺ˝ć§ä¸ĺ¤ăăĺŤăžăăŚăăă¨ăŻćăăžăăă
ĺĺăŤĺ Źĺšłă§ăăăăăŽç¨čŞăŻďźăžă ďźĺ Źĺźă§ăŻăăăžăăă ăăăăćçľçăŤăŻăăăŽćŁĺźăŞç¨čŞăé¸ćăăĺż čŚăăăăžăăăăăăă°ăăăŽăăăŞčĄçŞăĺéżăăĺż čŚăăăăžăă ç§ăŽć稿ă§ăŻăăćĺšăŞăăăźăżăŻăĺŽĺ ¨ăă¨ĺźăă§ăăă¨č¨ăăžăăăăćĺšăă¨ĺźăă§ăăăăŽăŤăŻĺĽăŽč¨čăĺż čŚă§ăă
@shepmasterăŻĺ°ăĺăŤć¸ăă
ăŠăăăźăă秝ĺăăŚăĺââćĺăăăŚăăŞăĺ¤ăŤç˝ŽăćăăăĄă˝ăăă彚çŤă¤ă¨ćăăžăă
pub unsafe fn take(&mut self) -> T
ăăăŤă¤ăăŚăŽç§ăŽć大ăŽć¸ĺżľăŻăăăŽăăăŞćŠč˝ă使ç¨ăăă¨ăăłăăźăăăŚăăŞăăăźăżă誤ăŁăŚăłăăźăăăă¨ăé常ăŤç°ĄĺăŤăŞăăă¨ă ă¨ćăăžăă ăăăĺż
čŚăŞĺ ´ĺă maybe_uninit.as_ptr().read()
ăčĄăăŽăŻćŹĺ˝ăŤćŞăă§ăăďź
take
ăăăŞăăŽăinto_inner
ăăăŞăăŽăŤç˝Žăćăăăă¨ăăŠăăă§ććĄăăăăăăăžăăă ăăăŻăăčŻăčăă§ăŻăŞăă¨ćăăžăăăťă¨ăăŠăŽĺ ´ĺă into_inner
self
ćśč˛ťăăă¨ăăčż˝ĺ ăŽĺśéăŻĺŽéăŤĺ˝šçŤăĄăžăă
@RalfJungçľĺąă MaybeUninit
ăăšăŚăŽăĄă˝ăăăŻĺŽĺ
¨ă§ăŻăŞăă as_ptr
äžżĺŠăŞăŠăăăźăŤăăăžăăă ăăăăç§ăŻćĺž
ăăŚtake
䝼ćĽăćăä¸čŹçăŞćä˝ăŽä¸ă¤ă§ăăăă¨ăMaybeUninit
äşĺŽă ăă§Option
ăżă°ăĺ¤é¨ă§çŽĄçăăăŚăăžăă ăăăŻĺ¤ăăŽĺ ´ĺăŤĺ˝šçŤăĄăžăăăă¨ăă°ăăăšăŚăŽčŚç´ ăĺćĺăăăŚăăŞăé
ĺďźăăăˇăĽăăźăăŤăŞăŠďźăŞăŠă§ăă
https://github.com/rust-lang/rust/pull/57045ă§ă MaybeUninit
2ă¤ăŽć°ăăćä˝ăčż˝ĺ ăăăă¨ăććĄăăŚăăžăďź
/// Get a pointer to the first contained values.
pub fn first_ptr(this: &[MaybeUninit<T>]) -> *const T {
this as *const [MaybeUninit<T>] as *const T
}
/// Get a mutable pointer to the first contained values.
pub fn first_mut_ptr(this: &mut [MaybeUninit<T>]) -> *mut T {
this as *mut [MaybeUninit<T>] as *mut T
}
ĺćŠäťăă¨č°čŤăŤă¤ăăŚăŻăăăŽPRăĺç §ăăŚăă ăăă
ĺé¤ăăĺ ´ĺăŻzeroed
ăăă ăă§ç˝ŽăćăăăăăăăŤćăăMaybeUninit::zeroed().into_inner()
ĺăăă¨ăć¸ăăăăŽĺçăŽćšćłă¨ăŞăăžăă ĺŽčłŞçăŞĺ¤ć´ăŻăăăžăăă uninitĺ¤ă使ç¨ăăă¨ă䝣ăăăŤăĺćĺăăăŚăăŞăăăšăŚăŽăăźăżăMaybeUninit
ăžăăŻĺçăŽĺ
ąç¨ä˝ăŽĺ¤ăŤć źç´ăăăăžăžăŤăŞăă¨ăăĺŽéçăŞĺ¤ć´ăăăăžăă
ăăŽăăăFFIă§ĺşă使ç¨ăăăŚăăé˘ć°ă§ăăăăă std::mem::zeroed
ăăăŽăžăžăŤăăŚăăăă¨ăć¤č¨ăăžăă éć¨ĺĽ¨ăŤăŞăă¨ă大ăăŞčŚĺă襨示ăăăžăăăăăŻăĺé¤ăăăăŽă¨ăťăźĺăă§ăăăĺ°ăŞăă¨ăé常ăŤç
ŠăăăăăŽă§ăăăăăŤăăă #[allow(deprecated)]
ć°ăĺ˘ăăäťăŽăăéčŚăŞĺéĄăé ăăăĺŻč˝ć§ăăăăžăă
unsafe
ăăźăŻăăăăłăźăăŽRustăŽă˘ăăŤă¨ăŹă¤ăăŠă¤ăłăć確ăŤăăăăŽćźçżăŻé常ăŤäžżĺŠă§ăăăć°ăăč¨ăćšă使ç¨ăăŚĺăĺŽç¨çăŞĺšćăĺăăŁăšăăăă ăăŽzeroed
ăăăŞĺ¤ć´ăŻéżăăžăăăă ă
ç§ăŽç解@blussďźééăŁăŚăăĺŻč˝ć§ăăăďźă¨ăăăă¨ă§ăăstd::mem:zeroed
ăŽăăăŤĺąéşăŞăăăŤĺçă§ăăstd::mem::uninitialized
ăă¨ĺăăăăŤăăUBăăăăăăă¨ăăăăžăă ăăăăăăăŻăă¤ăé
ĺăĺćĺăăăăăŤä˝żç¨ăăăŚăăă vec![0; N]
ăžăăŻ[0; N]
ă§ĺćĺăăćšăăăă§ăăăăăăŽĺ ´ĺăăăăărustfix
ăŤăźăŤăčż˝ĺ ăăŚĺ¤ć´ăčŞĺĺă§ăăžăăďź ăă ăăăă¤ăé
ĺăžăăŻć´ć°é
ĺăŽĺćĺ䝼ĺ¤ă§ăŻă std::mem::zeroed
使ç¨ăăă¨UBăŤă¤ăŞăăĺŻč˝ć§ăéŤăă¨ç解ăăŚăăžăă
@scottjmaddox std::mem:zeroed
ă§UBăĺźăłĺşăăŽăŻé常ăŤç°Ąĺă§ăăă std::mem::uninitialized
ă¨ăŻç°ăŞăă std::mem:zeroed
ăĺŽĺ
¨ăŤćĺšăŞăżă¤ăăăăă¤ăăăăžăďźăă¨ăă°ăăă¤ăăŁăăżă¤ăăĺ¤ăăŽFFIé˘éŁstruct
săŞăŠďźă ĺ¤ăăŽunsafe
é˘ć°ă¨ĺć§ăŤă zeroed()
ăŻčť˝ă使ç¨ăăĺż
čŚăŻăăăžăăăă uninitialized()
ăťăŠĺéĄăŤăŻăŞăăžăăă ĺŽĺ
¨ć§ăŽçšă§2ă¤ăŽéăŤéăăŻăŞăă MaybeUninit
ăăźă¸ă§ăłăŽćšăćąăăŤăăăăă std::mem:zeroed()
MaybeUninit::zeroed().into_inner()
䝣ăăăŤ
@mjbshaw
std :: mem :: uninitializedă¨ăŻç°ăŞăăstd :: memďźzeroedăĺŽĺ ¨ăŤćĺšă§ăăăżă¤ăăăăă¤ăăăăžăďźăă¨ăă°ăăă¤ăăŁăăżă¤ăă
mem::uninitialized
ăĺŽĺ
¨ăŤĺŽĺ
¨ă§ăăăżă¤ăďźäžďź unit
ďźăăăă°ăăăă¤ăăŁăăăżă¤ăďźäžďź bool
ă &T
ăŞăŠďźăăăăžăă ăďź mem::zeroed
ăćŞĺŽçžŠăŽĺä˝ăĺźăłĺşăĺ ´ĺă
ăăă§ăŻă MaybeUninit
ăĺćĺăăăŚăăŞăăĄă˘ăŞăŤé˘ăăăăŽă§ăăă¨ăă誤解ăăăăăă§ăďźççąăŻăăăăžăďźăĺćĺăăăŚăăŞăăăăăŽĺĺăŤĺŤăžăăŚăăžăďźă
é˛ć˘ăăăă¨ăăŚăăĺąéşăŻă_invalid_ĺ¤ăŤăăšăŚăźăăĺŤăžăăŚăăăăĺćĺăăăŚăăŞăăăăăĺŤăžăăŚăăăăăžăăŻäťăŽä˝ăďźăă¨ăă°ăăăăăăżăźăłăăăŽbool
ăĺŤăžăăŚăăăăŠăăăŤăăăăăă_invalid_ĺ¤ăŽä˝ćăŤăăŁăŚĺźă辡ăăăăĺąéşă§ăă true
ăžăăŻfalse
ďźă§ăŻăŞăăĺŽéăŤăŻĺéĄă§ăŻăăăžăă- mem::zeroed
ă¨mem::uninitialized
ăŠăĄăă_çĄĺšăŞ_ĺ¤ăä˝ćăăăăăŤä˝żç¨ă§ăăăăăç§ăŽčŚłçšăăăăă¨ăăťăźĺăăăăĺąéşă§ăă
OTOH MaybeUninit::zeroed()
ă¨MaybeUninit::uninitialized()
ăŻă union
ăčżăăăă_safe_ăĄă˝ăăă§ăă MaybeUninit::into_inner
ăŻunsafe
ă§ăăă MaybeUninit<T>
ăŽçžĺ¨ăŽăăăăT
_valid_ĺ¤ă襨ăă¨ăăĺććĄäťśăćşăăăăŚăăĺ ´ĺăŤăŽăżăăăăĺźăłĺşăăă¨ăŻ_safe_ă§ăă ăăăăăżăźăłă_invalid_ăŽĺ ´ĺăĺä˝ăŻćŞĺŽçžŠă§ăă ăăšăŚăźăăĺćĺăăăŚăăŞăăăăăăžăăŻăăŽäťăŽăăŽăĺŤăžăăŚăăăăăŤăăăăăżăźăłăçĄĺšă§ăăăăŠăăăŻăĺŽéăŤăŻéčŚă§ăŻăăăžăăă
@RalfJung MaybeUninit
ă¨ăăĺĺăŻĺ°ă誤解ăćăăăăăăŞăă¨ćăĺ§ăăŚăăžăă 解湺ăăĺéĄă¨ĺéżăăĺąéşć§ăăăăăäźăăăăăŤăĺĺăMaybeInvalid
ăŞăŠăŤĺ¤ć´ăăĺż
čŚăăăăăăăăžăăă 硨éďźç§ăbikeshedăŽĺéĄăŤć稿ăă@CentrilăŽććĄăŤĺžăŁăŚăă ăăă
硨éďźFWIWăăźăĺăăăăĄă˘ăŞăĺŽĺ
¨ăŤä˝ćăăăăăŽäşşé塼ĺŚçăŞćšćłďźăă¨ăă°ă MaybeUninit
ăç´ćĽä˝żç¨ăăăŤďźăăăă¨äžżĺŠă ă¨ćăăžăăă mem::zeroed
ăŻăăăžăăă Default
äźźăZeroed
ăăŹă¤ăăčż˝ĺ ă§ăăžăăăăăŻăăăšăŚăźăăŽăăăăăżăźăłăćĺšăŞăżă¤ăăŞăŠăŤăŽăżĺŽčŁ
ăăăĺć§ăŽĺšćăĺŽçžăăćšćłă¨ăăŚä˝żç¨ă§ăăžăă mem::zeroed
ăŻäťăŻăăă§ăăăč˝ă¨ă犴ăŻăăăžăăă
ä¸čŹăŤăçžĺ¨ăŽăŚăźăśăźăăăčŻăă˝ăŞăĽăźăˇă§ăłăŤç§ťčĄăăăăăŽăăšă確çŤăăăăžă§ăćŠč˝ăéć¨ĺĽ¨ăŤăăăšăă§ăŻăŞăă¨ćăăžăă MaybeUninit
ăŻăç§ăŽçŽăŤăŻmem::zeroed
ăăăĺŞăăă˝ăŞăĽăźăˇă§ăłă§ăăăĺŽç§ă§ăŻăŞăăăăăăžăăďźĺŽĺ
¨ă§ăăăäşşé塼ĺŚçă§ăŻăăăžăăďźăăăăăŁăŚă mem::zeroed
ăéć¨ĺĽ¨ăŤăăŚăĺéĄăăăžăăă MaybeUninit
çé¸ăăă¨ăăăŤăăă¨ăăăăçşçăăăžă§ăŤäşşé塼ĺŚăŤĺşăĽăă䝣ćżĺăăŞăĺ ´ĺă§ăă mem::zeroed
ă
解湺ăăĺéĄă¨ĺéżăăĺąéşć§ăăăéŠĺăŤäźăăăăăŤăĺĺăMaybeInvalidăŞăŠăŤĺ¤ć´ăăĺż čŚăăăăăăăăžăăă
@gnzlbg
ăăă¤ăăŽăăă¤ăăŁăăăżă¤ăăăăăžăďźäžďź
bool
bool
ăFFIăťăźăă§ăăéăďźRFC 954ăćĺŚăăăéĺ
ŹĺźăŤĺ
ŹĺźăŤćżčŞăăăăŤăăăăăăăä¸čŹçăŤăŻăăčăăăăŚăăžăďźă mem::zeroed
ă使ç¨ăăŚăĺŽĺ
¨ă§ăă
ă
&T
ăŞăŠďźămem::zeroed
ăćŞĺŽçžŠăŽĺä˝ăĺźăłĺşăăžăă
ăŻăăăăăăăUBăćăŁăŚăăăăăŽăżă¤ămem::zeroed
ăžăăŽăăăŽUBăćăŁăŚăăMaybeUninit::zeroed().into_inner()
ďźćĺłçăŤĺŤăžăăăăăŤăç§ăŻć
éă ăŁă.into_inner()
ç§ăŽăŞăŞă¸ăăŤăłăĄăłăă§ďźă MaybeUninit
ăŻăăŚăźăśăźăăăăŤ.into_inner()
ĺźăłĺşăăĺ ´ĺăä˝ăčż˝ĺ ăăžăăďźăăăŻă mem::zeroed
ăŽăżă使ç¨ăăŚăăăăă mem::zeroed
ăéć¨ĺĽ¨ăŤăŞăŁăĺ ´ĺăŤç§ăäťăŽĺ¤ăăŽäşşăčĄăăă¨ă§ăă mem::zeroed
ăżă¤ăăŽĺ ´ĺăŻ
boolăFFIăťăźăă§ăăéăďźRFC 954ăćĺŚăăăéĺ ŹĺźăŤĺ ŹĺźăŤĺăĺ ĽăăăăăŤăăăăăăăä¸čŹçăŤăŻăăčăăăăŚăăžăďźămem :: zeroedă使ç¨ăăŚăĺŽĺ ¨ă§ăă
ç§ăŻăăăŽčŠłç´°ăŤçŤăĄĺ
Ľăăăăăăžăăă§ăăăă bool
ăŻăCăŽ_Bool
ă¨çăăăŞăăăăŤĺŽçžŠăăăŚăăă¨ăăćĺłă§ăFFIăťăźăă§ăă ăă ăăCăŽ_Bool
ăŽtrue
ă¨false
ĺ¤ăŻăCć¨ćşă§ăŻĺŽçžŠăăăŚăăžăăďźăă ăăăă¤ăC20ă§ĺŽçžŠăăăĺŻč˝ć§ăăăăžăďźăăăăăŁăŚă mem::zeroed
ăŻćĺšăŞbool
mem::zeroed
ä˝ćăăăăŠăăăŻăćčĄçăŤĺŽčŁ
ĺŽçžŠăăăŚăăžăă
ăŻăăăă ăămeââm :: zeroedăŤUBăăăăăăăŽăżă¤ăăŤăŻăMaybeUninit :: zeroedďźďźăinto_innerďźďźăŤăUBăăăăžăďźĺ ăŽăłăĄăłăăŤćĺłçăŤ.into_innerďźďźăĺŤăăăăăŤćł¨ćăăžăăďźă ăŚăźăśăźăăăăŤ.into_innerďźďźăĺźăłĺşăăĺ ´ĺăăăăăUninităŻä˝ăčż˝ĺ ăăžăăďźăăăŻăăźăăťăźăăŽĺăŤăŽăżmem :: zeroedă使ç¨ăăŚăăăăămem :: zeroedăéć¨ĺĽ¨ăŤăŞăŁăĺ ´ĺăŤç§ăäťăŽĺ¤ăăŽäşşăčĄăăă¨ă§ăďź ă
ăăŞăăăăă§ăŠăŽăă¤ăłăăä˝ăăă¨ăăŚăăăŽăăç§ăŤăŻăăăăăăžăăă MaybeUninit
ăŻă mem::zeroed
ăŻăŞăinto_inner
ăĺźăłĺşăăĺźăłĺşăăŞăăăŽăŞăăˇă§ăłăčż˝ĺ ăăžăăăăăŻăćŞĺŽçžŠăŽĺä˝ăĺźă辡ăăĺŻč˝ć§ăăăćä˝ă§ăăăăă䞥ĺ¤ăăăăžăďźăŚăăŞăłăĺćĺăăăŚăăŞăăăžăăŻăźăĺăăăăăŽă¨ăăŚć§çŻăăăŽăŻĺŽĺ
¨ă§ăďźă
ăŞă誰ăăç˛çŽçăŤmem::zeroed
ăMayeUninit
+ into_inner
翝訳ăăăŽă§ăăăăďź ăăăŻă mem::zeroed
ăŽéć¨ĺĽ¨čŚĺăă俎ćŁăăăéŠĺăŞćšćłă§ăŻăŞăăéć¨ĺĽ¨čŚĺăçĄéłăŤăăăă¨ăŻĺăĺšćă¨ăŻăăăŤä˝ăăłăšăăăăăăăžăă
mem::zeroed
ăăMaybeUninit
ăŤç§ťĺăăéŠĺăŞćšćłăŻă into_inner
ăĺźăłĺşăăŚăĺŽĺ
¨ăăŠăăăčŠäžĄăăăă¨ă§ăăăăŽĺ ´ĺăŻăăăăăă ăă§ăăăŽççąă誏ćăăăłăĄăłăăć¸ăăă¨ăă§ăăžăăĺŽĺ
¨ă§ăăăžăăŻă into_inner
ĺźăłĺşăăĺŽĺ
¨ăŤăŞăăžă§ă MaybeUninit
ăunion
çśăăžăďźăăŽĺ ´ĺăŻăAPIăăŹăźăŻăĺŽčĄăăŚăĺ¤ăăŽăłăźăăĺ¤ć´ăăĺż
čŚăăăăžăă T
ăŽäťŁăăăŤMaybeUninit
ăčżăăăăŤĺ¤ć´ăăžăă
ç§ăŻăăăŽčŠłç´°ăŤçŤăĄĺ Ľăăăăăăžăăă§ăăăă
bool
ăŻăCăŽ_Bool
ă¨çăăăŞăăăăŤĺŽçžŠăăăŚăăă¨ăăćĺłă§ăFFIăťăźăă§ăă ăă ăăC's
_Boolare not defined in the C standard (although they might be some day, maybe in C20), so whether
mem :: zeroedcreates a valid
bool`ăŽtrue
ăăăłfalse
ĺ¤ăŻăćčĄçăŤĺŽčŁ ĺŽçžŠăăăŚăăžăă ă
ćĽçˇăçśçśăăăă¨ăă芍ăłăăžăăăC11ă§ăŻăall-bits-set-to-zeroăć´ć°ĺăŽĺ¤0ă襨ăĺż
čŚăăăăžăďźăťăŻăˇă§ăł6.2.6.2ăć´ć°ĺăăŽćŽľč˝5ăĺç
§ďźďź _Bool
ďź ă ăăăŤă true
ă¨false
ăŻć示çăŤĺŽçžŠăăăŚăăžăďźăťăŻăˇă§ăł7.18ăăăźăŤĺă¨ĺ¤<stdbool.h>
ăăĺç
§ďźă
ăăŞăăăăă§ăŠăŽăă¤ăłăăä˝ăăă¨ăăŚăăăŽăăç§ăŤăŻăăăăăăžăăă
MaybeUninit
ăŻămem::zeroed
ăŻăŞăinto_inner
ăĺźăłĺşăăĺźăłĺşăăŞăăăŽăŞăăˇă§ăłăčż˝ĺ ăăžăăăăăŻăćŞĺŽçžŠăŽĺä˝ăĺźă辡ăăĺŻč˝ć§ăăăćä˝ă§ăăăăă䞥ĺ¤ăăăăžăďźăŚăăŞăłăĺćĺăăăŚăăŞăăăžăăŻăźăĺăăăăăŽă¨ăăŚć§çŻăăăŽăŻĺŽĺ ¨ă§ăďźă
MaybeUninit
ă¨MaybeUninit::zeroed
ăŻĺ¤ăăăăžăă ç§ăăĄăŻä¸Ąćšă¨ăăăăŤĺćăăžăă MaybeUninit::zeroed
ăĺé¤ăăăă¨ă丝埾ăăŚăăăăă§ăŻăăăžăăă ç§ăŽăă¤ăłăăŻă std::mem::zeroed
ă䞥ĺ¤ăăăă¨ăăăă¨ă§ăă
mem :: uninitializedăĺŽĺ ¨ăŤĺŽĺ ¨ă§ăăăżă¤ăďźäžďźunitďźăăăă°ămem :: zeroedăćŞĺŽçžŠăŽĺä˝ăĺźăłĺşăăăă¤ăăŁăăăżă¤ăďźäžďźboolăďźTăŞăŠďźăăăăžăă
ăăăŻčľ¤ăăăˇăłă§ăă zeroed
ă¨uninitialized
严ćšăăżă¤ăăŽä¸é¨ăŽăľăăťăăăŤĺŻžăăŚćĺšă§ăăă¨ăăççąă ăă§ăĺŽéăŽä˝żç¨ă§ăăăăćŻčźăăăă¨ăŻă§ăăžăăă ăăăăŽăľăăťăăăŽăľă¤ăşă確čŞăăĺż
čŚăăăăžăă mem::uninitialized
ăćĺšăŞĺăŽć°ăŻé常ăŤĺ°ăŞăďźĺŽéăăľă¤ăşăăźăăŽĺă ăă§ăăďźďźăĺŽéăŤăăăčĄăăłăźăăä˝ćăăäşşăŻčŞ°ăăăžăăďźăă¨ăă°ăZSTăŽĺ ´ĺăŻä˝żç¨ăăă ăă§ăďźăĺăłăłăšăăŠăŻăżăźďźă ä¸ćšă mem::zeroed
ăćĺšăŞăżă¤ăăŻăăăăăăăžăă mem::zeroed
ăŻăĺ°ăŞăă¨ă揥ăŽăżă¤ăă§ćĺšă§ăďźăăăćŁăăăă¨ăéĄăŁăŚăăžăďźă
bool
ăĺŤăďźOption<T>
ăăă§ăTăŻĺćĺăŹă¤ă˘ăŚăăŽćéŠĺăăăŞăŹăźăăžăă T
ĺŤăžăăăăŽďźNonZeroXXX
ďźăăšăŚăŽć´ć°ĺďźNonNull<U>
&U
&mut U
fn
ăă¤ăłăżstruct
ăăă§ăäťťćăŽăăŁăźăŤăăŻăăŽăŞăšăăŽăżă¤ăă§ăăstruct
ăăžăăŻunion
ăăŻăă uninitialized
ă¨zeroed
ăŻăŠăĄăăăć˝ĺ¨çăŤçĄĺšăŞĺ¤ăĺŚçăăžăă ăă ăăăăă°ăŠăăźăŻăăăăŽăăŞăăăŁăăé常ăŤç°ăŞăćšćłă§ä˝żç¨ăăžăă
mem::uninitialized
ăŽä¸čŹçăŞăăżăźăłăŻćŹĄăŽă¨ăăă§ăă
let val = MaybeUninit::uninitialized();
initialize_value(val.as_mut_ptr()); // or val.set
val.into_inner()
ĺćĺăăăŚăăŞăĺ¤ăŽä˝żç¨ăăăŽăăăŤč¨čż°ăăŚăăŞăĺ ´ĺăŻă大ăăŞééăăçŻăăŚăăĺŻč˝ć§ăăăăžăă
äťćĽăŽmem::zeroed
ăŽćăä¸čŹçăŞä˝żç¨ćłăŻăä¸č¨ăŽăżă¤ăă§ăăăăăăŻĺŽĺ
¨ăŤćĺšă§ăă ç§ăŻ@blussăŤĺŽĺ
¨ăŤĺćăăžăăăŠăă§ăă MaybeUninit::zeroed().into_inner()
mem::zeroed()
ăMaybeUninit::zeroed().into_inner()
罎ăćăăăă¨ă§ăăăăăŹăłé˛ć˘ăŽăĄăŞăăăčŚăăăŞăă¨ăăăă¨ă§ăă
čŚç´ăăă¨ă uninitialized
ä¸čŹçăŞä˝żç¨ćłăŻăçĄĺšăŞĺ¤ăćă¤ĺŻč˝ć§ăŽăăăżă¤ăă§ăă zeroed
ä¸čŹçăŞä˝żç¨ćłăŻăăźăăŤăăăĺ ´ĺăŤćĺšăŞăżă¤ăă§ăă
ććĄăăăŚăăăăăŤă Zeroed
çšć§ăžăăŻĺć§ăŽăăŽďźăă¨ăă°ă Pod
ă§ăăă T: Zeroed
ăŻT: Pod
ćĺłăăŞăăă¨ăŤćł¨ćăăŚăă ăăďźăčż˝ĺ ăăăŽăŻčŻăăă¨ăŽăăă§ăĺ°ćĽă§ăăăĺŽéăŤĺŽĺŽăăfn zeroed2<T: Zeroed>() -> T
ăĺžăăăăžă§ă fn zeroed<T>() -> T
éć¨ĺĽ¨ăŤăăŞăă§ăă ăăă
@mjbshaw
ćĽçˇăçśçśăăăă¨ăă芍ăłăăžăăăC11ă§ăŻ
確ăăŤďź ćĺšăŞĺ¤ăćĺŽăăăŚăăŞăăŽăŻăC ++ăŽbool
ă§ăă ç§ăč¨ćŁăăŚăăăŚăăăă¨ăăăăŽäżč¨źă§UCGăŤPRăéăă¤ăăă§ăă
@jethrogb
ăăăăŽăľăăťăăăŽăľă¤ăşă確čŞăăĺż čŚăăăăžăă
mem::uninitialized
ăćĺšăŞĺăŽć°ăŻé常ăŤĺ°ăŞăďźĺŽéăăľă¤ăşăăźăăŽĺă ăă§ăăďźďźăĺŽéăŤăăăčĄăăłăźăăä˝ćăăäşşăŻčŞ°ăăăžăăďźăă¨ăă°ăZSTăŽĺ ´ĺăŻä˝żç¨ăăă ăă§ăďźăĺăłăłăšăăŠăŻăżăźďźă
ZSTăä¸ç¨ŽăŽăăăŤăźăăťăŞăăťăŻăźăŻăăžăăŻăăăźăŻăłăťăăŠăźăťăŞă˝ăźăšăăžăăŻĺăŤăăăŤăźăăťăŚăŁăăăăšăă¨ăăŚćă¤ăă¨ăă§ăăăăŠă¤ăăˇăźăčć ŽăŤĺ Ľăăă¨ăăăšăŚăŽZSTăŤĺŻžăăŚăăćŁăăăăăžăăă ăăăăŞäžďź
mod refl {
use core::marker::PhantomData;
use core::mem;
/// Having an object of type `Id<A, B>` is a proof witness that `A` and `B`
/// are nominally equal type according to Rust's type system.
pub struct Id<A, B> {
witness: PhantomData<(
// Make sure `A` is Id is invariant wrt. `A`.
fn(A) -> A,
// Make sure `B` is Id is invariant wrt. `B`.
fn(B) -> B,
)>
}
impl<A> Id<A, A> {
/// The type `A` is always equal to itself.
/// `REFL` provides a proof of this trivial fact.
pub const REFL: Self = Id { witness: PhantomData };
}
impl<A, B> Id<A, B> {
/// Casts a value of type `A` to `B`.
///
/// This is safe because the `Id` type is always guaranteed to
/// only be inhabited by `Id<A, B>` types by construction.
pub fn cast(self, value: A) -> B {
unsafe {
// Transmute the value;
// This is safe since we know by construction that
// A == B (including lifetime invariance) always holds.
let cast_value = mem::transmute_copy(&value);
// Forget the value;
// otherwise the destructor of A would be run.
mem::forget(value);
cast_value
}
}
}
}
fn main() {
use core::mem::uninitialized;
// `Id<?A, ?B>` is a ZST; let's make one out of thin air:
let prf: refl::Id<u8, String> = unsafe { uninitialized() };
// Segfault:
let _ = prf.cast(42u8);
}
@CentrilăăăŻä¸ç¨ŽăŽćĽçˇă§ăăăăłăźăăĺŽéăŤuninitialized
ăĺźăłĺşăă¨çĄĺšăŞĺ¤ăä˝ćăăăăżă¤ăăŽäžă§ăăăăŠăăăŻăăăăžăăă ĺŽĺ
¨ă§ăŞăăłăźăă使ç¨ăăŚă Id
ăçśćăăăă¨ăŤăŞăŁăŚăăĺ
é¨ä¸ĺ¤ćĄäťśăŤéĺăăŚăăžăă ăăăčĄăăŤăŻă transmute(())
ăăçăŽăă¤ăłăżăŽĺăăŁăšăăŞăŠăăăžăăžăŞćšćłăăăăžăă
@jethrogbç§ăŽĺŻä¸ăŽăă¤ăłăăŻăaďźč¨ăĺăăŤăăŁă¨ćł¨ćăăŚăă ăăăbďźćĺšăŞĺ¤ăä˝ă§ăăăăŤă¤ăăŚăŽč°čŤă§ăŻăăăŠă¤ăăˇăźăĺĺăŤççąäťăăăăŚăăŞăăăă§ăă ăĺ
é¨ä¸ĺ¤ćĄäťśăŤéĺăăăă¨ăçĄĺšăŞĺ¤ăăŻĺăăăŽăŽăăăŤćăăžăă ăăăŤăŻăă A != B
ĺ ´ĺă Id<A, B>
ăçĄäşşă§ăăăă¨ăăĺŻćŹĄçăŞćĄäťśăăăăžăă
ăĺ é¨ä¸ĺ¤ćĄäťśăŤéĺăăăă¨ăçĄĺšăŞĺ¤ăăŻĺăăăŽăŽăăăŤćăăžăă ăăăŤăŻăă
A != B
ĺ ´ĺăId<A, B>
ăçĄäşşă§ăăăă¨ăăĺŻćŹĄçăŞćĄäťśăăăăžăă
ăăŠă¤ăăŠăŞăłăźăăŤăăŁăŚčŞ˛ăăăăăä¸ĺ¤ćĄäťśăŻăăăă¤ăăŽçšă§ăăłăłăă¤ăŠăŤăăŁăŚčŞ˛ăăăăä¸ĺ¤ćĄäťśă¨ăžăăId
äžăŤăŻĺŽĺ
¨ć§ăŽä¸ĺ¤éăăăă mem::zeroed
ăžăăŻId<A, B>
ăä¸čŹçăŤĺćăăäťăŽćšćłăŻĺŽĺ
¨ă§ăŻăăăžăăăăăăăŻăă ăŽUBă§ăŻăăăžăăă Id
ăŤăŻćĺšć§ä¸ĺ¤ćĄäťśăăŞăăăă mem::zeroed
ăžăăŻmem::uninitialized
ăŚééăŁăId
ĺ¤ăä˝ćăăžăă ĺŽĺ
¨ă§ăŞăăłăźăä˝ćč
ăŻç˘şăăŤä¸ĄćšăŽç¨ŽéĄăŽä¸ĺ¤ćĄäťśăĺżľé ăŤç˝Žăĺż
čŚăăăăžăăăăăŽč°čŤă丝ăŤćĺšć§ăŤçŚçšăĺ˝ăŚăŚăăççąăŻăăă¤ăăăăžăă
T
ăŽĺŽĺ
¨ä¸ĺ¤ćĄäťśăŤĺşăĽăăŚmem::zeroed::<T>()
ăćŠć˘°çăŤé¤ĺ¤ă§ăăă¨ăăŚăăĺż
čŚăŞăĺ ´ĺăăăăžăă@jethrogbăŽăłăĄăłăăčŞăă ĺžă mem::zeroed
ăMaybeUninit
ĺ°ĺ
Ľă§ĺťć˘ăăăăšăă§ăŻăŞăăă¨ăŤĺćăăžăă
@jethrogbĺ°ăăŞăăăďź
ăăŽăŞăšăĺ ăŽäťťćăŽăżă¤ăăŽäťťćăŽé ĺ
äťťćăŽăăŁăźăŤăăăăŽăŞăšăăŽăżă¤ăă§ăăäťťćăŽć§é ä˝ă
ăăăĺç´ăŞăżă¤ăăăšăŞăŽăćĺłä¸ăŽéăăŞăŽăăŻăăăăžăăăăăăă2ă¤ăŽçŽćĄć¸ăăĺăé¤ăĺż
čŚăăăă¨ćăăžăăăă¨ăă°Option<[&u8; 2]>
None
ăĺż
ăăăăăă§ăăă¨ăŻéăăžăăă Option<[&u8; 2]>
ăŻăćĺšăŞčĄ¨çžă¨ăăŚăăăĺä˝ăŽăźăăăăăžăďźăă¨ăă°ă None
ĺ ´ĺăŽčĄ¨çžă¨ăăŚ[0, 24601]
ă使ç¨ă§ăăžăăĺ
é¨ĺ¤ăŽ1ă¤ă ăăăăăăŞčĄ¨çžăă¨ăĺż
čŚăăăăžă-cc @ăăăŤă¤ăăŚç§ăăă§ăăŻăăăăăŽ
@jethrogb
äťćĽăŽmem :: zeroedăŽćăä¸čŹçăŞä˝żç¨ćłăŻăä¸č¨ăŽăżă¤ăă§ăăăăăăŻĺŽĺ ¨ăŤćĺšă§ăă
ăăăŽă˝ăźăšăŻăăăžăăďź
ä¸ćšămem :: zeroedăćĺšăŞăżă¤ăăŻăăăăăăăžăă
ăžăă誤ăŁăŚä˝żç¨ăăăăąăźăšăçĄéăŤăăăžăă
mem::zeroed
é ťçšăă¤ćŁç˘şăŤä˝żç¨ăăŚăăäşşăŤă¨ăŁăŚăăăäşşé塼ĺŚçăŞă˝ăŞăĽăźăˇă§ăłăĺŠç¨ĺŻč˝ăŤăŞăăžă§éć¨ĺĽ¨ăé
ăăăăă¨ăŻăé常ăŤé
ĺçăŞäťŁćżć掾ă§ăăăă¨ăç解ăăŚăăžăă
ä¸ćçăŞäşşé塼ĺŚçăłăšăăçşçăăă¨ăăŚăă mem::zeroed
ăŽčޤăŁă使ç¨ăŽć°ăć¸ăăăćé¤ăăă¨ăăăăŹăźăăŞăă弽ăżăžăă éć¨ĺĽ¨ăŻăăŚăźăśăźăčĄăŁăŚăăăă¨ăćŞĺŽçžŠăŽĺä˝ăĺźă辡ăăĺŻč˝ć§ăăăăă¨ăăŚăźăśăźăŤčŚĺăăžăďźçšăŤăĺăăŚăăă使ç¨ăăć°ăăăŚăźăśăźďźă䝣ăăăŤä˝ăăăšăăăŤă¤ăăŚăŽéŠĺăŞč§ŁćąşçăăăăčŚĺăĺŽčĄĺŻč˝ăŤăăžăă
ç§ăŻMaybeUninit
é ťçšăŤä˝żç¨ăă mem::zeroed
ămem::uninitialized
ăăăäşşé塼ĺŚçă§ăŻăăăžăăăăç§ăŤă¨ăŁăŚăŻăăăťăŠäşşé塼ĺŚçă§ăŻăăăžăăă MaybeUninit
ăăăŽăăŁăšăŤăăˇă§ăłăŽä¸ťĺźľăŽä¸é¨ăŽăłăĄăłăă¨ĺăăăăčŚçă§ăăĺ ´ĺăĺŽĺ
¨ăŞmem::zeroed
䝣ćżćĄăŽăŠă¤ăăŠăŞăăăł/ăžăăŻRFCăăăăŤăăăă˘ăăăăžăďźăăă§AFAICTăăăăăŻăăăăŽăŻä˝ăăăăžăăďźă
ăžăăŻăăŚăźăśăźăŻčŚĺăçĄčŚăăŚmem::zeroed
ă使ăçśăăăă¨ăă§ăăžăăăăăŻăŚăźăśăźćŹĄçŹŹă§ăăă¨ăŤăăă libcore
ăămem::zeroed
ăĺé¤ăăăă¨ăŻă§ăăžăăă
ăăăă mem::zeroed
ĺ¤ç¨ăăŚăăäşşăŻăă¨ăŤăăăăšăŚăŽä˝żç¨ćłăćŁăăăăŠăăăçŠćĽľçăŤć¤ćťăăĺż
čŚăăăăžăă çšăŤmem::zeroed
ĺ¤ç¨ăăŚăăäşşăă¸ă§ăăŞăăŻăłăźăă§ä˝żç¨ăăŚăăäşşă mem::uninitialized
ăćăăŞăă䝣ćżć掾ă¨ăăŚä˝żç¨ăăŚăăäşşăŞăŠăéć¨ĺĽ¨ăé
ăăăă¨ăăŚăźăśăźăŤčŞĺăăăŚăăăă¨ăčŚĺăăăŽăé
ăăă ăă§ăăćŞĺŽçžŠăŽĺä˝ă§ăăĺŻč˝ć§ăăăăžăă
@bluss
ăźăăĺé¤ăăă¨ăMaybeUninit :: zeroedďźďźăinto_innerďźďźăŤăŽăżç˝ŽăćăăăăăăăŤčŚăăžăăăăăŻăĺăăă¨ăć¸ăăăăŽĺçăŽćšćłăŤăŞăăžăă ĺŽčłŞçăŞĺ¤ć´ăŻăăăžăăă uninitĺ¤ă使ç¨ăăă¨ă䝣ăăăŤăĺćĺăăăŚăăŞăăăšăŚăŽăăźăżăăMaybeUninităżă¤ăăžăăŻĺçăŽunionăŽĺ¤ăŤć źç´ăăăăžăžăŤăŞăă¨ăăĺŽéçăŞĺ¤ć´ăčĄăăăžăă
ăăăŻć´ć°ăŤă¤ăăŚčŠąăăŚăăă¨ăăŤĺ˝ăŚăŻăžăăžăăăăă¨ăă°ĺç
§ĺăčŚăă¨ă mem::zeroed()
ăĺéĄăŤăŞăăžăă
ăă ăă mem::uninitialized::<bool>()
ăĺéĄă§ăăăă¨ăŤć°äťăăăăăĺŽéăŤmem::zeroed::<&T>()
ăĺéĄă§ăăăă¨ăŤć°äťăĺŻč˝ć§ăăŻăăăŤéŤăăă¨ăŤĺćăăžăă ăăăăŁăŚă mem::zeroed()
ăäżćăăăă¨ăŻçăŤăăŞăŁăŚăăžăă
ăă ăă mem::uninitialized::<u32>()
ă§ĺéĄăŞăă¨ĺ¤ćăăĺ ´ĺăăăăă¨ăŤćł¨ćăăŚăă ăăăć´ć°ĺă§ĺćĺăăăŚăăŞăăăăă訹ĺŻăăă¨ă mem::uninitialized()
ăŻăťă¨ăăŠăăšăŚăŽăPODĺăă§ćĺšăŤăŞăăžăă ăăă訹ĺŻăăăšăă§ăŻăŞăă¨ćăăžăăăăăă§ăăăŽč°čŤăăăĺż
čŚăăăăžăă
mem :: uninitializedăćĺšăŞĺăŽć°ăŻé常ăŤĺ°ăŞăďźĺŽéăăľă¤ăşăăźăăŽĺă ăă§ăăďźďźăĺŽéăŤăăăčĄăăłăźăăä˝ćăăäşşăŻčŞ°ăăăžăăďźăă¨ăă°ăZSTăŽĺ ´ĺăŻăĺă使ç¨ăăă ăă§ăďźăăłăłăšăăŠăŻăżďźă
FWIWăä¸é¨ăŽăšăŠă¤ăšă¤ăăŹăźăżăłăźăăŻăĺăłăłăšăăŠăŻăżăč¨čż°ă§ăăăŤăĺŽéăŤăŻă¸ă§ăăŞăăŻăłăźăă§ZSTăä˝ćăăĺż
čŚăăăăžăă ăăŽăăăŤmem::zeroed()
/ MaybeUninit::zeroed().into_inner()
ă使ç¨ăăžăă
mem::zeroed()
ăŻăCé˘ć°ăĺźăłĺşăĺăŤmemset(&x, 0, sizeof(x))
ĺ¤ăăźăăŤăăăă¨ăćĺž
ăăăçšĺŽăŽFFIăŽĺ ´ĺăŤĺ˝šçŤăĄăžăă ăăăŻăéć¨ĺĽ¨ăŤăăŞăăăăŽĺĺăŞççąă ă¨ćăăžăă
@AmanieuăăăŻä¸čŚăŽăăă§ăă memset
ä¸č´ăăRustăłăłăšăăŠăŻăăŻwrite_bytes
ă§ăă
mem :: zeroedďźďźăŻăçšĺŽăŽFFIăŽĺ ´ĺăŤĺ˝šçŤăĄăžă
ăžăăĺĺăă§ăăŻăăă¨ăă mem::zeroed
ăŻăăăŠă¤ăăźăăăŁăźăŤăăžăăŻăăŠăăăăŠăźă äžĺăăŁăźăŤăă§libc
ć§é ăĺćĺăăć
Łç¨çăŞćšćł
@RalfJungĺéĄăŽĺŽĺ
¨ăŞăłăźăăŻé常Type x; memset(&x, 0, sizeof(x));
ăăăćĺăŽé¨ĺăŤăŻRustăŤç¸ĺ˝ăăăăŽăăăăžăăă ăăŽăăżăźăłăŤMaybeUninit
ă使ç¨ăăă¨ă memset
ĺžă§ăĄă˘ăŞăĺŽéăŤçĄĺšăŤăŞăăă¨ăŻăŞăăăăĺ¤ăăŽăŠă¤ăłăă¤ăşďźăăăłćéŠĺăŞăăŽcodegenăŽćŞĺďźăçşçăăžăă
MaybeUninit
ăŽč¨č¨ăŤă¤ăăŚčłŞĺăăăăžăďź MaybeUninit<T>
ĺ
ăŤĺŤăžăăT
ĺä¸ăŽăăŁăźăŤăăŤć¸ăčžźăćšćłăŻăăăžăăďźăăšăŚăŽăăŁăźăŤăăćĺš/ĺćĺăăăăżă¤ăăŤăŞăăžăăďź
揥ăŽăăăŞć§é ä˝ăăăă¨ăăžăă
// Let us suppose that Foo can in principle be any struct containing arbitrary types
struct Foo {bar: bool, baz: String}
ďźmut Fooĺç §ăçćăăăăăŤć¸ăčžźăă¨UBăăăŞăŹăźăăăžăăďź
main () {
let uninit_foo = MaybeUninitilized::<Foo>::uninitialized();
unsafe { *uninit_foo.get_mut().bar = true; }
unsafe { *uninit_foo.get_mut().baz = "hello world".to_owned(); }
}
ĺç §ăŽäťŁăăăŤçăŽăă¤ăłăżăźă使ç¨ăăă¨ăăăŽĺéĄăĺéżă§ăăžăăďź
main () {
let uninit_foo = MaybeUninitilized::<Foo>::uninitialized();
unsafe { *uninit_foo.as_mut_pointer().bar = true; }
unsafe { *uninit_foo.as_mut_pointer().baz = "hello world".to_owned(); }
}
ăžăăŻăUBăăăŞăŹăźăăăŤăăŽăăżăźăłăĺŽčŁ ă§ăăäťăŽćšćłăŻăăăžăăďź ç´ćçăŤăŻăĺćĺăăăŚăăŞă/çĄĺšăŞăĄă˘ăŞăčŞăżĺăŁăŚăăŞăéăăăăšăŚăăăžăăăăŻăă§ăăăăăŽăšăŹăăăŽăłăĄăłăăŽăăă¤ăăŻç§ăŤăăăçăăăžăă
ăăŽćŠč˝ăŽç§ăŽăŚăźăšăąăźăšăŻăä¸é¨ăŽăăŁăźăŤăăăŚăźăśăźăćĺŽăăĺż čŚăăăďźăăăŚéŠĺăŞăăăŠăŤăăăŞăďźăżă¤ăăŽă¤ăłăăŹăźăšăăŤăăźăăżăźăłă§ăăăä¸é¨ăŽăăŁăźăŤăăŤăŻăăăŠăŤăăăăăžăĺ¤ă
MaybeUninitĺ ăŤĺŤăžăăTăŽĺä¸ăŽăăŁăźăŤăăŤć¸ăčžźăćšćłăŻăăăžăăďź
ćéăŽçľéă¨ă¨ăăŤăăšăŚăŽăăŁăźăŤăăŤć¸ăčžźăżăćçľçăŤćĺšăŞ/ĺćĺăăăăżă¤ăăŤăŞăĺŻč˝ć§ăăăăžăăďź
ăŻăă 使ç¨ăă
ptr::write(&mut *(uninit.as_mut_ptr()).bar, val1);
ptr::write(&mut *(uninit.as_mut_ptr()).baz, val2);
...
ăăăŤăŻget_mut()
ă使ç¨ăăŞăă§ăă ăăăăăŽăăă get_mut
ăŽăăăĽăĄăłăăŤăŻăăăŽăĄă˝ăăăĺźăłĺşăĺăŤĺ¤ăĺćĺăăĺż
čŚăăăă¨č¨čźăăăŚăăžăă ĺ°ćĽçăŤăŻă httpsďź//github.com/rust-rfcs/unsafe-code-guidelines/ă§č°čŤăăăŚăăăăŽăŤăźăŤă硊ĺăăĺŻč˝ć§ăăă
@RalfJung *(uninit.as_mut_ptr()).bar = val1;
ăŻăĺćĺăăăŚăăŞăĺŻč˝ć§ăŽăăbar
ăŤäťĽĺăŽĺ¤ăăăăăăăăŞăšăŻăŻăăăžăăăďź ăăĺż
čŚăăăă¨ćăăžă
ptr::write(&mut (*uninit.as_mut_ptr()).bar, val1);
@scottjmaddoxăăăăăă ăă Drop
ăĺżăăŚăăžăăžăăă ć稿ăć´ć°ăăžăă
ĺćĺăăăŚăăŞăăăŁăźăŤăă¸ăŽć¸ăčžźăżăŽăăŽăăŞă˘ăłăăŻă get_mut()
ăăăćŞĺŽçžŠăŽĺä˝ăăŠăŽăăăŤç¤şăăžăăďź ptr::write
ă¸ăŽćĺăŽĺźć°ăčŠäžĄăăăăłăźăăă¤ăłăă§ăăłăźăăŻĺ
é¨ăăŁăźăŤăăŤ&mut _
ăä˝ćăăžăăăăăăŻăăăă§ăŞăĺ ´ĺăŻć§é ä˝ĺ
¨ä˝ă¸ăŽĺç
§ă¨ĺăăăăŤćŞĺŽçžŠă§ăăĺż
čŚăăăăžăăä˝ćăăă ăłăłăă¤ăŠăŻăăăăăă§ăŤĺćĺăăăçść
ăŤăăă¨ćłĺŽăăăă¨ă訹ĺŻăăăăšăă§ăŻăăăžăăăďź
ăăăŻăĺ
Źéăăă&mut _
ä¸éä˝ăĺż
čŚă¨ăăŞăć°ăăăă¤ăłăżăźć役ćłăĺż
čŚă¨ăăŞăă§ăăăăďź
ĺ°ăčĺłćˇąăäžďź
pub struct A { inner: bool }
pub fn init(mut uninit: MaybeUninit<A>) -> A {
unsafe {
let mut previous: [u8; std::mem::size_of::<bool>()] = [0];
{
// Doesn't the temorary reference assert inner was in valid state before?
let inner_ptr: *mut _ = &mut (*uninit.as_mut_ptr()).inner;
ptr::copy(inner_ptr as *const [u8; 1], (&mut previous) as *mut _, 1);
// With the assert below, couldn't the compiler drop this?
std::ptr::write(inner_ptr, true);
}
// Assert Inner wasn't false before, so it must have been true already!
assert!(previous[0] != 0);
// initialized all fields, good to proceed.
uninit.into_inner()
}
}
ăăăăăłăłăă¤ăŠă&mut _
ăćĺšăŞčĄ¨çžă§ăăă¨ćłĺŽăăĺ ´ĺă ptr::write
ĺŽĺ
¨ăŤć¨ăŚăăăĺŻč˝ć§ăăăăžăăďź ă˘ăľăźăˇă§ăłăééăăĺ ´ĺăăłăłăăłăăŻ0
ăŻăăăžăăăăäťăŽćĺšăŞăăźăŤĺ¤ăŻtrue/1
ă§ăă ăăăăŁăŚăă˘ăľăźăˇă§ăłăééăăĺ ´ĺăăăăŻăăźăŞăăŹăźăˇă§ăłă§ăăă¨čŚăŞăăă¨ăă§ăăžăă 䝼ĺăŻĺ¤ăŤă˘ăŻăťăšăăŚăăŞăăŁăăŽă§ă丌ăšćżăăĺžăăăă§çľăăĺŻč˝ć§ăăăăžăăďź llvmăäťăăăćŞç¨ăăŚăăăăăŤăŻčŚăăžăăăăăăăäżč¨źăăăăăŠăăăŻé常ăŤăăăăžăăă
䝣ăăăŤăé˘ć°ĺ
ăŤçŹčŞăŽMaybeUninit
ăä˝ćăăă¨ăăăăăŤç°ăŞăçžĺŽăĺžăăăžăă éăłĺ ´ă§ăŻă䝣ăăăŤăă˘ăľăźăăăăŞăŹăźăăăŞăăă¨ăĺćă¨ăăŚăăăă¨ăăăăăžăăăăăăă str::ptr::write
ăinner
ă¸ăŽĺŻä¸ăŽć¸ăčžźăżă§ăăă¨ćłĺŽăăŚăăăăă previous
ăăčŞăżĺăĺăŤăă§ăŤçşçăăŚăăĺż
čŚăăăăžăă false
ăŤĺ¤ć´ăăă¨ăŠăăŞăăă確čŞăăŚăă ăăă
ăăŽčż˝čˇĄăŽĺéĄăŻăăăŽčłŞĺăŤćéŠăŞĺ ´ćă§ăŻăŞăĺŻč˝ć§ăăăăă¨ăç解ăăŚăăžăă
@ RalfJung @ scottjmaddoxăĺçăăăă¨ăăăăăžăă ăăăăŽăăĽă˘ăłăšăăžăăŤç§ăĺ°ăăççąă§ăă
@HeroicKatoraăŻăăç§ăŻăăăŤă¤ăăŚçĺăŤćăŁăŚăăžăăă
ăăăăćŁăăĺŞćăŻăăă§ăăďź
struct Foo {bar: bool, baz: String}
fn main () {
let mut uninit_foo = MaybeUninit::<Foo>::uninitialized();
unsafe { ptr::write_unaligned(&mut ((*uninit_foo.as_mut_ptr()).bar) as *mut bool, true); }
unsafe { ptr::write_unaligned(&mut ((*uninit_foo.as_mut_ptr()).baz) as *mut String, "".to_string()); }
}
ďźéăłĺ ´ďź
RedditďźćŽĺżľăŞăăăăčŚă¤ăăăžăăďźăŤé˘ăăăłăĄăłăăčŞăżăžăăăăăăŻăăă¤ăłăżăźďź &mut foo as *mut T
ďźă¸ăŽĺç
§ăăăăŤăăŁăšăăăă¨ăĺŽéăŤăŻăă¤ăłăżăźăä˝ćăăă ăăŤăłăłăă¤ăŤăăăăă¨ă示ĺăăŚăăžăă ăăăă *uninit_foo.as_mut_ptr()
ăăăăŻç§ăĺżé
ăăăžăă ăăŽăăăŤăŚăăżăŠă¤ăşăăăăĄă˘ăŞă¸ăŽăă¤ăłăżăéĺç
§ăăŚă大ä¸ĺ¤Ťă§ăăďź ç§ăăĄăŻĺŽéăŤăŻä˝ăčŞăă§ăăžăăăăăłăłăă¤ăŠăăăăçĽăŁăŚăăăăŠăăăŻç§ăŤăŻăăăăžăăă
MaybeUninit<T>
ăčś
ăăă¸ă§ăăŞăăŻăłăźăăŤăŻă ptr::write
ăŽunaligned
ăăŞă˘ăłăăĺż
čŚăŤăŞăĺŻč˝ć§ăăăă¨čăăžăăăăăăŻăăăšăŚăŽăżă¤ăăŤăăŁăźăŤăăć´ĺăăăŚăăăăă§ăŻăŞăăăă§ăă
write_unaligned
ĺż
čŚăăăžăăă ăłăłăă¤ăŠăăăŁăźăŤăăŽé
罎ăĺŚçăăžăă ăžăăăłăłăă¤ăŠăŻ&mut
ă*mut
ăŤĺźˇĺśĺ¤ćăăĺż
čŚăăăă¨ć¨ć¸Źă§ăăăăă as *mut bool
ăĺż
čŚăăăžăăă ăăŽć¨ć¸Źăăă埡ĺśăĺŽĺ
¨/ćĺšă§ăăççąă ă¨ćăăžăă ć示çăŤăăŚas *mut _
ĺŽčĄăăăĺ ´ĺăŻăăăă§ăĺéĄăăăžăăă ăă¤ăłăżăĺ¤ć°ăŤäżĺăăăĺ ´ĺăŻăăăăăă¤ăłăżăŤĺźˇĺśĺ¤ćăăĺż
čŚăăăăžăă
@scottjmaddoxć§é ä˝ă#[repr(packed)]
ăăŁăŚăă ptr::write
ăŻĺŽĺ
¨ă§ăăďź ptr::write
ăŻăăă¤ăłăżăźăćŁăăć´ĺăăăĺż
čŚăăăă¨č¨ăŁăŚăăăŽă§ăăăăŻăăă襨çžăĺŚçăăĺż
čŚăŽăăă¸ă§ăăŞăăŻăłăźăăä˝ćăăĺ ´ĺăŻă ptr::write_unaligned
ăĺż
čŚă ă¨ćăăžăďźćŁç´ăŞă¨ăăăăăăăžăăăďźăăŁăźăŤăăéŠĺăŤé
罎ăăăŚăăăăŠăăăăăăŞăă MaybeUninit<T>
čś
ăăă¸ă§ăăŞăăŻăłăźăăăŽäžăčăăăă¨ăă§ăăžăďźă
@nicoburns
ăăăŻăăă¤ăłăżă¸ăŽĺç §ďźďźmutfooă* mut Tă¨ăăŚďźăăăăŤăăŁăšăăăă¨ăĺŽéăŤăŻăă¤ăłăżăä˝ćăăă ăăŤăłăłăă¤ăŤăăăăă¨ă示ĺăăŚăăžăă
ăłăłăă¤ăŤĺŻžčąĄăŻăăłăłăă¤ăŠăăăŽăłăłăă¤ăŤăĺŽčĄăăăăăŤä˝żç¨ă§ăăăťăăłăăŁăŻăšă¨ăŻç°ăŞăăžăă IRă§ä˝ăĺŽčĄăăăŞăĺ ´ĺă§ăăăłăłăă¤ăŠăźăŤčż˝ĺ ăŽäťŽĺŽăă˘ăľăźăăăăŞăŠăŽăťăăłăăŁăăŻĺšćăăăăžăă @scottjmaddoxăŻćŁăăă§ăăăăăă§ăŻćä˝ăĺŽčĄăăăŚăăžăăăĺéĄăŽéčŚăŞé¨ĺăŻăref-to-ptr埡ĺśăŽĺăŤçŹçŤăăŚçşçăăĺŻĺ¤ĺç
§ăŽä˝ćă§ăă 揥ăŤă @ mjbshawăŻăĺźć°ăä¸ćăŞă¸ă§ăăŞăăŻĺźć°ă§ăăĺ ´ĺăŤptr::write_unaligned
ĺż
čŚă¨ăăä¸čŹçăŞĺŽĺ
¨ć§ăŤă¤ăăŚćčĄçăŤćŁăăă§ăă
ăăăăŠăă§čŞăă ăăŻčŚăăŚăăžăăăďźnomiconďź @RalfJungăŽăăă°ć稿ăŽ1ă¤ďźďźăçăŽăă¤ăłăżăźéĺç §ăĺç §ăăăăłĺç §ăăăă¤ăłăżăźă¸ăŽĺłćĺ¤ćďźăăăăăäťăăŚďźăŤăăăăŁăźăŤăă˘ăŻăťăšăŻăăŞă確ĺŽă§ăă埡ĺśăžăăŻéłé ďźăŻçšĺĽăŞĺ ´ĺă§ăă
ĺćĺăăăŚăăŞăăăŁăźăŤăă¸ăŽć¸ăčžźăżăŽăăŽăăŞă˘ăłăăŻăget_mutďźďźăăăćŞĺŽçžŠăŽĺä˝ăăŠăŽăăăŤç¤şăăžăăďź ptr :: writeă¸ăŽćĺăŽĺźć°ăčŠäžĄăăăăłăźăăă¤ăłăă§ăăłăźăăŻĺ é¨ăăŁăźăŤăăŤďźmut _ăä˝ćăăžăăăăăăŻăăăă§ăŞăăă°ä˝ćăăăć§é ä˝ĺ ¨ä˝ă¸ăŽĺç §ă¨ĺăăăăŤćŞĺŽçžŠă§ăăĺż čŚăăăăžăă ăłăłăă¤ăŠăŻăăăăăă§ăŤĺćĺăăăçść ăŤăăă¨ćłĺŽăăăă¨ă訹ĺŻăăăăšăă§ăŻăăăžăăăďź
ă¨ăŚăčŻă質ĺă§ăďź ăăăăŽć¸ĺżľăă httpsďź//github.com/rust-lang/rfcs/pull/2582ăéăăççąăŽ1ă¤&mut
ä˝ćăăă *mut
ăžăă
@mjbshawTouchĂŠ ă ăŻăăć§é ä˝ăăăăŻăăăĺŻč˝ć§ăŤă¤ăăŚăŻćŁăăă¨ćăăžăăăăŽăăă ptr::write_unaligned
ăĺż
čŚă§ăă 丝ăŤéăłăć§é çŠăăžă 使ç¨ăăŚăăŞăăăăăăăžă§čăăăă¨ăŻăăăžăăă§ăăă ăžă ăŽĺ ´ĺăăăăŻăăăă糸ăăăŽĺşăŞă糸ăăă§ăăăŻăă§ăă
硨éďźé˘éŁăă糸ăăăčŚĺ˝ăăăŞăăŽă§ăĺéĄăé俥ăăžăăďź https ďź
éć¨ĺĽ¨ăŽmem::zeroed
éć¨ĺĽ¨ăŤăăăăăŤPRăéăăžăăďź https ďź
ç§ăŻRFCăŞăă¸ăăŞă§ĺéĄăéăăŚăĺŽĺ
¨ăŞăĄă˘ăŞăźăĺăŤé˘ăăč°čŤăăăŠăźăŻăăžăăăăăŽĺéĄăŽăăčŻă解湺çăĺžăăăăăăăćçšă§mem::zeroed
ăéć¨ĺĽ¨ăŤăăăă¨ăă§ăăžăďź //github.com / rust-lang / rfcs / issues / 2626
const uninitialized
ă as_ptr
ăĺŽĺŽăăăăă¨ăŻĺŻč˝ă§ăăăăďź
äťăŽAPIăăăas_mut_ptr
ĺ
čĄăăŚăăžăăďź ăăăăŻç§ăŤăŻé常ăŤăăăăă§ă
äťăŽăăăŤĺŽĺŽăăžăă ăăăŤăAPIăŽćŽăăŽé¨ĺăŻä¸ăŤć§çŻă§ăăžă
as_ptr
ă¨as_mut_ptr
ä¸ä˝ăŤăăăăăĺŽĺŽăăă¨ćŹĄăŽăă¨ăĺŻč˝ăŤăŞăăžăă
crates.ioăŤMaybeUninitExt
ăăŹă¤ăăăăăĺŽĺŽăăAPIăćäžăăžă
ăăăŻçžĺ¨ăăăĺ¤ăăŽäşşă
ďźäžăă°ăĺŽĺŽçăŽăżăŽăŚăźăśăźďźă訹ĺŻăăăă¨ăŤă¤ăăŚč°čŤăăăŚăăžă
ăăŁăźăăăăŻăăĺŻăăă ăăă
çľăżčžźăżă§ăŻăă°ăăźăăŤă˘ăăąăźăżăźďźä¸ĺŽĺŽďźăŽäťŁăăăŤăéçĺ¤ć°ă使ç¨ăăžăă
ăăăăă MaybeUninit
ăăŞăă¨ăĺćĺăăăŚăăŞăăĄă˘ăŞăăŤĺ
ĽăăćšćłăŻăăăžăăă
ĺŽĺŽçăŽéçĺ¤ć°ă ăăăŤăăăĺşĺŽĺŽšéăé
罎ă§ăăŞăăŞăăžă
éçĺ¤ć°ăŽăłăŹăŻăˇă§ăłă¨ĺŽčĄćăŽéçĺ¤ć°ăŽĺćĺ
ăźăăłăšăă APIăŽăăŽăľăăťăăăĺŽĺŽăăăă¨ăăăăăŽăŚăźăšăąăźăšăŽăăăăŻă解é¤ăăăžăă
ăăăçľăżčžźăżăłăăĽăăăŁăŤă¨ăŁăŚăŠăăťăŠéčŚă§ăăăăç解ăăăăăŤă
[調ćť]ăłăăĽăăăŁăŤĺ˝źăăŽĺéĄçšă¨ăăźăşăŤă¤ăăŚĺ°ăăă ĺŽĺŽĺ
MaybeUninit
ăŻăĺŽĺŽĺăăăăăŤ2çŞçŽăŤčŚćąăăăăăŽă¨ăăŚĺşăŚăăžăăďźĺžăăŤ
const fn
çšć§ăŽéçăăďźăăăŚĺ
¨ä˝ă¨ăăŚăć°ĺăŽăăĄ7ä˝ă§çľäşăăžăă
rust-lang / *é˘éŁăŽăŞăŻă¨ăšăă WGĺ
ă§ăăăŤĺŻŠč°ăăĺžăç§ăăĄăŻăśă¤ăăăžăă
çć
çłťă¸ăŽĺ˝ąéżăäşćłăăăăăăĺ
¨ä˝ă¨ăăŚ3ä˝ăŤĺŞĺ
ăăăžăă
ďźăăŁă¨ĺäşşçăŞčŠąă§ăăăç§ăŻçľăżčžźăżĺćĺŽčĄăăŹăźă ăŻăźăŻăŽä˝ćč
ă§ă
ăăăŻăĺ
é¨ă§MaybeUninit
ă使ç¨ăăăă¨ă§ăĄăŞăăăăăăžăďźăĄă˘ăŞä˝żç¨éăŻ
ăŚăźăśăźăłăźăăĺ¤ć´ăăăŤăă˘ăăŞăąăźăˇă§ăłă10ă50ďź
ĺć¸ă§ăăžăďźă ç§
ăăăŤăŻĺ¤éăŽăżăŽč˛¨çŠćŠč˝ăćäž
ćŻćŠ-ĺăčžźăžăăŚăăă ăă§ăă¤ăćčżĺŽĺŽăăă°ăăă ă¨ćăăžă
ĺ¤éăŽăżăŽćŠč˝ăćäžăăă¨ăăŚăźăśăźăŤé俥ăăăĄăăťăźă¸ăééăŁăŚăăžăăžă
ăăŽăăăăăŽAPIăĺŽĺŽăăăŽăĺżĺž
ăĄăŤăăŚăăžăăďź
@japaricăăăŻç˘şăăŤinto_inner
ă¨ĺéăŽĺ¨ăăŽĺ˝ĺăŽč°čŤăéżăăă§ăăăă ăăăăç§ăŻăžă ăťăăłăăŁăăŻăŞč°čŤăŤă¤ăăŚĺżé
ăăŚăăžăăăă¨ăă°ă let r = &mut *foo.as_mut_ptr();
ăĺŽčĄăăŚăăăăăćĺšăŞĺç
§ăăăă¨ä¸ťĺźľăăŚăăäşşă
ăŤă¤ăăŚă§ăăăĺç
§ăŽćĺšć§čŚäťśăä˝ă§ăăăăŻăžă ăăăăžăăăçĄĺšăŞăăźăżă¸ăŽĺç
§ăăăăăŠăăăŻăžă ăăăăžăă-UBă ĺ
ˇä˝çăŞäžďź
let x: MaybeUninit<!> = MaybeUninit::uninitialized();
let r: &! = &*x.as_ptr() // is this UB?
ăăŽč°čŤăŻăUCGWGă§ćčżĺ§ăžăŁă
ç§ăŽćăżăŻăĺćĺăăăŚăăŞăăăźăżăŽéŠĺăŞăšăăźăŞăźăĺăăĺä¸ăŽä¸č˛Ťăăăăăăąăźă¸ăă§MaybeUninit
ăĺŽĺŽăăăäşşă
ăăăăăŽăă¨ăĺ°ăăă¤ăŞăŞăźăšăăăŽă§ăŻăŞăăä¸ĺşŚă ăĺĺŚçżăăĺż
čŚăăăăă¨ă§ăăăăăźăšă¨ĺ¤ĺéä¸ă§ăăă¤ăăŽăŤăźăŤăĺ¤ć´ăăĺż
čŚăăăăžăă ăăăăăăăŻčŻăčăă§ăŻăŞăăăăăăžăăăçžçśăćšĺăăăăăŤä˝ăăĺşăăă¨ăăăéčŚă§ăăďź
ăăăăăăăăŤăăŚăă httpsďź//github.com/rust-lang/rfcs/pull/2582ăĺăĺ ĽăăĺăŤä˝ăĺŽĺŽăăăăšăă§ăŻăŞăă¨ćăăŞăăă¨ă確ĺŽăŤäşşă ăŤäźăăăă¨ăă§ăăžăă
let x: MaybeUninit<(!, u32)> = MaybeUninit::uninitialized();
let r1: *const ! = &(*x.as_ptr()).1; // immediately coerced to raw ptr, no UB
let r2 = &(*x.as_ptr()).1 as *const !; // immediately cast to raw ptr, no UB
ďźăă¤ăăŽăăăŤă !
ăŻăăă§ăŻčľ¤ăăăˇăłă§ăăăăăŽć稿ăŽăăšăŚăŽäžăŻă䝣ăăăŤbool
ă使ç¨ăăĺ ´ĺăUBăŤé˘ăăŚĺăă§ăăďź
ç§ăŽćăżăŻăĺćĺăăăŚăăŞăăăźăżăŽéŠĺăŞăšăăźăŞăźăĺăăĺä¸ăŽä¸č˛Ťăăăăăăąăźă¸ăă§MaybeUninităĺŽĺŽăăăäşşă ăăăăăŽăă¨ă1ă¤ăă¤ăŞăŞăźăšăăăŽă§ăŻăŞăăä¸ĺşŚă ăĺĺŚçżăăĺż čŚăăăăă¨ă§ăăăéä¸ă§ăăă¤ăăŽăŤăźăŤăĺ¤ć´ăăžăă
ăăŽč°čŤăŻé常ăŤčŞŹĺžĺăăăă¨ćăăžăă
ćă塎ă迍ăŁăĺż
čŚć§ăŻăUBăŞăă§ĺćĺăăăŚăăŞăăĄă˘ăŞăĺŚçăăćšćłăŤă¤ăăŚć確ăŞăĄăăťăźă¸ăäźăăăă¨ă ă¨ćăăžăă ăăăçžĺ¨ĺăŤăçăŽăă¤ăłăżăźă¨ptr::read_unaligned
ă¨ptr::write_unaligned
ăă§ăăĺ ´ĺăăăăŻĺéĄăăăžăăăăĺćĺăăăŚăăŞăăšăżăăŻĺ¤ă¨ć§é ä˝/ăżăăŤăăŁăźăŤăă¸ăŽçăŽăă¤ăłăżăźăĺĺžăăăăăŽć確ăŞćšćłăĺż
čŚă§ăă rust-lang / rfcsďź2582 ďźăăăłăăă¤ăăŽăăăĽăĄăłăďźăŻĺ˝é˘ăŽăăźăşăćşăăăŚăăăăă§ăăă MaybeUninit
ăŻćşăăăŚăăžăăă
@scottjmaddoxăăŽRFCăŻăŠăă§ăăďźăă ăă MaybeUninit
ăŞăă¨ăĺćĺăăăŚăăŞăďźăšăżăăŻďźăĄă˘ăŞăŤéŠăăŚăăžăăďź
@RalfJungăăăŻäťĽä¸ăUBă§ăăăăŠăăăŤäžĺăăă¨ćăăžăďź
let x: bool = mem::uninitialized();
ptr::write(&x as *mut bool, false);
assert_eq!(x, false);
ç§ăŽćéťăŽĺćăŻă rust-lang / rfcsďź2582ăä¸č¨ăŽäžăćĺšăŤăăć確ăŤĺŽçžŠăăăă¨ă§ăăă ăăă§ăŻăăăžăăăďź
@scottjmaddox
let x: bool = mem::uninitialized();
ăăăŻUBă§ăă ĺç §ă¨ăŻä˝ăŽé˘äżăăăăžăăă
ç§ăŽćéťăŽĺćăŻărust-lang / rfcsďź2582ăä¸č¨ăŽäžăćĺšăŤăăć確ăŤĺŽçžŠăăăă¨ă§ăăă
ç§ăŻăăăŤĺŽĺ ¨ăŤéŠăăŚăăžăă ăăŽRFCăŻĺç §ăŽăżăŤé˘ăăăăŽă§ăă ăŞăăăăăăźăŤĺ¤ăŤă¤ăăŚä˝ăăĺ¤ăăă¨ćăăžăăďź
@RalfJung
ăăăŻUBă§ăă ĺç §ă¨ăŻä˝ăŽé˘äżăăăăžăăă
mem :: uninitializedďźďźăŽăăăĽăĄăłăăŤăŻćŹĄăŽăăăŤć¸ăăăŚăăžăă
ä˝ăăăăŤăăżă¤ăTăŽĺ¤ăçćăăăľă
ăăăĽăĄăłăăŤăŻT*
ăŤă¤ăăŚăŻä˝ăć¸ăăăŚăăžăăă
@kppä˝ăč¨ăăă¨ăăŚăăăŽďź ăăŽ1čĄăŽăłăźăăŤăŻ*
ă&
ăăăžăăă
let x: bool = mem::uninitialized();
ăŞăăăŽčĄăUBă ă¨ä¸ťĺźľăăăŽă§ăăďź
bool
ăŻĺ¸¸ăŤtrue
ăžăăŻfalse
ă§ăăĺż
čŚăăăăžăăăăăăŻăăă§ăŻăăăžăăă https://github.com/rust-rfcs/unsafe-code-guidelines/blob/master/reference/src/glossary.md#validity-and-safety-invariantăĺç
§ăăŚ
ăăŽăšăăźăăĄăłăăĺä˝ăĺŽçžŠăăăăăŽ@kpp mem::uninitialized
ăŻă_valid_ bool
ăĺŽä˝ĺăăĺż
čŚăăăăžăă
çžĺ¨ăľăăźăăăăŚăăăăšăŚăŽăăŠăăăăŠăźă ă§ă bool
ăŻ2ă¤ăŽ_valid_ĺ¤ă true
ďźăăăăăżăźăłďź 0x1
ďźă¨false
ďźăăăăăżăźăłďź 0x0
ďźăăăăăžăăă
ăă ăă mem::uninitialized
ăŻăăăšăŚăŽăăăăŽĺ¤ăuninitialized
ăăăăăăăżăźăłăçćăăžăă ăăŽăăăăăżăźăłăŻ0x0
ă§ă0x1
ă§ăăŞăăăăçľćăŽbool
ăŻ_çĄĺš_ă§ăăăĺä˝ăŻćŞĺŽçžŠă§ăă
ĺä˝ăĺŽçžŠăăăŤăŻă bool
ăŽĺŽçžŠăĺ¤ć´ăăŚă true
ă false
ăăžăăŻuninitialized
3ă¤ăŽćĺšăŞĺ¤ăăľăăźăăăĺż
čŚăăăăžăă ăă ăăT-langă¨T-compilerăŻbool
ăCăŽ_Bool
ă¨ĺä¸ă§ăăă¨ăă§ăŤRFCăčĄăŁăŚăăăăăŽäżč¨źăç ´ăăă¨ăŻă§ăăŞăăăăăăăčĄăăă¨ăŻă§ăăžăăďźăăăŤăăă bool
ăŻC FFIă§ç§ťć¤ĺŻč˝ăŤä˝żç¨ăăăžăďźă
ééăăŞăăCăŻRustă¨ăžăŁăăĺăćĺšć§ăŽĺŽçžŠăćăŁăŚăăžăăăăCăŽăăăŠăă襨çžăăŻé常ăŤčżăăăŽă§ăă ä¸č¨ă§č¨ăă°ăćŞĺŽçžŠăŽćŻăčăăĺźăłĺşăăăŤĺ¤ătrue
ăžăăŻfalse
ă襨ăăŞă_Bool
ă使ç¨ăăŚCă§ă§ăăăă¨ăŻăăžăăăăžăăă
ăăŞăăćŁăăăă°ă揥ăŽĺŽĺ ¨ăŞăłăźăăUBă§ăŞăăă°ăŞăăžăăďź
let x: bool;
x = true;
ćăăăŤăăă§ăŻăăăžăăă
ćŁăăăŞăĺ ´ĺăŻă揥ăŽĺŽĺ ¨ăŞăłăźăăUBă§ăăĺż čŚăăăăžăă
let x: bool;
ăŻx
ăuninitialized
ăăăăăżăźăłăŤĺćĺăăžăăă x
ăăžăŁăăĺćĺăăžăăă x = true;
x
ĺćĺăăžăďźćł¨ďźä˝żç¨ăăĺăŤx
ĺćĺăăŞăă¨ăăłăłăă¤ăŤă¨ăŠăźăçşçăăžăďźă
ăăăŻăăłăłăăăšăăŤĺżăăŚă _Bool x;
x
ă_indeterminate_ĺ¤ăŤĺćĺăăCăŽĺä˝ă¨ăŻç°ăŞăăžăă
ăăăăăłăłăă¤ăŠăŻx
ăĺćĺăăăŚăăŞăăă¨ăčŞčăăŚăăžăă
ĺéĄmem::uninitialized
ăăăăŻéăăăłăłăă¤ăŠăŽĺćĺ追补ăŤé˘ăăŚăŻăĺ¤ć°ăĺćĺăăŚăăăă¨ă§ăă
let x: bool;
ăŻăăăčŞä˝ă§ăŻx
ăć źç´ăăăăăŽăšăăźăšăäşç´ăăăă¨ăăăŞăăĺĺăäşç´ăăă ăă§ăă let x = foo;
ăšăăźăšăäşç´ăă foo
ă使ç¨ăăŚĺćĺăăžăă let x: bool = mem::uninitialized();
ăŻx
ç¨ăŤ1ăă¤ăăŽăšăăźăšăäşç´ăăžăăăĺćĺăăăŞăăžăžăŤăăžăăăăăŻĺéĄă§ăă
ăăăŻăčă§č¨č¨ăăăAPIăćŽĺ˝ąăăăăăŽé常ăŤç°ĄĺăŞćšćłă§ăăăăămem :: uninitializedă¨çľăżčžźăżé˘ć°:: uninităŽä¸Ąćšă§ămem :: uninitializedăŤçšĺăăŚćć¸ĺăăĺż
čŚăăăăžăă
ăžăămem :: uninitializedă使ç¨ăăŚboolăĺŤăć§é ä˝ăĺćĺăăăă¨ăUBă§ăăăă¨ăćĺłăăžăăďź
@kpp
ăžăămem :: uninitializedă使ç¨ăăŚboolăĺŤăć§é ä˝ăĺćĺăăăă¨ăUBă§ăăăă¨ăćĺłăăžăăďź
ăŻă-ăăăăăć°ăĽăăăăăăžăăăă mem::uninitialized
ăăă¨ăčśłăćă¤ăŽăŻç°Ąĺă§ăăćŁăă使ç¨ăăăă¨ăŻăťă¨ăăŠä¸ĺŻč˝ă ă¨č¨ăŁăŚăéč¨ă§ăŻăăăžăăă ăăŽăăă MaybeUninit
ăĺŞĺ
ăăŚéć¨ĺĽ¨ăŤăăăă¨ăăŚăăžăăăăăŻă使ç¨ăăăŽăĺ°ăĺéˇă§ăăăăŚăăŞăłă§ăăăăăĺŽéăŤĺ
ˇä˝ĺăăăŤĺ¤ăăăăźăăă¨ăŤăĺćĺă§ăăă¨ăăĺŠçšăăăăžăăĺ¤čŞä˝ăŻ_çĄĺš_çść
ă§ăă ĺ¤ăŻă into_inner()
ĺźăłĺşăăžă§ăŤĺŽĺ
¨ăŤ_ćĺš_ă§ăăĺż
čŚăăăăžăă
ăă§ăăŻăăăăăăłăă§ăăŻăăăŚăăŞăďźéďźĺćĺăŤé˘ăăăăăłăłăŽăťăŻăˇă§ăłăčŞăăă¨ăŤčĺłăăăăăăăăžăăďź https ďź//doc.rust-lang.org/nomicon/checked-uninit.htmlăăăăŻlet x: bool;
ĺćĺăŽćšćłăăŤăăźăăŚăăžăĺŽĺ
¨ăŞRustă§ĺä˝ăăžăă 誏ćăăŻăŁăăăăŞăĺ ´ĺăăăăăŞăăă¨ăăăĺ ´ĺăŻăč¨ĺ
ĽăăŚăă ăăă ăžăăRFCăăăťăšăăžă ééăăŚăăŞăăăăăťă¨ăăŠăŽčŞŹćăŻăéčŚçŻçăă§ăăăă¨ăŤćł¨ćăăŚăă ăăă ĺŽĺ
¨ă§ăŞăăłăźăăŹă¤ăăŠă¤ăłWGăŻăRFCćć¸ăćĺşăăäťĺš´ä¸ăŤçžĺ¨ăŽĺä˝ăäżč¨źăăăă¨ăăžăă
ăăăŻăčă§č¨č¨ăăăAPIăćŽĺ˝ąăăăăăŽé常ăŤç°ĄĺăŞćšćłă§ăăăăămem :: uninitializedă¨intrinsics :: uninităŽä¸Ąćšă§ćć¸ĺăăĺż čŚăăăăžăă
ĺéĄăŻăçžĺ¨ăăăčĄăćŁăăćšćłăăŞăăă¨ă§ăăăăŽăăă MaybeUninit
ĺŽĺŽăăăŚăăăăăŽé˘ć°ăŽăăăĽăĄăłăă太ăă使ç¨ăăŞăă§ăă ăăăăŤç˝Žăćăăăă¨ăă§ăăăăăŤĺŞĺăăŚăăžăă
ăăă¨ĺć§ăŽĺéĄăŞăŠăŽč°čŤăăăŽç§ăăĄăŻă§ăăă ăćŠăăăă˘ăŽĺ¤ăŤä˝ăăĺĺžăăĺż čŚăăăăă¨ă@japarică§ăăăĺ¤ăăŽĺćă確čŞăăžăă ĺşćŹçăŤăăăă¨ăăŽăă§ăăŻăăăŻăšăŽăŞăšăăăă§ăăŻăăĺż čŚăăăăžăă 揥ăŤăăăă¤ăăŽĺşćŹçăŞăăżăźăłăćäžăăăŽăŤĺĺăŞéăăăăžăă
const uninitializedăas_ptrăăăłăĺŽĺŽĺăăăă¨ăŻĺŻč˝ă§ăăăă
äťăŽAPIăăăĺăŤas_mut_ptrďź ăăăăŻç§ăŤăŻé常ăŤăăăăă§ă
äťăŽăăăŤĺŽĺŽăăžăă
ăăŽăăăŤ+1ă ăăŽćŠč˝ăĺŽĺŽçă§ĺŠç¨ă§ăăă¨äžżĺŠă§ăă ăăăŤăăăäşşă ăŻăăŽĺşćŹçăŞä˝ăŹăăŤăŽAPIăŤĺ ăăŚăăăžăăžăŞéŤăŹăăŤăŽďźăăăŚć˝ĺ¨çăŤĺŽĺ ¨ăŞďźAPIă芌ăăă¨ăă§ăăžăă ăăăŚăAPIăŽăăŽĺ´é˘ăŻăăŞăč°čŤăŽä˝ĺ°ăăŞăăăă§ăă
ăăăŤă get_ref
ă¨get_mut
ăŻćąşăăŚĺŽĺŽăăăĺŽĺ
¨ăŤĺé¤ăăăăă¨ăăĺ§ăăăžăă é常ăĺç
§ăćä˝ăăćšăçăŽăă¤ăłăżăźăćä˝ăăăăăĺŽĺ
¨ă§ăďźăăăăŁăŚăĺŽĺ
¨ă§ăŞăă¨ăăźăŻăăăŚăăŚăă as_ptr
ăăăłas_mut_ptr
čś
ăăŚăăăăŽăĄă˝ăăă使ç¨ăăăăŞăĺŻč˝ć§ăăăăžăďźăăăăŽĺ ´ĺăŻăă¤ăłăżăźăĄă˝ăăăŻUBăĺźă辡ăăĺŻč˝ć§ăăăăŽăŤĺŻžăăçăŽăă¤ăłăżăźăĄă˝ăăăăăĺłĺŻăŤĺąéşă§ăă
ăŤăźăŤăăĺćĺăăăŚăăŞăăĄă˘ăŞă¸ăŽĺç §ăä˝ćăăăă¨ăăŞăăăŽĺ ´ĺăĺ é¨ă§čĄăăăŤăăźăĄă˝ăăă使ç¨ăăăŽă§ăŻăŞăăć示çăŤä˝ćăăăă¨ăŤăăŁăŚăŽăżăăŽăăăŞĺç §ăä˝ćă§ăăăăăŤăăăă¨ă§ăăăŽăŤăźăŤăŤćşć ă§ăăăăăŤăăĺż čŚăăăă¨ćăăžăă ă
https://github.com/rust-lang/rfcs/pull/2582ă¨äťŽĺŽăăă¨ăďź2ďźăŻUBă§ăăăďź1ďźăŤăŻăă¤ăłăżăźăŽĺç §č§Łé¤ăĺŤăžăăŚăăăŤăăăăăăăďź1ďźăŻUBă§ăăŞăăă¨ăĺŽĺ ¨ăŤç˘şäżĄăăŚăăžăăăăăŻĺćĺăăăŚăăŞăăĄă˘ăŞăćăăŚăăžăăďź
ďź1ďź unsafe { ptr::write_unaligned(&mut ((*uninit_foo.as_mut_ptr()).bar) as *mut bool, true); }
ďź2ďź let x: bool = mem::uninitialized();
ăăăăăŞăăăăŽčĺžăŤăăăă¸ăăŻăŻä˝ă§ăăďźăăžăăăă°ăăăŽĺéĄăŤé˘ăăč°čŤăŽä¸é¨ăMaybeUninităŽăăăĽăĄăłăăŤĺ Ľăăăă¨ăă§ăăžăďźďź ďź1ďźă§ăŻéĺç §ăăăĺ¤ăŻĺ¸¸ăŤăĺłčžşĺ¤ăăŽăžăžă§ă塌螺ĺ¤ăăŤăŞăăă¨ăŻăŞăăŽăŤĺŻžăăďź2ďźă§ăŻçĄĺšăŞăăźăŤĺ¤ăă塌螺ĺ¤ăăŤăŞăăăăĺŽéăŤăŻăĄă˘ăŞĺ ă§ĺŽä˝ĺăăĺż čŚăăăăăă§ăă ďźRustă§ăăăŽćŁăăç¨čŞăä˝ă§ăăăăŻăăăăăăžăăăăăăăăŽç¨čŞăC ++ă§ä˝żç¨ăăăŚăăăŽăčŚăžăăďźă
ăăăŚăăăăăăăŽćˇˇäšąăéżăăăăăŤăăăŁăźăŤăă¸ăŽçăŽăă¤ăłăżăźăŤç´ćĽčŠäžĄăăăçăŽăă¤ăłăżăźăŽăăŁăźăŤăă˘ăŻăťăšć§ćăŽRFCăä˝ćăă䞥ĺ¤ăăăă¨čăăäşşăŻăăžăăďź
ăŤăźăŤăăĺćĺăăăŚăăŞăăĄă˘ăŞă¸ăŽĺç §ăä˝ćăăăă¨ăăŞăăĺ ´ĺ
ăăăăŤăźăŤă§ăăăšăă§ăŻăŞăă¨ćăăžăăăăăăăăăăžăăă çžĺ¨ăUCGă§č°čŤăăăŚăăžăă
ďź2ďźăŻUBă§ăăăďź1ďźăŻĺćĺăăăŚăăŞăăĄă˘ăŞăćăăă¤ăłăżăŽĺç §č§Łé¤ăĺŤăžăăŚăăăŤăăăăăăăďź1ďźăŻUBă§ăăŞăăă¨ăĺŽĺ ¨ăŤç˘şäżĄăăŚăăžăăďź
čŻă質ĺďź ăăăăăŻăăç§ăăĄăŻ-ĺşćŹçăŤăăăćăŽĺż
čŚć§ăăă§ăă &mut foo as *mut bool
ă&raw mut foo
ăăżă¤ă*mut bool
ă˘ăăăăŻĺźă¨čăăŚăă ăăă ăăăŤăŻĺç
§ăŻăŞăăĺćĺăăăŚăăŞăăĄă˘ăŞă¸ăŽçăŽptră ăă§ă-ăăăŚăăăŻééăăŞă大ä¸ĺ¤Ťă§ăă
let x: bool = mem::uninitialized();
ăăăŻUBă§ăă ĺç §ă¨ăŻä˝ăŽé˘äżăăăăžăăă
ç§ăŽćéťăŽĺćăŻă rust-lang / rfcsďź2582ăä¸č¨ăŽäžăćĺšăŤăăć確ăŤĺŽçžŠăăăă¨ă§ăăă
ç§ăŻăăăŤĺŽĺ ¨ăŤéŠăăŚăăžăă ăăŽRFCăŻĺç §ăŽăżăŤé˘ăăăăŽă§ăă ăŞăăăăăăźăŤĺ¤ăŤă¤ăăŚä˝ăăĺ¤ăăă¨ćăăžăăďź
@RalfJungćĺšăŞăăźăŤĺ¤ă§ăăăŤä¸ć¸ăăăăăăăćŞĺŽçžŠăŽĺ¤ă茳渏ă§ăăŞăăŁăăăăUBă§ăŻăŞăă¨ćăŁăă¨ćăăžăă ăăăăăăă§ăŻăŞăă¨ćăăžăăďź
xăŽĺ¤ăDropăĺŽčŁ ăăăăč¤éăŞäžă§ăŻăĺ¤ăä¸ć¸ăăăăăăŤrawăă¤ăłăżăźăĺż čŚăŤăŞăăăăUBăĺéżăăăăăŤrfc2582ăĺż čŚă§ăăă¨čăăžăăă
ćĺšăŞăăźăŤĺ¤ă§ăăăŤä¸ć¸ăăăăăăăćŞĺŽçžŠăŽĺ¤ă茳渏ă§ăăŞăăŁăăăăUBă§ăŻăŞăă¨ćăŁăă¨ćăăžăă ăăăăăăă§ăŻăŞăă¨ćăăžăăďź
ăťăăłăăŁăŻăšăŻăšăăźăăĄăłăăă¨ăŤé˛čĄăăžăďźMIRăčŚăŚăă ăăďźă ăăšăŚăŽăšăăźăăĄăłăăŻćĺłăăŞăăŞăăă°ăŞăăžăăă let x: bool = mem::uninitialized();
ăŻćŞăăăźăŤĺ¤ăĺ
ˇä˝ĺăăžăăăăăŚĺžă§ä˝ă辡ăăăăŻĺéĄă§ăŻăăăžăă-ăăŞăăŻćŞăăăźăŤĺ¤ăĺ
ˇä˝ĺăăŚăŻăăăžăăă
xăŽĺ¤ăçĄĺšă§ăăăă¨ăŻç解ăăŚăăžăăăćŞĺŽçžŠăŽĺä˝ăĺż čŚă§ăăďź ç§ăŻăăăä¸čŹçăŤăŠăŽăăăŤćčăăĺ¤ăăăă¨ăă§ăăăăčŚăăă¨ăă§ăăžăă ăăăăăăŽçšĺŽăŽäžăŽăłăłăăăšăă§ăŻăĺä˝ăŻć確ăŤĺŽçžŠăăăŚăăžăăăďź ç§ăŽĺşćŹçăŞăăłă°ă˘ăăăŻăăćŞĺŽçžŠăŽćŻăčăăăŽćĺłăĺŽĺ ¨ăŤç解ăăŚăăŞăăă¨ă ă¨ćăăžăă
ăłăłăă¤ăŠăçšĺŽăŽä¸ĺ¤ćĄäťśăŤäžĺă§ăăăăăŤăăĺż čŚăăăăžăă ăăăăŻă常ăŤćçŤăăĺ ´ĺăŤăŽăżä¸ĺ¤ă§ăă äžĺ¤ăčż˝ĺ ăĺ§ăăă¨ăăăăŻćˇˇäšąăŤăŞăăžăă
ăĺ¤ăć¤ćťăăăŤăŻăćĺšć§ăŽä¸ĺ¤ćĄäťśăäżćăăĺż
čŚăăăăă¨ăă形ĺźăŽä˝ăăćĺž
ăăŚăăăăăăăžăăă ăăă§ă bool
ăăć¤ćťăăăă¨ă if
ăžăă ăăăŻĺŚĽĺ˝ăŞäťć§ă§ăăăăăžăćç¨ă§ăŻăăăžăăăăłăłăă¤ăŠăŻăä¸ĺ¤ćĄäťśăćłĺŽăăĺăŤăĺ¤ăĺŽéăŤăć¤ćťăăăăŚăăăă¨ă訟ćăăĺż
čŚăăăăžăă
ăăăŻćŞĺŽçžŠăŽćŻăčăăĺż čŚă¨ăăžăăďź
ćŞĺŽçžŠăŽćŻăčăă¨ăŻä˝ăăé¸ăłăžăă ăăăŻč¨čŞăŽč¨č¨ăŽä¸é¨ă§ăă ćŞĺŽçžŠăŽĺä˝čŞä˝ăăĺż čŚăăŤăŞăăă¨ăŻăťă¨ăăŠăăăžăăăăăăĺ¤ăăŽćéŠĺăćĺšăŤăăĺż čŚăăăăžăă ăăăăŁăŚăăăă§ăŽćčĄăŻăĺż čŚăŞćéŠĺăĺŻč˝ăŤăăďźĺŽĺ ¨ă§ăŞăďźăăă°ăŠăăźăŽćĺž ăŤćşć ăăćŞĺŽçžŠăŽĺä˝ăŽĺŽçžŠăčŚă¤ăăăă¨ă§ăďźăăăŻčăăăăăăăăžăă^^ďźă
ăćŞĺŽçžŠăŽćŻăčăăăŽćĺłăăăăăăăžăăă
ç§ăŻăăăŤă¤ăăŚăăă°č¨äşăćŞĺŽçžŠăŽćŻăčăăŻăăŞăă¨ăłăłăă¤ăŠăŽéăŽĺĽç´ă§ăăă¨ăăăă¨ă§ă-ăăăŚĺĽç´ăŻćŞĺŽçžŠăŽćŻăčăă辡ăăăŞăăă¨ă確čŞăăăŽăŻăăŞăăŽçžŠĺă§ăăă¨č¨ăŁăŚăăžăă ăăăŻč¨źć瞊ĺă§ăă ăNULLăă¤ăłăżăźăŽéĺç §ăŻUBă§ăăăŻăăăă¤ăłăżăźăéĺç §ăăăăăłăŤăăăă°ăŠăăźăŻăăŽăă¤ăłăżăźăNULLăŤăŞăĺŻč˝ć§ăăŞăăă¨ă訟ćăăăă¨ăćĺž ăăăžăăă¨č¨ăăă¨ă¨ĺăă§ăă ăăăŻăăłăłăă¤ăŠăźăăłăźăăç解ăăăŽăŤĺ˝šçŤăĄăžăăăă¤ăłăżăźăéĺç §ăăăăăłăŤăăłăłăă¤ăŠăźăŻăăăďźăăă§ăăă°ăŠăăźăŻăă¤ăłăżăźăNULLă§ăŞăăă¨ă訟ćăăăŽă§ăăăŽć ĺ ąăćéŠĺă¨ăłăźăçćăŤä˝żç¨ă§ăăăăă§ăăăăăă¨ăăăăăžăă ăăăă°ăŠăăźďźă
ĺĽç´ć¸ăŤćŁç˘şăŤć¸ăăăŚăăăă¨ăŻăăăă°ăŠăăłă°č¨čŞćŹĄçŹŹă§ăă ăăĄăăăĺśç´ăăăăžăďźăă¨ăă°ăLLVMăŤăăŁăŚĺśç´ăăăžăďźă ç§ăăĄăŽĺ ´ĺăUCGăŻďźč¨čŞăăźă ă¨ăłăłăă¤ăŠăăźă ăăčăăă¨ăăăŤăăă¨ďźĺĽç´ăŤćŹĄăŽĺĽăĺŤăăĺż čŚăăăă¨čăăŚăăžăăăĺłčžşĺ¤ăä˝ćăăăăăłăŤăăăă°ăŠăăŻăăŽĺłčžşĺ¤ă常ăŤĺĺ¨ăăăă¨ă訟ćăăĺż čŚăăăăžăă匼ĺ˝ć§ăŽä¸ĺ¤ćĄäťśăćşăăăžăăă ĺĽç´ăŤăăŽćĄé ăĺŤăăăă¨ă埡ĺśăăçŠçćłăăłăłăăĽăźăżăźćłăŻăăăžăăăăĺ¤ăăŽç°ăŞăé¸ćč˘ăŽéăŽĺççăŞĺŚĽĺçšă¨čŚăŞăăăžăă
çšăŤăĺźąăĺĽç´ă§ăŻćŁĺ˝ăŤçşäżĄă§ăăŞăăŁăLLVMăŽć
ĺ ąăăă§ăŤçşäżĄăăŚMaybeUninit
使ç¨ăăĺż
čŚăăăăžăăă¨ăăăšăŚăŽăłăźăăăăĺ°ăŞăćéŠĺă§ăăăăŽăŠăĄăăăé¸ćăăă¨ăĺč
ăŻăăčŻăé¸ćăŽăăăŤă
ăăŞăăŽäžăĺăďź
let x: bool = mem::uninitialized();
ăăŽăłăźăăŻăäťćĽăŽrustcăŽUBă§ăă mem::uninitialized::<bool>()
ăŽďźćéŠĺăăăŚăăŞăďźLLVM IRăčŚăă¨ă揥ăŽăăăŤăŞăăžăă
; core::mem::uninitialized
; Function Attrs: inlinehint nonlazybind uwtable
define zeroext i1 @_ZN4core3mem13uninitialized17h6c99c480737239c2E() unnamed_addr #0 !dbg !5 {
start:
%tmp_ret = alloca i8, align 1
%0 = load i8, i8* %tmp_ret, align 1, !dbg !14, !range !15
%1 = trunc i8 %0 to i1, !dbg !14
br label %bb1, !dbg !14
bb1: ; preds = %start
ret i1 %1, !dbg !16
}
; snip
!15 = !{i8 0, i8 2}
ĺşćŹçăŤăăăŽé˘ć°ăŻăšăżăăŻăŤ1ăă¤ăăĺ˛ăĺ˝ăŚăŚăăăăăŽăă¤ăăăăźăăăžăă ăă ăăč˛ čˇăŻ!range
ă§ăăźăŻăăăžăăăăăŻăăă¤ăă0 <= x <2ăŽéă§ăŞăăă°ăŞăăŞăăă¨ăă¤ăžă0ăžăăŻ1ăŽăżă§ăăăă¨ăLLVMăŤéçĽăăžăăLLVMăŻăăăçă§ăăăĺä˝ăĺŽçžŠăăăŚăăŞăă¨čŚăŞăăžăăăăŽĺśç´ăŤéĺăăĺ ´ĺă
čŚç´ăăă¨ăĺéĄăŻĺćĺăăăŚăăŞăĺ¤ć°čŞä˝ă§ăŻăŞăăĺăŽĺśç´ăŤéĺăăĺ¤ăăłăăźăăăłç§ťĺăăŚăăă¨ăăäşĺŽă§ăă
ĺ茧äźăăăă¨ăăăăăžăăďź äťă§ăŻăŻăăăŤć確ă§ăďź
ç§ăŽĺşćŹçăŞăăłă°ă˘ăăăŻăăćŞĺŽçžŠăŽćŻăčăăăŽćĺłăĺŽĺ ¨ăŤç解ăăŚăăŞăăă¨ă ă¨ćăăžăă
ăăŽä¸éŁăŽăăă°ć稿ďź2çŞçŽăŽć稿ăŤăŻăăŞăčĺłćˇąă/ćăäžăăăăžăďźăŻé常ăŤĺ˝šçŤăĄăžăďź http ďź
ăăăŤăŻćŹĺ˝ăŤčŻăăăăĽăĄăłăăĺż
čŚă ă¨ćăăžăă ăăă§ăŽĺ¤ć´ăŻăăŞăšăă§ăăăăă¤ăăŽççąă¨ăăŞăšăă§ăăŞăäťăŽççąăăăăăăăčŻăăă¨ă§ăă ăă ăăĺćĺăăăŚăăŞăăĄă˘ăŞăŽćŁăă使ç¨ďźăăăłăăŽäťăŽĺŽĺ
¨ă§ăŞăăĄă˘ăŞăŽä˝żç¨ďźăŻăé常ăŤç´ćăŤĺăăĺŻč˝ć§ăăăăžăă NomiconăŤăŻuninitialized
ăŤé˘ăăăťăŻăˇă§ăłăăăăžăďźăăăăăăŽăżă¤ăăŤă¤ăăŚčŠąăăăăŤć´ć°ăăăă§ăăăďźăăĺéĄăŽĺŽĺ
¨ăŞč¤éăă襨çžăăŚăăŞăăăă§ăă
ďźç§ăăăŽăăăŞćć¸ăć¸ăăă¨ăĺżéĄăăŚăăăăă§ăŻăăăžăăăç§ăŻćĺăăžă...ç§ăăăăăăŤă¤ăăŚăăŁă¨çĽăŁăŚăăäşşăŻčŞ°ă§ăăďź
https://github.com/rust-lang/rust/issues/55422#issuecomment -433943803ăăăŽčĺłćˇąăă˘ă¤ăă˘ďź into_inner
ăăăŞăĄă˝ăăăé˘ć°ăŤĺ¤ćă§ăăăăă MaybeUninit::into_inner(foo)
ăč¨čż°ăăĺż
čŚăăăăžăă foo.into_inner()
MaybeUninit::into_inner(foo)
䝣ăăăŤfoo.into_inner()
-ä˝ă辡ăăŁăŚăăăăăŻăăăŤć確ăŤćć¸ĺăăžăă
ă§https://github.com/rust-lang/rust/pull/58129ç§ăŻăăă¤ăăŽăăăĽăĄăłăăčż˝ĺ ăăŚăăčżă&mut T
ăăset
ă¨ĺĺăŽĺ¤ć´into_inner
ăŤinto_initialized
ă
ăăŽĺžă httpsďź//github.com/rust-lang/rust/pull/56138ă解湺ăăăăăAPIăŽä¸é¨ďźăłăłăšăăŠăŻăżăźă as_ptr
ă as_mut_ptr
ĺŽĺŽĺăŤé˛ăăă¨ăă§ăăă¨ćăăžăă set
ă into_initialized
ďźă
MaybeUninit::zeroed()
ăconst fn
ăŻăŞăăŽăŻăŞăă§ăăďź ďź MaybeUninit::uninitialized()
ăŻconst fn
ďź
硨éďźăăăŻĺŽéăŤćŻćŠăŽRustă使ç¨ăăŚconst fn
ăŤăăăă¨ăă§ăăžăăďź
MaybeUninit::zeroed()
ăconst fn
ăŻăŞăăŽăŻăŞăă§ăăďź ďźMaybeUninit::uninitialized()
ăŻconst fn
ďź
@gnzlbg芌ăăžăăăă揥ăŽăăăăăĺż čŚă§ăă
init
çľăżčžźăżăŽconst fn
ăžăă ăăăŻĺŽčĄĺŻč˝ă§ăăăăŠăŤăăŻăăăĺŽčĄăăăă¨čŠŚăżăžăă ăžăăŻstd::ptr::write_bytes
ăconst fn
ăžăă ăăăŤăŻă const
ă§&mut
ăĺăĺż
čŚăăăăžăăăçžĺ¨ăăăŤĺŽĺŽĺăŤç§ťčĄăăăă¨ăŤă¤ăăŚç§ăćăĺżé ăăŚăăăă¨ăŽ1ă¤ăŻăĺŽéăŤăăŽăżă¤ăă使ç¨ăăŚăăäşşă ăăăŽăăŁăźăăăăŻăăžăŁăăăŞăăă¨ă§ăă 誰ăă使ăĺ§ăăĺăŤăăăĺŽĺŽăăăŽăĺž ăŁăŚăăăăă§ăă ăăăŻăAPIăŽĺéĄăŤć°äťăăŽăé ăăăăă¨ăćĺłăăăăăĺéĄă§ăă
@ rust-lang / libsăĄă˝ăăăŽäťŁăăăŤé˘ć°ă使ç¨ăăé常ăŽćĄäťśăŻä˝ă§ăăďź ăăă§ăŽćä˝ăŽä¸é¨ăŻăăă¨ăă°MaybeUninit::as_ptr(...)
ăăăŤăäşşă
ăč¨čż°ăăŞăăă°ăŞăăŞăé˘ć°ă§ăăĺż
čŚăăăăŽă§ăŻăŞăăă¨ćăăžăă ăăăăłăźăăçç ´ăăŚčŞăăŞăăŞăăŽă§ăŻăŞăăă¨ĺżé
ăăŚăăžăăăOTOHă ManuallyDrop
ä¸é¨ăŽé˘ć°ăŻăžăăŤăăăĺŽčĄăăžăăă
@RalfJungç§ăŽç解ă§ăŻăăŚăźăśăźăŽĺăăăĄă˝ăăăé ăăă¨ăéżăăăăăŤăă¸ă§ăăŞăăŻăăŠăĄăźăżăźăĺç
§ăăŞăăăŽă§ăŻăĄă˝ăăăŻéżăăăăžă-ăăăăŁăŚManuallyDrop::take
ă
MaybeUninit<T>
ăDeref<Target = T>
ăŤăŞăăă¨ăŻćąşăăŚăŞăăŽă§ăăăă§ăŻćšćłăéŠĺă ă¨ćăăžăă
ăăŁăźăăăăŻăćąăăă°ăăăŞăăăăŻĺăĺăă§ăăăă ç§ă使ç¨MaybeUninit
ăŽć°ćŠč˝ăĺŽčŁ
ăăăăăŤstd
ćčżă
get_mut
ééăŁăŚä˝żç¨ăăžăăăăĺç
§ă¨çăŽăă¤ăłăżăźăŻĺçă§ăăă¨čăăŚăăžăăďź928efca1ă§äżŽćŁăăăžăăďźă ç§ăŻăă§ăŤĺąéşăŞăăăăŻăŤăăăŽă§ăćĺăŻéăăŤć°ăĽăăžăăă§ăăăconst fn new()
ăŽăăăăăżăźăłăCăăăăźăăĄă¤ăŤăŽé
ĺĺćĺĺă¨ĺăă§ăăăă¨ă確čŞăăŚăăžăă zeroed
çśăăŚset
ă使ç¨ăăŚăăăăłăăąă˘ăăăăă0ă§ăăăă¨ă確čŞăăăă¨ăăŚăăžăăăăăćŁăă使ç¨ćłăăŠăăăŻăăăăžăăăăćŁĺ¸¸ăŤćŠč˝ăăŚăăăăă§ăă ăout.get_mut() as *mut _
ďź= out.as_mut_ptr()
ĺ ´ĺăç§ăŻé常ăŤćˇˇäšąăăžăă ćŹĺ˝ăŤC ++ăŁă˝ăčŚăăžăă ăŞăă¨ă俎ćŁăăăă¨ăăă§ăăăget_mut()
ăŽăă¤ăłăăŻä˝ă§ăăďź
ćčżç§ăçĺăŤćăŁăŚăăăŽăŻă MaybeUninit<T>
ăT
ă¨ĺăăŹă¤ă˘ăŚăă§ăăăă¨ăäżč¨źăăăŚăăăăŠăăăăăăŚăăŽăăăŞăăŽă使ç¨ăăŚăăźăăŽĺ¤ăé¨ĺçăŤĺćĺăăŚăăĺŽĺ
¨ăŤĺ¤ćă§ăăăăŠăăĺŽĺ
¨ăŞéăłĺ ´ďźăŽăăăŞăăŽ
struct Foo {
x: i32,
}
let mut partial: Box<MaybeUninit<Foo>> = Box::new(MaybeUninit::uninitialized());
let complete: Box<Foo> = unsafe {
ptr::write(&mut (*partial.as_mut_ptr()).x, 5);
mem::transmute(partial)
};
MiriăŤăăă¨ăăăŽäžăŻćŠč˝ăăžăďźăă ăăĺăăŹă¤ă˘ăŚăăŽăżă¤ăăŽăăăŻăšăĺ¤ćăăăă¨čŞä˝ăéŠĺăăŠăăăŻăăăăžăăďźă
@ Nemo157 into_inner
ăăăăŽăŤăăŞăĺăăĄă˘ăŞăŹă¤ă˘ăŚăăĺż
čŚăŞăŽă§ăăďź
@PzixelăŻăĺćĺĺžăŤĺ¤ăăłăăźăăăŞăăăăŤăăăăăŤăăšăżăăŻăŤĺ˛ăĺ˝ăŚăăăĺ ´ĺăŤăšăżăăŻăŞăźăăźăăăźăĺźă辡ăă100MBăŽăăăăĄăĺŤăžăăŚăăă¨ćłĺăăŚăă ăăă ăă ăăăăšăăąăźăšăä˝ćăăăŤăŻăăšăżăăŻăŤč§ŚăăăŤĺćĺăăăŚăăŞăăăăŻăšăĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăăŤăčż˝ĺ ăŽAPI fn uninit_boxed<T>() -> Box<MaybeUninit<T>>
ĺż
čŚăŤăŞăăăă§ăă
使ç¨ăăŚbox
使ç¨ăăăă¨ăăă¨ăăăăŞăăŻăăŽä˝ĺăŽăăăŞăăŽć ¸ĺ¤ćăčŚăăă¨ăă§ăăžăĺćĺăăăŚăăŞăăăźăé ĺăĺ˛ăĺ˝ăŚă§ăăăăăŤć§ćăinto_initialized
ăšăżăăŻăŞăźăăźăăăźăçşçăăžăéăłĺ ´
@ Nemo157ăłăăźăćéŠĺăăăăăŤăăłăłăă¤ăŠă埡ĺśăăćšăčŻăăŽă§ăŻăŞăă§ăăăăă ă¨ăŤăăăăăčĄăăšăă ă¨ćăăžăăăăłăłăă¤ăŤăăăăčĄăăă¨ăäżč¨źăăĺąć§ăăăăăăăăžăăă
@ Nemo157
ćčżç§ăçĺăŤćăŁăŚăăăŽăŻă
MaybeUninit<T>
ăT
ă¨ĺăăŹă¤ă˘ăŚăă§ăăăă¨ăäżč¨źăăăŚăăăăŠăăăăăăŚăăŽăăăŞăăŽă使ç¨ăăŚăăźăăŽĺ¤ăé¨ĺçăŤĺćĺăăŚăăĺŽĺ ¨ăŤĺ¤ćă§ăăăăŠăă
ăăăŻäżč¨źăăăŚăăăăłăźăăŻćĺšă§ăăă¨ćăăžăăăăăă¤ăăŽćł¨ćçšăăăăžăă
ptr::write_unaligned
ăĺż
čŚăŤăŞăĺ ´ĺăăăăžăăăăăŻăĺŽĺ ¨ăŞă¤ăłăăŹăźăšăăŤăăźć˝čąĄĺăćäžăăăăăŤproc-macroă¨çľăżĺăăăăă¨ăă§ăăă¨ç§ă俥ăăŚăăăŽă§ăç§ăčĺłăćăŁăŚăăăŚăźăšăąăźăšă§ăăăăžăă
@PzixelĺăăĄă˘ăŞăŹă¤ă˘ăŚăăŽĺ ´ĺăŻăć§çŻăăăăźăżć§é ĺ ¨ä˝ăăłăăźăăăă¨ăĺéżă§ăăžăă ăăĄăăăăłăłăă¤ăŠăŻăłăăźăĺé¤ăăĺŻč˝ć§ăăăăĺ°ăăŞć§é ă§ăŻĺéĄăŤăŞăăŞăĺŻč˝ć§ăăăăžăă ăăăăăăăŻééăăŞăćăŁăŚăăă¨ăăă§ăă
@nicoburnsăŻăăăăăăžăăă transmute
ă¨ĺăăăăŤćŠč˝ăăăă¨ă確čŞăăăăăŤă #[same_layout]
ă#[elide_copying]
ăăžăăŻăăŽä¸ĄćšăŞăŠăŽĺąć§ăăăĺŻč˝ć§ăăăă¨č¨ăŁăŚăăžăă ă ăžăăŻă into_constructed
ĺŽčŁ
ăĺ¤ć´ăăŚăä˝ĺăŞăłăăźăĺéżăăăă¨ăă§ăăžăă ăŹă¤ă˘ăŚăăŤé˘ăăăăăĽăĄăłăăčŞă賢ăäşşă ăă§ăŞăăăăăăăăŠăŤăăŽĺä˝ăŤăŞăă¨ćăăžăă ă¤ăžăă into_constructed
ăĺźăłĺşăăłăźăăăăăčż˝ĺ ăŽăłăăźăĺĺžăăžăăă @ Nemo157ăŻtransmute
ăĺźăłĺşăă ăă§ăĺéĄăăăžăăă into_constructed
ăĺăăă¨ăă§ăăŞăççąăŻăăăžăăă
out.get_mut() as *mut _
ďź=out.as_mut_ptr()
ĺ ´ĺăç§ăŻé常ăŤćˇˇäšąăăžăă ćŹĺ˝ăŤC ++ăŁă˝ăčŚăăžăă ăŞăă¨ă俎ćŁăăăă¨ăăă§ăăă
get_mut()
ăŽăă¤ăłăăŻä˝ă§ăăďź
get_mut()
ă¨get_ref()
ăŻć˝ĺ¨çăŤćˇˇäšąăă/ćŞĺŽçžŠăŽĺä˝ă誤ăŁăŚĺźăłĺşăăŽăç°ĄĺăŤăăďź as_ptr()
ăăĺŽĺ
¨ăŞäťŁćżă§ăăă¨ăăĺšťćłăä¸ăăăăďźă¨ä¸č¨ă§ĺć§ăŽçšăććăăžăăă as_mut_ptr()
ă§ăăăĺŽéăŤăŻăăăăŽćšćłăăăĺŽĺ
¨ć§ăä˝ăăŞăăžăďźă
@RalfJungăĺŽĺŽĺăććĄăăAPIăŽăľăăťăăăŤăŻĺŤăžăăŚćăăžăďźhttps://www.ralfj.de/blog/2019/02/12/all-hands-recap.htmlăĺç §ďź
@RalfJung ptr::freeze()
ăĄă˝ăăăŽććĄăŤă¤ăăŚďźhttps://www.ralfj.de/blog/2019/02/12/all-hands-recap.htmlďźďź
MaybeUninit
ăć§çŻăăăăăŽĺć§ăŽćšćłăăăăă¨ăŻçăŤăăŞăŁăŚăăžăăďźďź MaybeUninit::frozen()
ă MaybeUninit::abitrary()
ăŞăŠďźă ç´ćçăŤăŻăăăŽăăăŞăĄă˘ăŞăŻă zeroed
ăăăŤăĄă˘ăŞăŤć¸ăčžźăăłăšăăăăăăŤăĺ¤ăăŽăŚăźăšăąăźăšă§çăŤĺćĺăăăŚăăŞăăĄă˘ăŞă¨ĺăăăăăăăŠăźăăłăšăéŤăăăă§ăă ăăăăăĺćĺăăăŚăăŞăăĄă˘ăŞăĺż
čŚă§ăăă¨äşşă
ăćŹĺ˝ăŤç˘şäżĄăăŚăăŞăéăă uninitialized
ăłăłăšăăŠăŻăżăăăć¨ĺĽ¨ăăăĺŻč˝ć§ăăăăžăăďź
ăăŽçšă§ăăĺçľăăĄă˘ăŞă§ăŻăŞăăĺćĺăăăŚăăŞăăăĄă˘ăŞăćŹĺ˝ăŤĺż čŚăŞăŚăźăšăąăźăšăŻä˝ă§ăăďź
@Pzixel
1. I'd be very confused if `out.get_mut() as *mut _` != `out.as_mut_ptr()`. Looks really C++ish. I hope it would be fixed somehow.
äşč§Łăăžăăă ä¸é¨ăŽäşşă
ăăăăććĄăăççąăŻă &mut !
çĄäşşă¨ĺŽŁč¨ăăăă¨ă彚çŤă¤ĺ ´ĺăăăăăă§ăďźăă¨ăă°ăăăŽăăăŞĺ¤ăćă¤ăă¨ăŻUBă§ăďźă ăă ăă MaybeUninit::<!>::uninitiailized().get_mut()
ă使ç¨ăăŚăăăŽăăăŞĺ¤ăä˝ćăăžăăă ăăŽăăă as_mut_ptr
ĺąéşć§ăŻä˝ăăŞăăĺç
§ăŽä˝ćăĺéżăăăžăă
@nicoburns ďź freeze
ăŻç§ăŽčăă§ăŻăŞăăă¨ăŤćł¨ćăăŚăă ăăăç§ăŻăă č°čŤăŽä¸é¨ă§ăăăććĄăă¨ăŚă弽ăă§ăăďź
@RalfJungăĺŽĺŽĺăććĄăăAPIăŽăľăăťăăăŤăŻćăăžă
ćŁăăă ăăăŚç˘şăăŤĺ¤ĺç§éăŻăăăăĺ ¨ăćăŁăŚăŻăăăžăăă
MaybeUninit
ăć§çŻăăăăăŽĺć§ăŽćšćłăăăăă¨ăŻçăŤăăŞăŁăŚăăžăăďźďźMaybeUninit::frozen()
ăMaybeUninit::abitrary()
ăŞăŠďźă
ăŻăďź ĺşćŹçăŞMaybeUninit
ăĺŽĺŽăă ptr::freeze
ăä¸é¸ăăăăăăăčż˝ĺ ăăăă¨ăććĄăăžăăă
ăăŽçšă§ăăĺçľăăĄă˘ăŞă§ăŻăŞăăĺćĺăăăŚăăŞăăăĄă˘ăŞăćŹĺ˝ăŤĺż čŚăŞăŚăźăšăąăźăšăŻä˝ă§ăăďź
ăăăŤăŻăăăŤčŞżćťă¨ăăłăăăźăŻăĺż čŚă§ăăLLVMăŻäťăŽćšćłă§ĺŽčĄă§ăăćéŠĺăĺŽčĄăăŞăăăăăăăŠăźăăłăšăä˝ä¸ăăĺŻč˝ć§ăăăă¨äşćłăăăžăă
ďźćéăăăă°ăäťăŽăłăĄăłăăŤăćťăăžăăďź
@PzixelăäşĺăŤĺ˛ăĺ˝ăŚăăăăĄă˘ăŞăŤăŞăă¸ă§ăŻăăç´ćĽć§çŻă§ăăăă¨ăŻbox
ć§ćăé¤ăďźă 芳細ăĺż
čŚăŞĺ ´ĺăŻăĺé¤ăŤé˘ăăi.rl.oăšăŹăăăăĺ§ăăăŽăćéŠă§ăă
@nicoburnsăč¨ĺăăŚăăăăăŤă MaybeUninit
ăŻăĺăĺéĄăŤĺŻžăăäşşé塼ĺŚăŤĺşăĽăăŚăăŞăăŠă¤ăăŠăŞăăźăšăŽă˝ăŞăĽăźăˇă§ăłăŽć§ćčŚç´ ă¨ăăŚä˝żç¨ă§ăăĺŻč˝ć§ăăăăćŚĺżľăŽĺŽé¨ăéĺ§ăăŚăăăăăŠăŽăăăŞAPIă§ăăăă確čŞăăćšćłă¨ăăŚé常ăŤĺ˝šçŤăĄăžăăć§çŻă訹ĺŻăăžăă ăăăŻă MaybeUninit
ăăăŽăăăŞă˝ăŞăĽăźăˇă§ăłăŽć§çŻăŤĺż
čŚăŞäżč¨źăćäžă§ăăăăŠăăăŤăăăŁăŚăăžăă
@ Nemo157ç§ăŻăăăä¸çŽćă§ä˝żç¨ăăăă¨ăććĄăăžăăéčŚăŞä¸čŹçăŞăąăźăšăćąăăăăŤä˝ăăăžăăă
@jethrogbăŠăăăăăă¨ăďź ăăă§ăAPIăŻäťăăŞăăŽăăăŤăăžăćŠč˝ăăŚăăăăă§ăăďź
2. sys / sgx / rwlock.rsă§ă
const fn new()
ăŽăăăăăżăźăłăCăăăăźăăĄă¤ăŤăŽé ĺĺćĺĺă¨ĺăă§ăăăă¨ă確čŞăăăăăŤä˝żç¨ăăŚăăžăă
ăăăźăăăăŻăŻăŹă¤ă¸ăźă§ăă^^ăăăăăăăŻăăžăăăăŻăă ă¨ćăăžăăçľĺąăĺźć°ăŽăŞăconst fn
ăŞăŽă§ă常ăŤĺăăăŽăčżăăŻăă§ă...
ćčżç§ăçĺăŤćăŁăŚăăăŽăŻă
MaybeUninit<T>
ăT
ă¨ĺăăŹă¤ă˘ăŚăă§ăăăă¨ăäżč¨źăăăŚăăăăŠăăăăăăŚăăŽăăăŞăăŽă使ç¨ăăŚăăźăăŽĺ¤ăé¨ĺçăŤĺćĺăăŚăăĺŽĺ ¨ăŤĺ¤ćă§ăăăăŠăă
ćçľçăŤčż˝ĺ ăăĺż čŚăăăăăŽăŽăŞăšăăŤăŻă揥ăŽăăăŞăăŽăăăăžăă
fn into_initialized_box(Box<MaybeUninit<T>>) -> Box<T>
ăăăŻBox
ăĺ¤ćăăžăă
ăăăăăŻăăç§ăăĄăŻăăŽăăăŞć ¸ĺ¤ćă訹ĺŻăăšăă ă¨ćăăžăă ăăăĽăĄăłăă§ăăăă揥ăŽăăăŤĺ¤ćă§ăăžăăă¨č¨ăĺäžăŻăăăžăăďź ç§ăŻé常ăäşşă ăçŹčŞăŽĺ¤ćăčĄăăŽă§ăŻăŞăăăăŤăăźăĄă˝ăăăčż˝ĺ ăăăă¨ă弽ăă¨ćăăžăă
- 使ç¨ăăŚăăăżă¤ăďźçšăŤă¸ă§ăăŞăăŻăłăźăďźăŤăăŁăŚăŻă
ptr::write_unaligned
ăĺż čŚăŤăŞăĺ ´ĺăăăăžăă
ă¸ă§ăăŞăăŻăłăźăă§ăŻăăăŁăźăŤăăŤă˘ăŻăťăšă§ăăžăăă ć§é ä˝ăăăăŻăăăŚăăăăŠăăăé常çĽăŁăŚăăăăŁăźăŤăăŤă˘ăŻăťăšă§ăăă°ăăăă§ăŞăĺ ´ĺăŻptr::write
ă§ĺĺă ă¨ćăăžăă ďźĺ˛ăĺ˝ăŚăŻĺé¤ăăăĺŻč˝ć§ăăăăăă使ç¨ăăŞăă§ăă ăăďźç§ăŻăăăĺżăçśăăŚăăžă...ďź
ăă ăăăăšăăąăźăšăä˝ćăăăŤăŻăăšăżăăŻăŤč§ŚăăăŤĺćĺăăăŚăăŞăăăăŻăšăĺ˛ăĺ˝ăŚăăă¨ăă§ăăăăăŤăčż˝ĺ ăŽAPI
fn uninit_boxed<T>() -> Box<MaybeUninit<T>>
ĺż čŚăŤăŞăăăă§ăă
ăăăŻăă°ă§ăăăăăŽăă°ă俎ćŁăăăŽăŻéŁăăăăăăăŞăăŽă§ăăăăŽăăăŤĺĽăŽăłăłăšăăŠăŻăżăźăćäžăăăă¨ăčŻăčăăăăăăžăăă ăă ăăĺŽčŁ
ćšćłăăăăăžăăă ăăăŚăăăăăăăšăżăăŻăšăăăăăźăăŤăăŚăămemcpyingăŞăŠăĺéżăăzeroed_box
ăăăŞăăŽăĺż
čŚă§ă...ç§ăŻăăŽăăšăŚăŽč¤čŁ˝ă弽ăă§ăŻăăăžăăă ďź/
ăăăăŁăŚăĺćĺŽĺŽĺăŽĺž/丌čĄăăŚăăăźăä¸ăŤĺćĺăăăŚăăŞăč¨ćśăŽăŚăźăšăąăźăšďźĺşćŹçăŤăŻBox
ă¨MaybeUninit
桡ĺďźăćăŁăŚăăä¸é¨ăŽäşşă
ăéăžăăćĺ°éăŽăăŽăč¨č¨ăăăă¨ăććĄăăžăăăŽăăăŽĺŻč˝ăŞAPIćĄĺźľă @eddybăăăăŤé˘ĺżă示ăăžăăă ăăăŻă mem::uninitialized
éć¨ĺĽ¨ăŤăăăă¨ă¨ăŻĺŽéăŤăŻé˘äżăăŞăăŽă§ăăăŽďźăă§ăŤĺ¤§ăăăăďźčż˝čˇĄăŽĺéĄäťĽĺ¤ăŤăçŹčŞăŽč°čŤăŽĺ ´ă確äżăăĺż
čŚăăăă¨ćăăžăă
ç§čŞčşŤăŽăĄăăŁă¨ăăăăŁăźăăăăŻďźç§ăŻä¸čŹçăŤMaybeUninit<T>
ăŤćşčśłăăŚăăžăă 大ăăŞä¸ćşăŻăăăžăăă ăăăŻmem::uninitialized
ăăăăăăăŹăłă§ăŻăăăžăăăăăăŻç´ ć´ăăăăă¨ă§ăă const
new
ă¨uninitialized
ćšćłăŻç´ ć´ăăăă§ăă ăăĺ¤ăăŽăĄă˝ăăăconstă§ăăăă¨ăćăżăžăăăç§ăç解ăăŚăăăăăŤăăăăăŽĺ¤ăăŻă const
ä˝ćăăĺăŤăä¸čŹăŤconst fn
ă§ăăăŤé˛čĄăăĺż
čŚăăăăžăă
T
ă¨MaybeUninit<T>
ăĺăăŹă¤ă˘ăŚăăăăă埡ĺăŞäżč¨źă#[repr(transparent)]
ă§ăăăĺąć§ăăŚăăŞăłăŤéŠç¨ă§ăăŞăăă¨ăŻăăăŁăŚăăžăďźă§FFIăťăźăďźă¤ăžăă T
ăFFIăťăźăăŽĺ ´ĺďźă§ăăĺż
čŚăăăăžăă ăăăŽĺžă MaybeUninit<T>
ăFFIăťăźăă§ăăĺż
čŚăăăăžăďźă ďźćŁç´ăŞă¨ăăăćŁăŽăľă¤ăşăŽăăŁăźăŤăă1ă¤ăăăŞăăŚăăŞăłă§#[repr(transparent)]
ă使ç¨ă§ăăă°ăăăŽă§ăăďźć§é ä˝ăŽĺ ´ĺăŽăăăŤďźďź
ç§ăŻĺŽéăŤăăă¸ă§ăŻăă§MaybeUninit<T>
ăŽABIă使ç¨ăăŚćéŠĺăćŻć´ăăŚăăžăďźăă ăăĺąéşăŞćšćłă§ăŻăŞăăŽă§ăć
ăŚăĺż
čŚăŻăăăžăăďźă čĺłăŽăăćšăăăăŁăăăăžăăăă芳ăă誏ćăăăŚăăă ăăžăăăăăŽăłăĄăłăăŻç°Ąć˝ăŤăăăăă§ăŻčŠłç´°ăççĽăăžăă
@mjbshawăăăă¨ăďź
ćŁăŽăľă¤ăşăŽăăŁăźăŤăă1ă¤ăăăŞăăŚăăŞăłă§
#[repr(transparent)]
ă使ç¨ă§ăăă°ăăăŽă§ăăďźć§é ä˝ăŽĺ ´ĺă¨ĺăăăăŤďźă
ăăŽĺąć§ăĺĺ¨ăăăăăŤăŞăŁăăăăăăMaybeUninit
ăŤčż˝ĺ ăăăŽăŻç°Ąĺă§ăă ĺŽéăăăŽăă¸ăăŻăŻăă§ăŤrustcăŤĺŽčŁ
ăăăŚăăžăďź MaybeUninit<T>
ăŻäşĺŽä¸T
ă¨ABIäşćă§ăăăăăăäżč¨źăăăăŽă§ăŻăăăžăăďźă
ĺż
čŚăŞăŽăŻă誰ăăRFCăä˝ćăăŚăăă確čŞăă repr(transparent)
ăŚăăŞăłăŤéZSTăăŁăźăŤăă1ă¤ăăăŞăăă¨ă確čŞăăăă§ăăŻăčż˝ĺ ăăăă¨ă ăă§ăă 芌ăăŚăżăžăăăďź ďźD
ĺż čŚăŞăŽăŻă誰ăăRFCăä˝ćăăŚăăă確čŞăă
repr(transparent)
ăŚăăŞăłăŤéZSTăăŁăźăŤăă1ă¤ăăăŞăăă¨ă確čŞăăăă§ăăŻăčż˝ĺ ăăăă¨ă ăă§ăă 芌ăăŚăżăžăăăďź ďźD
@RalfJungĺ°ăăă¨ăăăŞăăăăŻĺăĺăă§ăăăďź
Cc https://github.com/rust-lang/rust/pull/58468
ăăăŤăăă maybe_uninit
ă§ĺççăŤĺŽĺŽă§ăăă¨ćăAPIăŽăżăćŽăăćŽăăŻĺĺĽăŽćŠč˝ă˛ăźăăŤç§ťĺăăžăă
ăăŚăćşĺPRăŻăăšăŚä¸é¸ăă into_inner
ăăŞăăŞăăžăăă
ăă ăăĺŽĺŽĺăăĺăŤhttps://github.com/rust-lang/rfcs/pull/2582ăĺăĺ
ĽăăŚMaybeUninit
丝čŚăŞăŚăźăšăąăźăšăŽăăă§ăă ćă
ăŻăăŚăăé常ăŤčżăéĺ§ăăFCPăŽăăăŤĺż
čŚăŞăăšăŚăŽăăăŻăšăćăăăă¨ăŤă
MaybeUninit
ă使ç¨ăăăăăŤăłăźăăĺ¤ćăăžăăă ç§ă使ç¨ăăŚăăĺŻč˝ć§ăăăŞăăŽć°ăŽĺ ´ćăăăăžătake
ä¸ă§ĺä˝ăăćšćł&mut self
ă§ăŻăŞăself
ă ç§ăŻçžĺ¨x.as_ptr().read()
ăăžăăă x.take()
ăžăăŻx.take_initialized()
ćšăăŻăăăŤć確ă ă¨ćăăžăă
@AmanieuăăăŻăć˘ĺăŽinto_inner
ăĄă˝ăăă¨é常ăŤăăäźźăŚăăžăă ăăśăăăăă§éč¤ăéżăăăă¨ăăăă¨ăă§ăăžăăďź
Option
ăŽăĄă˝ăătake
ăŤăŻăäťăŽăťăăłăăŁăăŻăăăăžăă x.as_ptr().read()
ăŻxăŽĺ
é¨ĺ¤ăĺ¤ć´ăăžăăăă Option::take
ĺ¤ă罎ăćăăŚăżăžăă ăăăŻç§ăŤă¨ăŁăŚčŞ¤č§Łăćăăăăăăžăăă
@ qwerty19106 x.as_ptr().read()
ăŤMaybeUninit
_semantically_ăŻăŠăăăźăĺăłĺćĺăăăŚăăŞăă¨čăĺ¤ăĺăĺşăăăăă ăă§ĺćĺăăăŚăăŞăĺ¤ăĺăćŽăĺăĺşăăĺ¤ă¨ĺăăăăăăżăźăłăćăŁăŚăăăă¨ă辡ăăăžăă
ç§ăŻçžĺ¨
x.as_ptr().read()
ăăžăăăx.take()
ăžăăŻx.take_initialized()
ćšăăŻăăăŤć確ă ă¨ćăăžăă
čĺłăăăăžăăăăăŽççąă誏ćăăŚăăă ăăžăăďź
ç§ăŽčŚč§Łă§ăŻă take
ăăăŞćšćłăŻă take
ă¨into_initialized
严ćšă¨ăŻç°ăŞăă2ĺăŽćç¨ăé˛ăăă¨ăă§ăăŞăăăăĺ¤ĺ°čŞ¤č§ŁăćăĺŻč˝ć§ăăăăžăă ĺŽéăŤăŻăăŽăăăŤCopy
ďźĺŽéăŤç¨ăżă¤ăCopy
ăŽăăăŞĺ¤None as Option<Box<T>>
ďźăăă¤ăŻINGăŽăŻäşĺăĺŽĺ
¨ăŤç˝°éă§ăďź ăăăăŁăŚăç§ăŽčŚłçšăăăŻă take
ă¨ăŽéĄäźźć§ăŻĺŽéăŤăŻĺ˝ăŚăŻăžăăžăăă
ăăăread_initialized()
ă¨ĺźăśăă¨ăă§ăăžăăăăăŽćçšă§ăăăăĺŽéăŤas_ptr().read()
ăăăć確ă§ăăăăŠăăăçĺŁăŤčăăŚăăžăă
x.as_ptr().read()
ăŤMaybeUninit
_semantically_ăĺşč°ˇăĺăăăŠăăăźăĺăłĺćĺăăăŚăăŞăčăŻăăăă ăă§ĺćĺăăăŚăăŞăĺ¤ăćŽăĺăĺşăăĺ¤ă¨ĺăăăăăăżăźăłăćăŁăŚăăăă¨ă辡ăăăžăă
MaybeUninit
ăŻĺŽéăŤăŻćç¨ăŞăťăăłăăŁăăŻä¸ĺ¤ćĄäťśăăŞăăăăăăŽăšăăźăăĄăłăăŤĺŽĺ
¨ăŤĺćăăăăŠăăăŻăăăăžăăă TBH MaybeUninit
ă§ăŽćä˝ăăçăŽćä˝ĺšć䝼ĺ¤ăŽćšćłă§ć¤č¨ăăăă¨ăćç¨ă§ăăă¨ăŻç˘şäżĄăăŚăăžăăă
@RalfJungăăźăăĺ¤ĺăćĺłčŤçăŤăăŻăăă§ăŻééăŁăč¨čă§ăă ăŚăźăśăźăĺăăŠăŽăăăŤä˝żç¨ăăăă¨ăăçšă§ăŻăĺ¤ăčŞăżĺăŁăĺžăĺ¤ăĺăłĺćĺăăăŚăăŞăă¨ćłĺŽăăĺż
čŚăăăăžăďźĺăCopy
ăă¨ăĺ
ˇä˝çăŤăăăŁăŚăăĺ ´ĺăé¤ăďźă
çăŽćä˝ä¸ăŽĺšćă ăăčŚăă¨ăăăŽăăăŞĺĽĺŚăŞç¸äşä˝ç¨ăçşç
@RalfJungç§ăŽĺ ´ĺăŻăăšăŚăĺ¤ăé
罎ăăăĺžă§ĺăĺşăăăstatic mut
ăĺŤăžăăžăă ăšăżăăŁăăŻăćśč˛ťă§ăăŞăăăă into_uninitialized
使ç¨ă§ăăžăăă
@Amanieuç§ăĺ°ăăŚăăăŽăŻăăŞăx.take_initialized()
ăx.as_ptr().read()
ăăăć確ă ă¨ćăăžăăďź
@ Nemo157
MiriăĺćĺăăăŚăăŞăăĄă˘ăŞăŽéˇă0ăŽčŞăżĺăă追补ăăăă¨ăćĺž ăăŚăăžăăăăăăă§ăŻăăăžăăă
ĺćĺăăăŚăăŞăăĄă˘ăŞăŽéˇă0ăŽčŞăżĺăăŻćąşăăŚUBă§ăŻăŞăăŽăŤăăŞăMiriăŻăăăăć°ăŤăăăŽă§ăăăăă
çăŽćä˝ä¸ăŽĺšćă ăăčŚăă¨ăăăŽăăăŞĺĽĺŚăŞç¸äşä˝ç¨ăçşç
ăăĄăăăĺćĺăăăŚăăŞăăĄă˘ăŞăčŞăżĺăăă¨ăŞăăĺŽĺ
¨ć§ăŽä¸ĺ¤ćĄäťśăŤéĺăăĺŻč˝ć§ăăăăžăă ăăŽăăăŤMaybeUninit::zeroed().into_initialized()
ă使ç¨ăăăă¨ăă§ăăžăă ĺéĄăŻčŚĺ˝ăăăžăăă
ăăă§ăŽăĺĽĺŚăŞç¸äşä˝ç¨ăă¨ăŻăä˝ćăă樊ĺŠăăŞăăżă¤ăăŽ2ă¤ăŽĺ¤ăä˝ćăăăă¨ă§ăă ăăăŻăăšăŚSpartacus
ăŽĺŽĺ
¨ć§ä¸ĺ¤éăŤé˘ăăăăŽă§ăăă匼ĺ˝ć§ä¸ĺ¤éă¨ăŻä˝ăŽé˘äżăăăăžăăă
ăăăă read_initialized()
ăä˝ă辡ăăăăăăăăäźăăŚăăă¨ćăççąă§ăăăăźăżăčŞăżĺăăéŠĺăŤĺćĺăăăŚăăă¨ä¸ťĺźľăăžăďźăăăŤăŻăăăŽăżă¤ăă§ăăŽĺ¤ăĺŽéăŤä˝ćă§ăăăă¨ă確čŞăăăă¨ăĺŤăžăăžăďźă ăăăŻă MaybeUninit
ăžă ć źç´ăăăŚăăăăăăăżăźăłăŤăŻĺ˝ąéżăăžăăă
@RalfJungç§ăŻĺşćŹçăŤMaybeUninit
ăOption
ă¨ăăŚćąăŁăŚăăžăăăăżă°ăŻăăăžăăă ĺŽéăç§ăŻäťĽĺăăžăăŤăăŽçŽçăŽăăăŤăżă°ăŞăăŞăăˇă§ăłăŽăŻăŹăźăă使ç¨ăăŚăăžăăăăăăŤăŻăăŚăăŞăłăăĺ¤ăć˝ĺşăăăăăŽtake
ăĄă˝ăăăăăăžăă
@Amanieu @shepmaster https://github.com/rust-lang/rust/pull/58660ăŤread_initialized
ăčż˝ĺ ăăžăăă ăăă§ătake_initialized
ăăăčŻăĺĺă ă¨ćăăžăă ăăăŻăăŞăăŽăăźăşăćşăăăŚăăžăăďź
ăăŽPRăŻăäťăŽăăă¤ăăŽćšćłăŤăäžăčż˝ĺ ăăžăăăăŁăźăăăăŻăćčżăăžăă
read_initialized
ăŤćşčśłăăŚăăžăă
ç§ăŻăăă§ăăŁăăăç§ăä˝ăŁMaybeUninit<T>: Copy
ĺ ´ĺT: Copy
ă ăăăăŞăççąăŻăŞăăăă§ăă
ăăźăăĺ¤ĺget_initialized
ćšăăăĺĺă§ăăăăďź çľĺąăŽă¨ăăăăăăŻset
ăčŁĺŽăăăăăŞăăŽă§ăă
ăžăăŻă set
ĺĺăwrite
ĺ¤ć´ăăĺż
čŚăăăăžăăďź ăăăŻăžăä¸č˛Ťć§ăéćăăă§ăăăă
MaybeUninit
ă使ç¨ăăăăăŤăłăźăăĺ¤ćăăŚăăžăăăăĺćĺăăăŚăăŞăăšăŠă¤ăšă§ăŽä˝ćĽăŻé常ăŤéäşşéçă§ăăăă¨ăăăăăžăăă 䝼ä¸ăŽćŠč˝ăăăă°ćšĺă§ăăă¨ćăăžăă
&mut [T]
ăă&mut [MaybeUninit<T>]
ă¸ăŽĺŽĺ
¨ăŞĺ¤ćă ăăăŤăăă &out
ăăŠăĄăźăżă&mut [MaybeUninit<T>]
ă使ç¨ăăŚă¨ăăĽăŹăźăă§ăăžăăăăăŻăăă¨ăă°read
ĺ ´ĺăŤäžżĺŠă§ăă&mut [MaybeUninit<T>]
ăă&mut [T]
ă¸ăŽĺŽĺ
¨ă§ăŞăĺ¤ćďźăăăł&[T]
ăŤă¤ăăŚăĺăďźăăšăŠă¤ăšăŽăăšăŚăŽčŚç´ ă§.set
ăĺźăłĺşăăĺžăŤä˝żç¨ăăăžăăç§ăćăŁăŚăăAPIăŻćŹĄăŽăăăŤăŞăăžăă
// The returned slice is truncated to the number of elements actually read.
fn read<T>(out: &mut [MaybeUninit<T>]) -> Result<&mut [T]>;
çžĺ¨ăăšăŠă¤ăšăŽćä˝ăŻäşşé塼ĺŚçă§ăŻăŞăăă¨ăŤĺćăăžăăăăŽăăă first_ptr
ă¨first_ptr_mut
ăčż˝ĺ ăăžăăă ăăăăăăăŻăăăăćéŤăŽAPIăăăŻăťăŠé ăă§ăă
ăă ăăćĺăŤăăłă˘APIăăĺşčˇăăŚăăăăšăŠă¤ăšďźăăăłBox
ďźă¨ăŽç¸äşä˝ç¨ă確čŞăăăă¨ăŤéä¸ă§ăăă°ă¨ćăăžăă
set
ăŽĺĺăwrite
ăŤĺ¤ć´ăăŚă ptr::write
ă¨ăŽä¸č˛Ťć§ăäżă¤ă¨ăăă˘ă¤ăă˘ă弽ăă§ăă
ĺăăăăŤă read_initialized
ăŻread
ăăăćŹĺ˝ăŤĺŞăăŚăăžăăďź čŞ¤ăŁăŚä˝żç¨ăăăŚé ăăăăă¨ăć¸ĺżľăăăĺ ´ĺăŻăăĄă˝ăăă§ăŻăŞăé˘ć°ăă¤ăžăMaybeUninit::read(&mut v)
ăžăăďź write
ăŤă¤ăăŚăĺăăă¨ăă§ăăžăăă¤ăžăăä¸č˛Ťć§ăMaybeUninit::write(&mut v)
ăăăŤ
ă¨ăŤăăăăăăăŽAPIăćăĄĺşăăăăžă§ăç§ăŻćä˝éăŽAPIăă¤ăžănew
ă uninitialized
ă zeroed
ă as_ptr
ă as_mut_ptr
ĺŽĺŽĺă埡ăăľăăźăăăžăă get_ref
ă¨get_mut
ă
ăăăŚĺ¤ĺ
get_ref
ă¨get_mut
ă
ăăăăŻă httpsďź//github.com/rust-rfcs/unsafe-code-guidelines/issues/77ă解湺ăăĺžă§ăŽăżĺŽĺŽăăăĺż čŚăăăăăă°ăăćéăăăăăăă§ă...
ćä˝éăŽAPIăă¤ăžă
new
ăuninitialized
ăzeroed
ăas_ptr
ăas_mut_ptr
ĺŽĺŽĺ
ç§ăŽč¨çťăŻă into_initialized
ă set
/ write
ăăăăłread_initialized
ăăăŽćĺ°éăŽăťăăăŽä¸é¨ăŤăăăă¨set
/ write
ă¨read_initialized
ăŻćŽăăŽé¨ĺă¨ä¸çˇăŤç°ĄĺăŤĺŽčŁ
ă§ăăăŽă§ăç§ăŻäťăćĺăŽăăăă§ăăăăĺŽĺŽăăăŞăăă¨ăŤĺžĺăăŚăăžăă ăăăăćĺăăinto_initialized
ăăăŞăăŽăćăŁăŚăăăă¨ăćăžăăăIMOă
ăăăăăăăăĄă˝ăăă§ăŻăŞăé˘ć°ăŤăăžăăă¤ăžăă
MaybeUninit::read(&mut v)
ďźwrite
ăŤă¤ăăŚăĺăăă¨ăă§ăăžăăă¤ăžăăä¸č˛Ťć§ăMaybeUninit::write(&mut v)
ăăăŤ
ĺăŤăăă§čŞŹćăăăă¨ăăă Deref
ă¤ăłăšăżăłăšăŽĺéĄăĺéżăăăăăŤăć示çăŞé˘ć°ă˘ăăăźăăŽăżă使ç¨ăăžăă ăĄă˝ăăăŽäťŁăăăŤé˘ć°ă使ç¨ăăĺĽăŽççąă§ĺŞĺ
é ä˝ăĺ°ĺ
Ľăăĺż
čŚăŻăŞăă¨ćăăžăă
read_initialized
ăŻread
ăăăćŹĺ˝ăŤĺŞăăŚăăžăăďź
čŻă質ĺďź çĽăăžăăă ăăăŻinto_initialized
ă¨ăŽĺŻžç§°ć§ăŽăăinto_inner
ăŻä¸čŹçăŞćšćłă§ăăăĺźăłĺşăăăăżă¤ăăŽćŚčŚă夹ăăăĺŻč˝ć§ăăăăžăă read
ăŻăăăťăŠä¸čŹçă§ăŻăăăžăăă ăăăŚĺ¤ĺăăăŻinto_initialized
䝣ăăăŤinitialized
ă§ăăăšăă§ăăďź é常ăŤĺ¤ăăŽăŞăăˇă§ăł...
ĺăŤăăă§čŞŹćăăăă¨ăăă
Deref
ă¤ăłăšăżăłăšăŽĺéĄăĺéżăăăăăŤăć示çăŞé˘ć°ă˘ăăăźăăŽăżă使ç¨ăăžăă ăĄă˝ăăăŽäťŁăăăŤé˘ć°ă使ç¨ăăĺĽăŽççąă§ĺŞĺ é ä˝ăĺ°ĺ Ľăăĺż čŚăŻăŞăă¨ćăăžăă
ptr::read
ă¨ptr::write
ăŻé˘ć°ă§ăăăăĄă˝ăăă§ăŻăăăžăăă ăăăăŁăŚăĺŞĺ
é ä˝ăŻăă§ăŤMaybeUninit::read
ă¨MaybeUninit::write
ĺŞĺ
ăăŚč¨ĺŽăăăŚăăžăă
硨éďźăăŚăăŠăăăăă¤ăłăżăŤăŻread
ă¨write
ăĄă˝ăăăăăăžă...䝼ĺăŻć°ăĽăăŞăăŁă...ăăăăăăăăŻăă¤ăłăżăćśč˛ťăăžăăăăăăŻMaybeUninit
ăŻăăžăćĺłăăăăžăă
é常ăŤĺ¤ăăŽăŞăăˇă§ăł...
ĺćăăžăăă äťăŽćšćłă§ăăŁă¨ĺ¤ăăŽčŞčť˘čťăćľăăžă§ăŻă new
ă uninitialized
ă zeroed
ă as_ptr
ă as_mut_ptr
ă ăă ă¨ćăăžăćŹĺ˝ăŤĺŽĺŽăăăćşĺăă§ăăŚăăžăă
ptr::read
ă¨ptr::write
ăŻé˘ć°ă§ăăăăĄă˝ăăă§ăŻăăăžăăă ăăăăŁăŚăĺŞĺ é ä˝ăŻăă§ăŤč¨ĺŽăăăŚăăžă
ăăăăŻăăźăżć§é ăŽä¸é¨ă§ăŻăăăžăăăăăĄăăăçŹçŤăăé˘ć°ă§ăă ăăăŚăăăŞăăč¨ăăăăŤăăăăăŻäťćĽăăĄă˝ăăă¨ăăŚăĺĺ¨ăăžăă
ăăăă彟ăăŻăă¤ăłăżăćśč˛ťăăžă
çăŽăă¤ăłăżăŻCopy
ăŞăŽă§ăĺŽéăŤăŻä˝ăćśč˛ťăăăžăăă
çăŽăă¤ăłăżăŻ
Copy
ăŞăŽă§ăĺŽéăŤăŻä˝ăćśč˛ťăăăžăăă
ăăčŚçšă...
ăăă¨ă v.as_ptr().read()
ăŻăă§ăŤăăŞăç°Ąć˝ă§ć確ă§ăă as_ptr
ăçśăread
ăăăăŻăăăć
éăŤčăăăšăăăŽă¨ăăŚçŽçŤăăăĺż
čŚăăăăăăŁă¨ăăăăinto_initialized
ăăăžăăă ĺäşşçăŤăŻăĺ°ăŞăă¨ăäťăŽă¨ăăă as_ptr
ă¨as_mut_ptr
ăŽăżăĺ
Źéăăăă¨ăŤčłćă§ăă ăăăŚăăăĄăăă new
ă uninitialized
ăăăăłzeroed
ă
@Amanieu &mut MaybeUninit<[T]>
ă¨&mut [MaybeUninit<T>]
ĺŽĺ
¨ăŞĺ¤ćăăăă Cell
ăăăŞăăŽăŻăŠăă§ăăďź
ăăăŤăăă揥ăŽăă¨ăĺŻč˝ăŤăŞăăžăăăăăŻç§ăŤăŻăăŞăčŞçśăŤćăăžăă
fn read<T>(out: &mut MaybeUninit<[T]>) -> Result<&mut [T]> {
let split = out.as_mut_slice_of_uninit();
// ... operate on split ...
return Some(unsafe { split[0..n].as_uninit_mut_slice().get_mut() })
}
ăžăăĺźăłĺşăĺ
ăŤĺŻžăăăťăăłăăŁăŻăšăăăćŁç˘şăŤčĄ¨ăăŚăăăăăŤćăăžăă &mut [MaybeUninit<T>]
ăĺăé˘ć°ăŻăç§ăŤăŻăăŠăă大ä¸ĺ¤Ťă§ăŠăăăăă§ăŞăăăĺşĺĽăăăă¸ăăŻăăăăăăŤćăăžăă ä¸ćšă &mut MaybeUninit<[T]>
ăĺăă¨ăăťăŤăŤć˘ăŤĺĺ¨ăăăăźăżăŤé˘ăăŚăŻăăťăŤăĺşĺĽă§ăăŞăăă¨ă襨ăăžăă
ďźăăĄăăăăĄă˝ăăăŽĺĺăŻăă¤ăŻăˇă§ăăŁăłă°ăŽĺŻžčąĄăŤăŞăăžă-ç§ăŻCell
ăčĄăăă¨ă樥ĺŁăăă ăă§ăăďź
@eternaleye MaybeUninit<[T]>
ăŻăăŚăăŞăłăDSTăŤăăăă¨ăă§ăăŞăăăăćĺšăŞĺă§ăŻăăăžăăă
ăăźăăăăă ă
äťăŽćšćłă§ăăŁă¨ĺ¤ăăŽčŞčť˘čťăćľăăžă§ăŻă
new
ăuninitialized
ăzeroed
ăas_ptr
ăas_mut_ptr
ă ăă ă¨ćăăžăćŹĺ˝ăŤĺŽĺŽăăăćşĺăă§ăăŚăăžăă
ăžăăç§ăăĄăŻä˝ăăĺŽĺŽăăăĺăŤăăŽRFCă
ăăăăŁăŚăĺŽé¨ăĺž
ă¤éăçžĺ¨set
ă read_initialized
ăăăăłinto_initialized
ă¨ĺźă°ăăŚăăăăŽăŽĺââĺăŤă¤ăăŚĺ°ăčŞčť˘čťăŤäšăăă¨ăă§ăăžăă 揥ăŽĺĺĺ¤ć´ăććĄăăăŚăăžăă
set
-> write
ă .as_ptr().read()
ăŽćčŻăŽăĄăżăăĄăźăŻăăgetăă§ăŻăŞăăreadăăŽăăă§ăăăčŁć°ďź .as_ptr_mut().write()
ďźăŻăsetăă§ăŻăŞăăwriteăă§ăăĺż
čŚăăăăžăăread_initialized
-> read
ă write
ă¨ăăžăä¸č´ăăžăăăĺŽĺ
¨ă§ăŻăăăžăăă ăăďźăăăłăăăĽăĄăłăďźăŻăăăźăżăăă§ăŤĺćĺăăăŚăăăă¨ăćĺă§ç˘şčŞăăĺż
čŚăăăă¨ăăčŚĺă§ĺĺă§ăăďź ĺŽĺ
¨ă§ăŞăinto_inner
ă§ăŻä¸ĺĺă§ăăă¨ăăĺ¤ăăŽĺćăăăăžăăăăăŽăăăĺĺăinto_initialized
ăinto_initialized
-> initialized
ă read_initialized
ă¨into_initialized
严ćšăăăĺ ´ĺăIMOă¨ăŽä¸č˛Ťć§ăŻčŻĺĽ˝ă§ăăă read
ĺ ´ĺă into_initialized
ăĺ°ăçŽçŤăĄăžăă ăĄă˝ăăĺăŻăăŞăéˇăă§ăă ăăă§ăăç§ăçĽăŁăŚăăăă¨ăăăćăćśč˛ťăăćä˝ăŻinto_*
ă¨ĺźă°ăăžăăďź1ďźăŤĺŻžăăç°č°ăŻăăăžăăďź ăăăŚç§ăŻä¸ťăŤďź3ďźăŤăăăăăăŁăŚăăžăă ďź2ďźăŤă¤ăăŚăŻăç§ăŻćŞĺŽă§ăă read
ăŻĺ
Ľĺăç°Ąĺă§ăăă read_initialized
IMOăŻăăăŽăăăŞăłăźăăčŞăżĺăă¨ăăŤăăžăćŠč˝ăăžăă ĺŽéăŤĺćĺăăăă¨ćłĺŽăăŚăăă¨ăăăĺźăłĺşăăŽăŻăăăăă§ăă
čăăćčŚďź
ăžăăç§ăăĄăŻä˝ăăĺŽĺŽăăăĺăŤăăŽRFCă
ăăăŻç§ăoffset_of!
ăăŠă°ă¤ăłă罎ăăĺ ´ćă§ăăďź :)
read_initialized
ăŻinto_initialized
ĺłĺŻăŞăšăźăăźăťăăă§ăăăă¨ăŤćł¨ćăăŚăă ăăďź &self
䝣ăăăŤself
&self
ĺăăžăďźă 严ćšăăľăăźăăăăă¨ăŻé常ăŤçăŤăăŞăŁăŚăăžăăďź
ăăăŻç§ă
offset_of!
ăăŠă°ă¤ăłă罎ăăĺ ´ćă§ăăďź :)
ç§ăŽRFCăĺăĺ ĽăăăăĺăŤăăăĺŽĺŽăăăăă¨ăă§ăăă°ă確ăăŤă ;ďź
严ćšăăľăăźăăăăă¨ăŻé常ăŤçăŤăăŞăŁăŚăăžăăďź
IMOăŻăă into_initialized
ăŻăĺăĺ¤ă2ĺ使ç¨ăăăă¨ăé˛ăăăăăăĺŽĺ
¨ă§ăăăăăăŁăŚăĺŻč˝ăŞéăread_initialized
ăăăĺŞĺ
ăăĺż
čŚăăăăžăă
ăăăăŁăŚă @ nikomatsakisăŻäťĽĺăŤăăŽçšăććăăžăăăăăăźăăăăăŤăźăŤăŻăăžăăă§ăăă
MaybeUninit<T>
ă¨into_initialized
ă使ç¨ăăăăăŤĺ¤ăăŽăłăźăă秝ć¤ăăă¨ăăăä¸ĺż
čŚăŤĺéˇă§ăăăă¨ăăăăăžăăă ăłăźăăŻă mem::uninitialized
ă使ç¨ăăŚă誤ăŁăŚă使ç¨ăăăŚăă䝼ĺăăăăăă§ăŤăŻăăăŤĺéˇăŤăŞăŁăŚăăžăă
MaybeUninit<T>
ăŻĺăŤUninit<T>
ă¨ĺźă°ăăăšăă ă¨ćăăžăăăŞăăŞăăăăšăŚăŽĺŽç¨çăŞçŽçă§ăćŞçĽăŽMaybeUninit<T>
ăĺĺžăăĺ ´ĺăĺćĺăăăŚăăŞăă¨ćłĺŽăăĺż
čŚăăăăăă Uninit<T>
ăŻăăăćŁăăčŚç´ăăžăă ăžăăä¸č˛Ťć§ăŽççąăăă into_uninitialized
ăŻinto_init()
ăžăăŻĺć§ăŽăăŽăŤăăĺż
čŚăăăăžăă
ăżă¤ăUninitialized<T>
ă¨ăĄă˝ăăinto_initialized
ĺźăłĺşăăă¨ăă§ăăžăăăăżă¤ăăŽççĽĺ˝˘ă¨ăĄă˝ăăăŽéˇă形ĺźă使ç¨ăăăăăžăăŻăăŽéăčĄăă¨ăé常ăŤççžăăžăă çćłçăŤăŻăăRust APIăŻçĽčŞ/éˇă形ĺźă使ç¨ăăăă¨ăăăă¨ăčŚăăŚăăĺż
čŚăăăăžăăăăă ăă§ăă
çĽčŞăŻäşşăŤăăŁăŚăăăžăăŤăŞăĺŻč˝ć§ăăăăăăç§ăŻăŠăă§ăéˇă形ĺźă使ç¨ăăŚăăăă1ćĽă¨ĺźăśăă¨ă弽ăżăžăă ăăăă桡ĺçŠă使ç¨ăăăă¨ăŻăIMOă严ćšăŽä¸çă§ććŞă§ăă RustăŻéˇă形ĺźăăăçĽčŞă使ç¨ăăĺžĺăăăăăă Uninit<T>
ăçĽčŞă¨ăăŚă .into_init()
ăăĄă˝ăăăŽĺĽăŽçĽčŞă¨ăăŚä˝żç¨ăăăă¨ăŤĺ寞ăăăă¨ăŻăăăžăăă
into_initialized()
ăŻĺĽ˝ăă§ăŻăăăžăăăĺ¤ăĺćĺăăăăăŤăĺ¤ćăčĄăăăŚăăăăăŤčăăăăăă§ăă ç§ăŻtake_initialized()
ćšăăăŁă¨ĺĽ˝ăă§ăă ĺăˇă°ăăăŁăŻäťăŽtake
ăĄă˝ăăă¨ăŻç°ăŞăăă¨ăŤć°äťăăžăăăăćĺłçăŤăŻăŻăăăŤć確ă§ăăăćĺłăŽć確ăăŻĺç¨/秝ĺăŽä¸č˛Ťć§ăŤĺăŁăŚäťŁăăăšăă ă¨ćăăžăă ĺ¤ć´ĺŻč˝ăŞĺç¨ă§ăăă¨ăăĺŞĺ
é ä˝ăăžă ăŞăäťăŽé¸ćč˘ăŻă move_initialized
ăžăăŻconsume_initialized
ăžăă
set()
ă¨write()
ăŤă¤ăăŚăŻăă¨ă¤ăŞă˘ăšă¨ăŞăas_ptr().write()
ă¨ăŽéĄäźźć§ăĺźăłĺşăăăăŤă write()
ă埡ăćŻćăăžăă
ăăăŚćĺžăŤă take_initialized()
ăŞăŠăăăĺ ´ĺăŻăĺč
ăŽć示ć§ăŽăăă read()
read_initialized()
ăĺŞĺ
ăăžăă
硨éďźăăăć確ăŤăăăăăŤă as_ptr().write()
ă¨as_ptr().read()
ĺşĺˇăăăă¨ăŻăăăŤć確ă§ăăă DANGERDANGER粞çĽĺ衯ăĺźă辡ăăĺŻč˝ć§ăéŤăă¨ćăăžăă
@gnzlbgăżă¤ăăŽĺĺăŤFCPăăăăžăăăăăăŽăăŁăšăŤăăˇă§ăłăĺéăăĺż čŚăăăăăŠăăăŻăăăăžăăă
ăă ăă MaybeUninit::uninit()
ăx.into_init()
ăăăŤăăinităăä¸č˛ŤăăŚä˝żç¨ăăă¨ăăććĄăŻć°ăŤĺ
ĽăŁăŚăăžăă
into_initialized()
ăŻĺĽ˝ăă§ăŻăăăžăăăĺ¤ăĺćĺăăăăăŤăĺ¤ćăčĄăăăŚăăăăăŤćăăăăăă§ăă
into
ăĄă˝ăăăŻăçšĺŽăŽăżă¤ăă§ĺăďźććăăăŚăăďźăăźăżă襨示ăă䝼ĺ¤ăŤăĺŽéăŤăŻĺ¤ćăčĄăăŞăăă¨ăăăăăăžăăăă¨ăă°ăăăžăăžăŞinto_vec
ăĄă˝ăăăĺç
§ăăŚăă ăăă
ďźinto_inităŤĺ ăăŚďź take_initialized(&mut self)
ă§ĺéĄăăăžăăăăĺ
é¨çść
ăundef
ćťăĺż
čŚăăăă¨ćăăžăă
ĺ é¨çść ăĺ ăŤćťă
https://github.com/rust-lang/rust/issues/53491#issuecomment -437811282
ăăăŻ
self
ăŽĺ 厚ăăžăŁăăĺ¤ć´ăăŞăăŻăă§ăă ćć樊ă ăăč˛ć¸ĄăăăăăăĺćĺăăăŚăăŞăçść ă§ć§çŻăăăĺ ´ĺă¨ĺŽčłŞçăŤĺăçść ăŤăŞăăžăă
ăăăăŽăă¨ăŽĺ¤ăăŻă200䝼ä¸ăŽé ăăăăłăĄăłăă§ăă§ăŤč°čŤăăăŚăăžăă
ăăăăŽăă¨ăŽĺ¤ăăŻă200䝼ä¸ăŽé ăăăăłăĄăłăă§ăă§ăŤč°čŤăăăŚăăžăă
ç§ăŻăă°ăăč°čŤăçśăăŚăăŚă誤解ăăăŚăăăăăăăžăăăăăăŽçšăŻäťĽĺăŤć辡ăăăă¨ăŻćăăžăăă çšăŤăĺźç¨ăăăłăĄăłăăŻăăĺ
é¨çść
ăundef
ćťăăăă¨ă示ĺăăŚăăžăăăă ptr::read
ďźĺ
é¨çść
ăĺ¤ć´ăăŞăăžăžăŤăăďźă¨ĺçăŤăăŚăăžăă ç§ăććĄăăŚăăăŽăŻă mem::replace(self, MaybeUninit::uninitialized())
ćŚĺżľçăŤĺçă§ăă
mem::replace(self, MaybeUninit::uninitialized())
ćŚĺżľçăŤĺçă§ăă
ăăŽăăăŽćĺłăŽundef
ă¨ĺçă ăă read
ďź https://rust.godbolt.org/z/e0-Gyu
@scottmcmăăăăăăă§ăŻăăăžăăă read
ĺ ´ĺă揥ăŽăă¨ăćĺšă§ăă
let mut x = MaybeUninit::<u32>::uninitialized();
x.set(13);
let x1 = unsafe { x.read_initialized() };
// `u32` is `Copy`, so we may read multiple times.
let x2 = unsafe { x.read_initialized() };
assert_eq!(x1, x2);
ććĄăăătake
ă§ăŻă x2
ăŻundef
ăŞăăăăăăăŻéćłăŤăŞăăžăă
2ă¤ăŽé˘ć°ăĺăă˘ăťăłăăŞăçćăăăăă¨ăăŁăŚăăăăăĺçă§ăăă¨ăŻéăăžăăă
ăă ăăăłăłăăłăăundef
ä¸ć¸ăăăŚăăĄăŞăăăŻăăăžăăă ăăăŻäşşă
ăčŞĺčŞčşŤăčśłăŤćăĄčžźăăăăŽăăĺ¤ăăŽćšćłăç´šäťăăă ăă§ăă @jethrogbăăć°ăĺşăăŚăăŞăăŽă§ăăăăŞăăăăčŻăčăă ă¨ćăăŽă誏ćăăŚ
ďźinto_inităŤĺ ăăŚďź
take_initialized(&mut self)
ă§ĺéĄăăăžăăăăĺ é¨çść ăundef
ćťăĺż čŚăăăă¨ćăăžăă
䝼ĺăŽĺĺăćä˝ăăăćŁç˘şăŤčŞŹćăăŚăăă¨ćăăŽă§ă into_initialized(self)
䝣ăăăŤtake_initialized(self)
ăććĄăăŚăăžăăă çš°ăčżăăžăăă take
ăŻé常&mut self
ăĺăă self
into
ăŻé常self
ĺăăžăăăćĺłçăŤćŁç˘şăŞĺ˝ĺăŻä¸č˛ŤăăŚĺ
ĽĺăăăăăéčŚă§ăăă¨ç§ăŻäżĄăăŚăăžăăăźăăłă°ă ăă ăă move_initialized
ătransmute_initialized
ăŞăŠăĺĽăŽĺĺă使ç¨ăăĺż
čŚăăăăăăăăžăăă
ăžăă v.write()
ă¨v.read_initialized()
ăŤă¤ăăŚăŻă v.as_ptr().write()
ă¨v.as_ptr().read()
čś
ăăćŁăŽĺ¤ăŻčŚăăăžăăă ĺžč
ăŽ2ă¤ăŻčޤç¨ăăăĺŻč˝ć§ăä˝ăăăă§ăă
ăžăă
v.write()
ă¨v.read_initialized()
ăŤă¤ăăŚăŻăv.as_ptr().write()
ă¨v.as_ptr().read()
čś ăăćŁăŽĺ¤ăŻčŚăăăžăăă ĺžč ăŽ2ă¤ăŻčޤç¨ăăăĺŻč˝ć§ăä˝ăăăă§ăă
v.write()
ďźăžăăŻv.set()
ăžăăŻćčżç§ăăĄăĺźăă§ăăăăŽďźăŻĺŽĺ
¨ă§ăă v.as_ptr().write()
ăŻunsafe
ăăăăŻăĺż
čŚă§ăăăăăăŻăĄăăŁă¨é˘ĺă§ăă v.read_init()
ă¨v.as_ptr().read()
ăŤă¤ăăŚăŻĺćăăžăăă v.read_init()
ăŻä¸čŚăŽăăă§ăă
ĺăŽĺĺăćä˝ăăăćŁç˘şăŤčŞŹćăăŚăăă¨ćăăŽă§ăinto_initializedďźselfďźăŽäťŁăăăŤtake_initializedďźselfďźăććĄăăŚăăžăăă çš°ăčżăăŤăŞăăžăăătakeăŻé常ďźmut selfăĺăăintoăŻé常selfăĺăăžăăăä¸č˛ŤăăŚĺćĺŽăăăĺ˝ĺăăăćĺłçăŤćŁç˘şăŞĺ˝ĺăŽćšăéčŚă§ăăă¨ćăăžăă
into_init(ialized)
ăăăă§ăŻćĺłçăŤćŁç˘şă§ăăă¨ĺźˇăćăăŚăăžăăçľĺąă MaybeUninit
ćśč˛ťăăžăă
@mjbshawăăăăăă§ăă ć°ăĽăăŞăăŁă...ăăŚăăăŽĺ ´ĺăŻă set
/ write
ăŤé˘ăă䝼ĺăŽăłăĄăłăăăăšăŚĺăćśăăžăă ăăśăset
ćšăçăŤăăŞăŁăŚăăžăă Cell
ă¨Pin
ăă§ăŤset
ăĄă˝ăăăĺŽçžŠăăŚăăžăă 丝ăŞéăăŻă MaybeUninit::set
ă䝼ĺăŤäżĺăăăĺ¤ăăăăăăăŞăăă¨ă§ăă ăăăăăăăŻăžă write
čżăă§ă...ç§ăŻçĽăăžăăă ăăăăŤăăăăăăĽăĄăłăăŻăăŞăć確ă§ăă
@RalfJungăăŚă take...
ĺżăăŚăă ăăă move...
ă consume...
ă transmute...
ăŞăŠăŽć°ăăĺĺăŻăŠăă§ăăďź into_init(ialized)
ăŻćˇˇäšąăăăăă¨ćăăžăă ç§ăăĺ¤ăĺćĺăăăŚăăăă¨ăćĺłăăžăăăĺŽéăŤăŻăĺ¤ăăă§ăŤĺćĺăăăŚăăăă¨ăćéťçăŤčĄ¨ćăăŚăăžăă
ĺŽéăŤăŻăăă§ăŤĺćĺăăăŚăăă¨ćéťçăŤä¸ťĺźľăăŚăăĺ ´ĺă
into_init
丝埾ăăĺŻä¸ăŽăă¨ăŻăĺ¤ăT
ăŽ_validity invariant_ăćşăăăă¨ă§ăăăăăăT
ă¨ćˇˇĺăăŞăăă¨ăĺ庌ććăă䞥ĺ¤ăăăă¨ćăăžăă
äžăă°ďź
pub mod foo {
pub struct AlwaysTrue(bool);
impl AlwaysTrue {
pub fn new() -> Self { Self(true) }
/// It is impossible to initialize `AlwaysTrue` to false
/// and unsafe code can rely on `is_true` working properly:
pub fn is_true(x: bool) -> bool { x == self.0 }
}
}
pub unsafe fn improperly_initialized() -> foo::AlwaysTrue {
let mut v: MaybeUninit<foo::AlwaysTrue> = MaybeUninit::uninitialized();
// let v = v.into_init(); // UB: v is invalid
*(v.as_mut_ptr() as *mut u8) = 3; // OK
// let v = v.inti_init(); // UB v is invalid
*(v.as_mut_ptr() as *mut bool) = false; // OK
let v = v.into_init(); // OK: v is valid, even though AlwaysTrue is false
v
}
ăăă§ă improperly_initialized
ăŽćťăĺ¤ăŻă T
ăŽ_validity invariant_ăćşăăă¨ăăćĺłă§ăŻăĺćĺăăăăžăăă T
_safetyinvariant_ăćşăăă¨ăăćĺłă§ăŻăăăžăăă ăăăăłĺşĺĽăŻĺžŽĺŚă§ăăéčŚă§ăăăăŽĺ ´ĺăăăŽĺşĺĽăŻimproperly_initialized
ăunsafe fn
ă¨ăăŚĺŽŁč¨ăăĺż
čŚăăăăăă§ăă
ăťă¨ăăŠăŽăŚăźăśăźăăĺćĺăăăăŚăăăă¨ăŤă¤ăăŚčŠąăă¨ăă彟ăăŻé常ă MaybeUninit::into_init
ăŽăćĺšă ăĺ¤ĺĺŽĺ
¨ă§ăŻăŞăăăťăăłăăŁăŻăšăćăŁăŚăăžăăă
ăăăăŤă¤ăăŚé常ăŤĺéˇăŤăăăĺ ´ĺăŻă Invalid<T>
ă¨Unsafe<T>
ă Invalid<T>::into_valid() -> Unsafe<T>
使ç¨ăăŚăăŚăźăśăźăŤuninit.into_valid().into_safe()
č¨čż°ăčŚćąăăăă¨ăă§ăăžăă ăăăŚăä¸č¨ăŽimproperly_initialized
čżăăăžăUnsafe<T>
ăăăăłăŚăźăśăźăéŠĺăŽĺ¤ăč¨ĺŽăăĺžăŤăŽăżAlwaysTrue
ăŤtrue
彟ăăĺŽéăŤĺŽĺ
¨ăŞTăĺžăăă¨ăă§ăăžăă
// note: this is now a safe fn
fn improperly_uninitialized() -> Unsafe<foo::AlwaysTrue>;
fn initialized() -> foo::AlwaysTrue {
let mut v: Unsafe<foo::AlwaysTrue> = improperly_uninitialized();
unsafe { v.as_mut_ptr() as *mut bool } = true;
unsafe { v.into_safe() }
}
ăăăŤăăă improperly_uninitialized
ăĺŽĺ
¨ăŞfn
improperly_uninitialized
ăŤăŞăăă¨ăŤćł¨ćăăŚăă ăăăăăăŻă AlwaysTrue
ăĺŽĺ
¨ă§ăŻăŞăă¨ăăä¸ĺ¤ćĄäťśăăé˘ć°ăŽĺ¨ăăŽăăłăĄăłăăă§ăŻăŞăăăżă¤ăă
çă
ăăăťăŠčăéŁăă˘ăăăźăăčż˝ćąăă䞥ĺ¤ăăăăăŠăăăŻăăăăžăăă MaybeUninit
çŽć¨ăŻă匼ĺăăŚăăŚăźăśăźăĺćĺăăăŚăăŞăçĄĺšăŞăĄă˘ăŞăĺŚçă§ăăăăăŤăăăă¨ă§ăăăăŚăźăśăźăŽéĄăŤăăăăŽéăăćăăăăă¨ăŻăăăžăăă ĺäşşçăŤăŻăć示çăŤéĄăĺşăăŞăéăăăŚăźăśăźăăăăăŽéăăçĽăŁăŚăăă¨ăŻćĺž
ă§ăăŞăă¨ćăăžăă MaybeUninit
ćŁăă使ç¨ăăăŤăŻăăăŽéăăçĽăŁăŚăăĺż
čŚăăăăžăă ăăă§ăŞăăă°ăäşşă
ăŻfn improperly_uninitialized() -> AlwaysTrue
ăĺŽĺ
¨ăŞfn
fn improperly_uninitialized() -> AlwaysTrue
ă¨ăăŚć¸ăăĺŽĺ
¨ă§ăŞăAlwaysTrue
čżăăăăăăžăăăăŞăăŞăă彟ăăŻăăăăĺćĺăăăăăă§ăă
Invalid<T>
ă¨Unsafe<T>
ă§ă§ăăăă¨ăŽ1ă¤ăŻă ValidityCheckeable
ă¨UnsafeCheckeable
2ă¤ăŽçšć§ăăăă ValidityCheckeable::is_valid(Invalid<Self>)
ă¨UnsafeCheckeable::is_safe(Unsafe<Self>)
ă§ă Invalid::into_valid
Unsafe::into_safe
ăĄă˝ăăă¨assert_validity!
ă¨assert_safety!
ăăăăžăă
ăłăĄăłăăŤĺŽĺ ¨ć§ăŽä¸ĺ¤ćĄäťśăč¨čż°ăă䝣ăăăŤăăă§ăăŻăŽăłăźăăč¨čż°ăăă ăă§ć¸ăżăžăă
into_inită丝埾ăăĺŻä¸ăŽăă¨ăŻăĺ¤ăTăŽćĺšć§ä¸ĺ¤éăćşăăăŚăăăă¨ă§ăăăä¸čŹçăŞćĺłă§TăăĺćĺăăăăŚăăăă¨ă¨ćˇˇĺăăŞăăă¨ăĺ庌ććăă䞥ĺ¤ăăăă¨ćăăžăă
ăăăŻćŁăăă§ăă OTOHăćĺăŽčŞŹćă§ăŻăăĺćĺăăăăăăăăŽĺççăŞăăăăˇă§ăăă¨ćăăŚăăžăă
ăăăăŞăă¨ăfn improperly_uninitializedďźďź-> AlwaysTrueăĺŽĺ ¨ăŞfnă¨ăăŚč¨čż°ăăĺŽĺ ¨ă§ăŞăAlwaysTrueăčżăĺŻč˝ć§ăăăăžăă
ăăăéŠĺăŤăĺćĺăăăăŚăăŞăăă¨ăĺççăŤććă§ăăă¨ćăăžăă ăăăăŽ2ă¤ăŽä¸ĺ¤ćĄäťśăăŠăăă§ăŠăŽăăăŤç¸äşä˝ç¨ăăăăŤă¤ăăŚăŽéŠĺăŞăăăĽăĄăłăăĺż
čŚă§ăăăă¨ăŤĺćăăžăďźăăăŚăćéŠăŞĺ ´ćăä˝ă§ăăăăŻăăăăžăăďźăăăťă¨ăăŠăŽäşşăŽç´ćă§ăŻă improperly_uninitialized
ăŻĺ¤§ä¸ĺ¤Ťă§ăŻăŞăă¨č¨ăă§ăăăăă¨ăŻăšăăźăăăé˘ć°ă ăäťăŽäşşăŽä¸ĺ¤ćĄäťśăç ´ăăă¨ăăăŽăŻăăç§ăă¨ăŻăšăăźăăăăăšăŚăŽĺŽĺ
¨ăŞé˘ć°ăŻăĺŽĺ
¨ăŞăłăźăăăăăă使ç¨ăăŚĺ¤§ćˇˇäšąăĺźă辡ăăăă¨ăă§ăăŞăăăăŞăăŽă§ăŞăăă°ăŞăăŞăăă¨čăăă¨čŞçśăŤçăăćŚĺżľă ă¨ćăăžăă
Invalidă§ă§ăăăă¨ăŽ1ă¤
ă¨ĺąéş ValidityCheckeableă¨UnsafeCheckeableăŽ2ă¤ăŽçšć§ăăăăValidityCheckeable :: is_validďźInvalid ďźăăăłUnsafeCheckeable :: is_safeďźUnsafe ďźăInvalid :: into_validăĄă˝ăăă¨Unsafe :: into_safeăĄă˝ăăassert_validityăăăăžăďź ăăăŚassert_safetyďź ăăăăŽä¸ăŤă
ăťă¨ăăŠăŽĺ ´ĺăĺŽĺ ¨ć§ăŽä¸ĺ¤ćĄäťśăŻăă§ăăŻă§ăăžăăă 匼ĺ˝ć§ăŽä¸ĺ¤ćĄäťśă§ăăăĺç §ăăă§ăăŻă§ăăŞăĺŻč˝ć§ăăăăžăă ďźăăăŻăç§ăăĄăçŠäşăăŠăŽăăăŤĺ ć°ĺ解ăăăăŤĺ°ăäžĺăăžăăďź
@scottjmaddox
move ...ăconsum ...ătransmute ...ăŞăŠăŽć°ăăĺĺăŻăŠăă§ăăďź into_initďźializedďźăŻćˇˇäšąăăăăă¨ćăăžăă ç§ăăĺ¤ăĺćĺăăăŚăăăă¨ăćĺłăăžăăăĺŽéăŤăŻăĺ¤ăăă§ăŤĺćĺăăăŚăăăă¨ăćéťçăŤčĄ¨ćăăŚăăžăă
move_init
ăŻă into_init
ăăăăă˘ăľăźăˇă§ăłăăăŠăŽăăăŤäźăăžăăďź
assert_init(italized)
ăŻäťĽĺăŤććĄăăăŚăăžăă
ăă ăă read
ăžăăŻread_initialized
ăžăăŻas_ptr().read
ăăĺŽéăŤăŻä˝ă丝埾ăăŚăăŞăăă¨ăŤćł¨ćăăŚăă ăăă
ăăăăŤă¤ăăŚé常ăŤĺéˇăŤăăăĺ ´ĺăŻă
Invalid<T>
ă¨Unsafe<T>
ăInvalid<T>::into_valid() -> Unsafe<T>
使ç¨ăăŚăăŚăźăśăźăŤuninit.into_valid().into_safe()
č¨čż°ăčŚćąăăăă¨ăă§ăăžăă ăăăŚăä¸č¨ăŽimproperly_initialized
čżăăăžăUnsafe<T>
ăŚăźăśăźăéŠĺăŽĺ¤ăŤč¨ĺŽăăĺžăŤăŽăżAlwaysTrue
ăŤtrue
彟ăăĺŽéăŤĺŽĺ ¨ăŞTăĺžăăă¨ăă§ăăžăă
@gnzlbgăăăăăăŻăăŞăć°ăŽĺŠăăăăŽă§ăă ăăăéżăăăăŞăćšćłă§ăŚăźăśăźăŽéĄăŤĺşĺĽăćăăăăăŽă弽ăă§ăă ăăăŻăăăăčŻăćăăŽçŹéă§ăă äşşă
ăŤäşĺşŚčăăăăă匼ĺ˝ć§ăă¨ăĺŽĺ
¨ć§ăďź uninit.into_valid().into_safe()
ăŻă uninit.assume_initialized()
ăŞăŠă¨ćŻčźăăŚăă¨ăŤăăĺéˇă§ăŻăăăžăăă ăăĄăăăăăŽĺşĺĽăăăăăăŤăŻăćĺăŤă˘ăăŤăŤé˘ăăĺćăčŚă¤ăăĺż
čŚăăăăžăă đ
ăăŽă˘ăăŤăăăĺ°ă調ćťăăĺż
čŚăăăă¨ćăăžăă
assert_init(italized)
ăŻäťĽĺăŤććĄăăăŚăăžăă
@RalfJung @eternaleye ďźç§ăŻćăďźăŽăăăŤassume_initialized
ăăăăžăă ăăŞă誏ĺžĺăŽăăćŁĺ˝ĺăŽăŞăšăăŤă¤ăăŚăŻă httpsďź //github.com/rust-lang/rust/issues/53491#issuecomment-440730699ăĺç
§ăăŚ
TBH2ă¤ăŽăżă¤ăăăăăŽăŻĺéˇăăăăăăŤćăăžăă
@RalfJungăăăăăŁă¨ćˇąăćăä¸ăăăă¨ăă§ăăžăăďź ăăăăăéŤĺşŚăŞĺéˇć§ă示ăăŚăăă¨ćăăăäžăăăă¤ăćŻčźăăŚăżăŚăă ăăă
ăăźă...ăăŁă¨ĺéˇăŞAPIăć¤č¨ăăŚăăĺ ´ĺăŻă
uninit.into_inner(uninit.assert_initialized());
ăťăăłăăŁăăŻăŤé常ăŤăăžăćŠč˝ăăĺŻč˝ć§ăăăăžăă ćĺăŽăĄă˝ăăăŻăă˘ăľăźăˇă§ăłăč¨é˛ăăăăźăŻăłăčżăăžăă 2çŞçŽăŽăĄă˝ăăăŻĺ é¨ĺăčżăăžăăăăăăćĺšă§ăăăă¨ă襨ćăăŚăăĺż čŚăăăăžăă
ăăăăć˝čąĄĺăŤăăŁăŚäşşă ă桡䚹ăăééăăçŻăĺŻč˝ć§ăăăăăăăăăčż˝ĺ ăŽĺŞĺăŽäžĄĺ¤ăăăă¨ĺŽĺ ¨ăŤç˘şäżĄăăŚăăăăă§ăŻăăăžăăă
@eternaleyeăŽăăăŤassume_initializedăăăăžăďźç§ăŻćăăžăďźă ăăŞă誏ĺžĺăŽăăćŁĺ˝ĺăŽăŞăšăăĺŤăďź53491ďźăłăĄăłăďźăĺç §ăăŚăă ăăă
ăă§ă˘ă assume_initialized
ăŻç§ăŤăŻăăă§ăăă
ăžăăŻĺ¤ĺăăăŻassume_init
ă§ăăďź ăăăŻăăăăăăłăłăšăăŠăŻăżă¨ć´ĺçă§ăăăšăă§ăăMaybeUninit::uninit()
VS MaybeUninit::uninitialized()
-ăăăŚä¸ă¤ăŻăćă
ăŻăăăŤăăŽĺźăłĺşăăčĄăĺż
čŚăăăăžăăŽă§ăćĺăŽăăăă§ĺŽĺŽĺăăăă¨ăäşĺŽăăăŚăăăă¨ă
@nicoburnsăăăŤăăźăŻăłăäťăăŚéćĽĺç §ăčż˝ĺ ăăăă¨ă§ĺžăăăăĄăŞăăăŻăăăăžăăă
ăăăăăŁă¨ćˇąăćăä¸ăăăă¨ăă§ăăžăăďź ăăăăăéŤĺşŚăŞĺéˇć§ă示ăăŚăăă¨ćăăăäžăăăă¤ăćŻčźăăŚăżăŚăă ăăă
ăăă¨ăăăăăăă ăŽă MaybeUninit
ăăăĺéˇă§ăăăă¨ăŻćăăă§ăăăďź čż˝ĺ ăŽç˛žçĽçč˛ ć
ďź2ă¤ăŽăżă¤ăăç解ăăĺż
čŚăăăďźăăăăăăăăäşéăŽă˘ăłăŠăăăłă°ăăăăăăăŻç§ăăŠăĄăăŽăżă¤ăă使ç¨ăăăăé¸ćăăŞăăă°ăŞăăŞăăă¨ăćĺłăăžăă ăăăăŁăŚăăăăŤăŻčż˝ĺ ăŽăłăšăăăăăćŁĺ˝ĺăăĺż
čŚăăăă¨ćăăžăă
ç§ăŻĺŽéăä¸čŹçăŤUnsafe
ăŽćç¨ć§ăçăŁăŚăăžăă ăłăłăă¤ăŠăźăŽčŚłçšăăăŻăăăăŻĺŽĺ
¨ăŤNOPăŤăŞăăžăă ăłăłăă¤ăŠăŻăăăźăżăĺŽĺ
¨ć§ăŽä¸ĺ¤ćĄäťśăćşăăăŚăăă¨ăŻćąşăăŚćłĺŽăăžăăă ăŠă¤ăăŠăŞĺŽčŁ
ăŽčŚłçšăăă Vec
ĺŽčŁ
ă§ăä¸ćçăŤĺŽĺ
¨ć§ăŽä¸ĺ¤ćĄäťśăŤéĺăăăăłăŤăăłăźăăUnsafe<Vec<T>>
ăŤĺ¤ćăăă¨ăăłăźăăŽĺŻčŞć§ăĺä¸ăăăăŠăăăŻé常ăŤçăăăă§ăă ăăăŚăćč˛ăŽčŚłçšăăăćĺšă§ăăăĺŽĺ
¨ă§ăŻăŞăVec<T>
ăä˝ćăăăăăĺŽĺ
¨ăŞăłăźăăŤć¸Ąăă¨ăăăšăŚăççşăăă¨ăăŤă誰ăăéŠăăăă¨ăŻćăăžăăă
ăăăăłăłăă¤ăŠăŽčŚłçšăăĺż
čŚăŞMaybeUninit
ă¨ćŻčźăăŚăă ăăăăžăăçŹčŞăŽăăŠă¤ăăźăăłăźăăŽăćŞăă bool
ăŤćł¨ćăăĺż
čŚăăăă¨ăăäşĺŽăŻăä¸é¨ăŽäşşăŤă¨ăŁăŚăŻéŠăăăăăăžăăă ă
ăăŽăăŞăăŽăłăšăăčăăă¨ă Unsafe
ăŻăăŁă¨ĺźˇăă˘ăăăźăˇă§ăłăĺż
čŚă ă¨ćăăžăă ăă°ăŽé˛ć˘ăăłăźăăŽĺŻčŞć§ăŽĺä¸ăŤĺŽéăŤăŠăŽăăăŤĺ˝šçŤă¤ăăăăăžăăă
MaybeUninit
ăMaybeInvalid
ăŤĺĺĺ¤ć´ăăăăăŽĺźć°ăčŚăăă¨ăă§ăăžăă ăă ăăăçĄĺšăăŻé常ăŤăăăžăă§ăďźä˝ăŤĺŻžăăŚçĄĺšă§ăVec
ăăŻćŹĄăŽĺ ´ĺăŤćĺšă§ăăă¨ćăăăăăăăăžăăăăăăă税éĄăŽä˝żç¨ćłă ăĺćĺăăăŚăăŞăăă¨ăŻăĺ°ăŞăă¨ăăťă¨ăăŠăŽäşşăŤă¨ăŁăŚĺşćŹçăŤćŁăăé˘éŁäťăăăăŞăŹăźăăžăă ăăśăăă匼ĺ˝ć§ä¸ĺ¤ăăăĺćĺä¸ĺ¤ăăŞăŠăŤĺĺĺ¤ć´ăăĺż
čŚăăăăžăăďź
ăăăŤă Unsafe<T>
ăĺĺ¨ăăă ăă§ăŻăăăŽăŠăăăźăŽĺ¤é¨ăŤĺŽĺ
¨ă§ăŞăĺ¤ăĺŤăăăă¨ăŤĺŻžăăŚĺźˇĺăŞĺşçŻăŞčŚĺăćĄç¨ăăŞăéăă誤解ăćăĺŻč˝ć§ăăăăžăďźăŠăăăăăŚăăŞăăăšăŚăŽĺ¤ăĺŽĺ
¨ă§ăăă¨čޤăŁăŚç¤şĺăăăă¨ăŤăăďźă ăăăŻĺ¤§čŚć¨ĄăŞăăă¸ă§ăŻăă§ăăăĺĽăŽRFCă¨ăăĺşçŻăŞăłăăĽăăăŁăŽăłăłăťăłăľăšăĺż
čŚăŤăŞăăžăă ç§ăŻăăăăăăśăçŠč°ăé¸ăă¨äşćłăďź @RalfJungăŻä¸č¨ăŤĺŻžăăŚăăă¤ăăŽćŁĺ˝ăŞççąăä¸ăăžăăďźăUBăé˘ä¸ăăŚăăŞăăŽă§MaybeUninit
ăăăĺźąăč°čŤăăăăžă-ăăăŻćŹčłŞçăŤăšăżă¤ăŤăŽčłŞĺă§ăă ăăŽăăăRFCăĺăĺ
Ľăăăăć¨ćşăŠă¤ăăŠăŞă¨ăăăĽăĄăłăăć´ć°ăăăă¨ăăŚăăăăŽăăăŞčŚĺăRustăłăăĽăăăŁă§ćŽéçăŤăŞăăăŠăăăŤă¤ăăŚăŻćççă§ăă
ăăăăŁăŚăăłăłăăłăˇă§ăłăčĄăăăăă¨ăćăă§ăăIMOăŻă MaybeUninit
APIăăă¤ăŻăˇă§ăăăăăăă大ăăŞéăćăăăă¨ăă§ăăžăăăăŽăăăťăšăŽč§Łćąşăĺž
ă¤ăăăŤăĺŽĺŽĺăăăăŤé
ăăăŞăăă¨ăăĺ§ăăăžăă MaybeUninit<T> -> T
ĺ¤ćăĺŽĺŽăăăĺ ´ĺăĺ°ćĽăŽRustä¸äťŁăŻMaybeUninit<Unsafe<T>>
ăć¸ăčžźăă§ăćĺăŤĺćĺăăăŚăăŞăăăźăżă示ăăĺćĺăăăĺžăĺŽĺ
¨ă§ăŻăŞăĺŻč˝ć§ăăăăžăă
@RalfJung
ăžăăŻĺ¤ĺăăăŻ
assume_init
ă§ăăďź ăăăŻăłăłăšăăŠăŻăżăźă¨ä¸č´ăăŚăăĺŻč˝ć§ăăăăžăăMaybeUninit::uninit()
寞MaybeUninit::uninitialized()
-ăăăŚăćĺăŽăăăă§ĺŽĺŽĺăăäşĺŽăŞăŽă§ăăăăŤĺźăłĺşăĺż čŚăăăăžăă
ăżă¤ăăăłăłăšăăŠăŻăżăźăăăăł-> T
é˘ć°ă¨ăŽ-ialized
ăľăăŁăăŻăšăăŞăăŽă§ă ::uninit()
ă¨.assume_init()
ăăăăăčĄăćšćłă ă¨ćăăžăă
ăăă¨ăăăăăăă ăŽă
MaybeUninit
ăăăĺéˇă§ăăăă¨ăŻćăăă§ăăăďź
çśćłăŤăăŁăŚç°ăŞăăžă... foo.assume_init().assume_safe()
ďźăžăăŻăç°Ąć˝ăŤăăĺžĺăăăĺ ´ĺăŻfoo.init().safe()
ďźăŻăăăťăŠéˇăăŻăŞăă¨ćăăžăă ĺż
čŚăŤĺżăăŚăçľăżĺăăăfoo.assume_init_safe()
ă¨ăăŚćäžăăăă¨ăă§ăăžăă ăăŽçľăżĺăăăŤăŻă2ă¤ăŽäťŽĺŽă芳ăă誏ćăăă¨ăăĺŠçšăăăăžăă
čż˝ĺ ăŽç˛žçĽçč˛ ć ďź2ă¤ăŽăżă¤ăăç解ăăĺż čŚăăăďźăăăăăăăăäşéăŽă˘ăłăŠăăăłă°ăăăăăăăŻç§ăăŠăĄăăŽăżă¤ăă使ç¨ăăăăé¸ćăăŞăăă°ăŞăăŞăăă¨ăćĺłăăžăă ăăăăŁăŚăăăăŤăŻčż˝ĺ ăŽăłăšăăăăăćŁĺ˝ĺăăĺż čŚăăăă¨ćăăžăă
ăăžăăăă°ăč¤éăăŻă匼ĺ˝ć§ă¨ĺŽĺ ¨ć§ăŽčĺžăŤăăĺşćŹçăŞćŚĺżľăç解ăăĺż čŚăăăăă¨ăŤčľˇĺ ăăžăă ăăăčĄăăăă¨ăç§ăŻăă䝼ä¸ăŽç˛žçĽçăŞč¤éăăŻăŞăă¨ćăăžăă ć šĺşăŤăăăłăłăťăăăŻăăăăäźăăăăăŤéčŚă ă¨ćăăžăă
ç§ăŻĺŽéăä¸čŹçăŤ
Unsafe
ăŽćç¨ć§ăçăŁăŚăăžăă ăłăłăă¤ăŠăźăŽčŚłçšăăăŻăăăăŻĺŽĺ ¨ăŤNOPăŤăŞăăžăă ăłăłăă¤ăŠăŻăăăźăżăĺŽĺ ¨ć§ăŽä¸ĺ¤ćĄäťśăćşăăăŚăăă¨ăŻćąşăăŚćłĺŽăăžăăă
ćżçĽăăžăă; ăłăłăă¤ăŠăŽPOVăăăŻĺ˝šăŤçŤăăŞăăă¨ăŤĺćăăžăă ăăŽĺşĺĽăŤăăćç¨ć§ăŻăä¸ç¨ŽăŽăăťăăˇă§ăłăżă¤ăăă¤ăłăżăźăă§ă¤ăšă¨ăăŚăŽăăŽă§ăă
ăăŽăăŞăăŽăłăšăăčăăă¨ă
Unsafe
ăŻăăŁă¨ĺźˇăă˘ăăăźăˇă§ăłăĺż čŚă ă¨ćăăžăă ăă°ăŽé˛ć˘ăăłăźăăŽĺŻčŞć§ăŽĺä¸ăŤĺŽéăŤăŠăŽăăăŤĺ˝šçŤă¤ăăăăăžăăă
ç§ăŽçŽăĺźăăăŽăŻăćăăăăă§ăă .assume_init()
ăŻăOKă匼ĺ˝ć§ăŽä¸ĺ¤ćĄäťśă確čŞăăăŽă§ăčŻăT
ăă§ăăăă¨ăăćĺłă ă¨äşşă
ăčăăă¨ăééăăŻĺż
ă辡ăăă¨ćăăžăă MaybeUninit<T>
ăŽçžĺ¨ăŽăšăăźă ăŻăăăŽăăăŤĺ˝šăŤçŤăăŞăăăŽă§ăă ăăăăç§ăŻĺĺă¨ăăŚUnsafe<T>
ă¨Invalid<T>
ă¨çľĺŠăăŚăăžăăă ĺĺăä˝ă§ăăă2ă¤ăŽăżă¤ăăŤĺăăăă¨ăŻćč˛çăŤĺ˝šçŤă¤ă¨ćăăžăă ăăăăăçžĺ¨ăŽăăŹăźă ăŻăźăŻĺ
ă§ăăăčŁăăă¨ăă§ăăăăăĽăĄăłăă埡ĺăăăŞăŠăäťăŽćšćłăăăăžăăďź
MaybeUninit
ĺĺăMaybeInvalid
ăŤĺ¤ć´ăăăăăŽĺźć°ă_čŚăăă¨ăă§ăăžă_ă ăă ăăăçĄĺšăăŻé常ăŤăăăžăă§ăďź_what _ďźăŤăŻçĄĺšďźăăćĺšăă¨ăĺŽĺ ¨ăăŽĺşĺĽăŤćˇˇäšąăăŚăăäşşăčŚăăăžăăăćĺšăŞVec
ăăŻćŹĄăŽĺ ´ĺăŤćĺšă§ăăă¨ćăăăăăăăăžăăăăăăă税éĄăŽä˝żç¨ćłă ăĺćĺăăăŚăăŞăăă¨ăŻăĺ°ăŞăă¨ăăťă¨ăăŠăŽäşşăŤă¨ăŁăŚĺşćŹçăŤćŁăăé˘éŁäťăăăăŞăŹăźăăžăă ăăśăăă匼ĺ˝ć§ä¸ĺ¤ăăăĺćĺä¸ĺ¤ăăŞăŠăŤĺĺĺ¤ć´ăăĺż čŚăăăăžăăďź
ç§ăŻăăćĺšć§ăă¨ăĺŽĺ ¨ć§ăăăćĺšć§ăăŽéżăăŤăăŁăŚćˇˇäšąăăŚăăăă¨ăŤééăăŞăĺćăăžăă ç§ăŻă匼ĺ˝ć§ăăŽäťŁăăăŤăăăˇăłä¸ĺ¤ăăăăĺŽĺ ¨ć§ăăăĺăˇăšăă ä¸ĺ¤ăăŤç˝ŽăćăăŚăăžăăă
@rkruppe
ăăăăŁăŚăăłăłăăłăˇă§ăłăčĄăăăăă¨ăćăă§ăăIMOăŻă
MaybeUninit
APIăăă¤ăŻăˇă§ăăăăăăă大ăăŞéăćăăăă¨ăă§ăăžăăăăŽăăăťăšăŽč§Łćąşăĺž ă¤ăăăŤăĺŽĺŽĺăăăăŤé ăăăŞăăă¨ăăĺ§ăăăžăăMaybeUninit<T> -> T
ĺ¤ćăĺŽĺŽăăăĺ ´ĺăĺ°ćĽăŽRustä¸äťŁăŻMaybeUninit<Unsafe<T>>
ăć¸ăčžźăă§ăćĺăŤĺćĺăăăŚăăŞăăăźăżă示ăăĺćĺăăăĺžăĺŽĺ ¨ă§ăŻăŞăĺŻč˝ć§ăăăăžăă
čŻăçšăçšăŤĺă MaybeUninit<Unsafe<T>>
; ăżă¤ăĺăŽĺéˇć§ăć¸ăăăăăŤăăżă¤ăă¨ă¤ăŞă˘ăšăčż˝ĺ ăăăă¨ăă§ăăžăă
ăżă¤ăăăłăłăšăăŠăŻăżăźăăăăł-> Té˘ć°ă¨ăŽ3ćšĺăŽä¸č˛Ťć§ăäżă¤ăă¨ăă§ăăă°ăăăăŤčŻăă§ăăăă ăżă¤ăăŤăŻ-ializedăľăăŁăăŻăšăăŞăăŽă§ă:: uninitďźďźă¨.assume_initďźďźăăăăăčĄăćšćłă ă¨ćăăžăă
ĺćăăžăăă into
ăăŹăăŁăăŻăšă夹ăăŽăŻĺ°ăć˛ăăă§ăăăăăăäżćăăčŻăćšćłăăăăăžăăă
ă§ăŻă read
/ read_init
ăŻăŠăă§ăăăăă ptr::read
ă¨ăŽéĄäźźć§ăŻăăăăăĺŽéăŤĺćĺăăăŚăăăă¨ă確čŞăăćšăăăăă¨ăăăăŞăŹăźăŤĺĺă§ăăďź read_init
ăŻă into_init
ă¨ĺć§ăŽĺéĄăăăăžăăďźăăăŻă䝎ĺŽă¨ăăŚă§ăŻăŞăăĺćĺăăăăăăŤčăăăžăăďź assume_init
ăŻread
ăăăŤăŞăăžăăďź
ăăžăăăă°ăč¤éăăŻă匼ĺ˝ć§ă¨ĺŽĺ ¨ć§ăŽčĺžăŤăăĺşćŹçăŞćŚĺżľăç解ăăĺż čŚăăăăă¨ăŤčľˇĺ ăăžăă ăăăčĄăăăă¨ăç§ăŻăă䝼ä¸ăŽç˛žçĽçăŞč¤éăăŻăŞăă¨ćăăžăă ć šĺşăŤăăăłăłăťăăăŻăăăăäźăăăăăŤéčŚă ă¨ćăăžăă
Vec
ä˝ăăăăăéŠĺăŤä˝żç¨ăăŚă Vec
ăŽä¸ĺ¤ćĄäťśăŤéĺăăĺ ´ĺăĺć ăăĺ ´ĺăăłăźăäžăćăăŚăăă ăăžăăďź ăăăŻé常ăŤĺéˇă§ăĺŽéăŤä˝ă辡ăăăăĺŽĺ
¨ăŤćć§ăŤăăă ăăă¨ćăăžăă
ăăŽăăăŞăżă¤ăăčż˝ĺ ăăăă¨ăŻăć šĺşăŤăăćŚĺżľăäźăăăăăŽééăŁăćšćłă ă¨ćăăžăă
.assume_initďźďźăăOK;匼ĺ˝ć§ăŽä¸ĺ¤ćĄäťśăăă§ăăŻăăăŽă§ăčŻăTăă§ăăăă¨ăăćĺłă ă¨äşşă ăčăăă¨ăééăăĺż ă辡ăăă¨ćăăžăă
ăăăŽVec<i32>
ă0xFF
ă§ăăŁăąăăŤć¸ăčžźăă§ĺćĺăăăŽă§ăĺćĺăăăăŽă§ăăăăˇăĽă§ăăăă¨ăăăăăŞäşşăŻăťă¨ăăŠăăŞăă¨ćăăžăă ĺ°ăŞăă¨ăăăăăĺŽéăŤäşşă
ăçŻăééăă§ăăă¨ăăăăă確ăăŞăăźăżăŽĺ
ĺăčŚăăă¨ćăăžăă
ç§ăŽçľé¨ă§ăŻăäşşă
ăŻăćŞçĽăŽăłăźăăŤăăźăżăé
ăŁăăăä¸é¨ăŽăăźăżăŤĺŻžăăŚăŠă¤ăăŠăŞćä˝ăĺźăłĺşăăăăăă¨ăăŤăăŠă¤ăăŠăŞăŽä¸ĺ¤ćĄäťśăçśćăăĺż
čŚăăăă¨ăăăăŞăĺ
ĺŽăŞç´ćăćăŁăŚăăžăă
ăăă§ăŻçŠäşăĺ°ăč˝ăĄçăăžăăă ă§ăŻă揥ăŽč¨çťăŤă¤ăăŚăŻăŠăă§ăăăăă
MaybeUninit::uninitialized
ăĺťć˘ăăĺĺăMaybeUninit::uninit
ĺ¤ć´ăăPRăćşĺăăžăăMaybeUninit::{new, uninit, zeroed, as_ptr, as_mut_ptr}
ăĺŽĺŽăăăăăăŽPRăćşĺăăžăăăăăŤăăă set
/ write
ă into_init[ialized]
/ assume_init[ialized]
ăăăăłread[_init[italized]]
ăŤé˘ăă質ĺăćŞč§ŁćąşăŽăžăžăŤăŞăăžăă çžĺ¨ăç§ăŻassume_init
ă write
ă read
ăŤĺžăăŚăăžăăăăăăŤă¤ăăŚăŻäťĽĺăŤčăăĺ¤ăăžăăă ćŽĺżľăŞăăăăăă§ćąşĺŽăä¸ăćšćłăăăăăžăăă
- ăăăä¸é¸ăăă
ăăăŻăďźaďźéć¨ĺĽ¨ăŽčŚĺăžăăŻďźbďźä¸ĺŽĺŽăŞćŠč˝ăŽä˝żç¨ăŞăăŤăĺćĺăăăŚăăŞăĺ¤ăä˝ćăăć掾ăăŞăćéăăăăă¨ăćĺłăăžăăďź ăăăŻćçśĺŻč˝ăŞć ŁčĄă§ăŻăăăžăăă
ĺšćçăŤĺé¤ăăäşĺŽăŽăŞăăăŽăéć¨ĺĽ¨ăŤăăĺ ´ĺăŻăéć¨ĺĽ¨ăŽčŚĺăčż˝ĺ ăăăăăłăŤăĺŽĺŽăă䝣ćżĺăĺŠç¨ă§ăăăăăŤăăĺż čŚăăăăžăă ăă䝼ĺ¤ăŽĺ ´ĺăäşşă ăŻčŚĺăçĄčŚăăŚčŞĺăăĄăŽçć´ťăçśăăăăăŤćł¨éăčż˝ĺ ăăă ăă§ăă
ăăăŻăďźaďźéć¨ĺĽ¨ăŽčŚĺăžăăŻďźbďźä¸ĺŽĺŽăŞćŠč˝ăŽä˝żç¨ăŞăăŤăĺćĺăăăŚăăŞăĺ¤ăä˝ćăăć掾ăăŞăćéăăăăă¨ăćĺłăăžăăďź
ç§ăŻćˇˇäšąăăŚăăžăă ä¸ĺŽĺŽăŞăĄă˝ăăăĺťć˘ăă䝣ăăăŤĺĽăŽä¸ĺŽĺŽăŞăĄă˝ăăăĺ°ĺ Ľăăăă¨ăććĄăăŚăăžăă
ç§ă芹ăăŚăăăă¨ăŤćł¨ćăăŚăă ăăMaybeUninit::uninitialized
ă§ăŻăŞăă mem::uninitialized
ă
ćŽĺżľăŞăăăăăă§ćąşĺŽăä¸ăćšćłăăăăăžăăă
@RalfJungäťăŽĺĺĺ¤ć´PRă§äťĽĺăŤčĄăŁăăăăŤăăăăĺŽčĄăăžăďźăăăŚăĺż čŚăŤĺżăăŚrďźç§ăĺŽčĄăăžăďźă :)
䝼ĺăŤäťăŽĺĺĺ¤ć´PRă§čĄăŁăăăăŤăăăăĺŽčĄăăŚăă ăăďźăăăŚăĺż čŚăŤĺżăăŚç§ăŤćăăŚăă ăăďźă :)
ăăŚăăăăăŻćĺăŽĺŽĺŽĺăŽä¸é¨ă§ăăĺż čŚăŻăŞăăŽă§ăĺ°ăĺž ă¤ă¤ăăă§ăă
ä¸ĺŽĺŽăŞăĄă˝ăăăĺťć˘ăă䝣ăăăŤĺĽăŽä¸ĺŽĺŽăŞăĄă˝ăăăĺ°ĺ Ľăă
ăăăč˝ă¨ă犴ă ăăă§ăŻçśăăŚăă ăăă
ć°ăăććĄăăăĺĺă弽ăă§ăă read
ăćŞç¨ăăăăŽă§ăŻăŞăăă¨ĺ°ăĺżé
ăăŚăăžăăă丝ăŤptr::read
ă¨ăŽé˘éŁäťăăĺĺ ă§ă into_initialized
ăćŞç¨ăăăĺŻč˝ć§ăŻăŻăăăŤä˝ăăăă§ăă ĺ
¨ä˝ă¨ăăŚăć°ăăĺ˝ĺăŻĺŽĺŽĺăŽăăăŤĺŽĺ
¨ăŤĺăĺ
Ľăăăăă¨ćăăžăă
MaybeUninit :: {newăuninităzeroedăas_ptrăas_mut_ptr}ăĺŽĺŽăăăăăăŤPRăćşĺăăžăă
ăăă1.35ăăźăżçăŤăŞăĺŻč˝ć§ăŻăăăžăăďźç´2éąéă§ďźďź
https://github.com/rust-lang/rfcs/pull/2582ăăžă ĺŽĺ
¨ăŤçŠşä¸ăŤăăăă¨ăčăăă¨ăăăăăăăˇăĽăăăă¨ăŤă¤ăăŚĺ°ăççžăăŚă
OTOHă MaybeUninit
ăŻĺĺéˇăéĺž
ăŁăŚăăžăăă ăăăŚăäşşă
ăçžĺ¨ć¸ăăŚăă掾éçĺćĺăŽăłăźăăă MaybeUninit
ć¸ăăăŽăăăĺŞăăŚăăăŽă¨ăŻç°ăŞăăžăă
ă¨ăŻăăă httpsďź//github.com/rust-lang/rust/pull/59284ăŻăžă çé¸ăăŚăăŞăăŽă§ăăăă1.35ăŤăăăăăŤćĽăă§ăăĺż čŚăăăăžăă TBHäşşă ăć°ăăăĄă˝ăăĺă§éăă§ă彟ăăăŠăŽăăăŤćăăăăčŚăăă¨ăă§ăăăăăŤăăă1ăľă¤ăŻăŤĺž ă¤ăă¨ăćăżăžăă
ä¸ăŽć§çŻćŠč˝ă¨ăăăăŁăłăšăăăMaybeInit
ĺŻč˝ć§ăconst
ďź
init
ă¨new
ăŻconst
ă§ăă zeroed
ăŻăăă§ăŻăăăžăăă const
ăŞăĺăŤăconsté˘ć°ăĺŽčĄă§ăăăă¨ăćĄĺźľăăĺż
čŚăăăăžăă
MaybeUninit
ăŤă¤ăăŚăăŁăźăăăăŻăćäžăăăăŁăăŽă§ăăăĺŽéăŽăłăźăăŽĺ¤ć´ăŻhttps://github.com/Thomasdezeeuw/mio-st/pull/71ă§ç˘şčŞă§ă
ç§ăééăăĺŻä¸ăŽĺ°ăăŞĺéĄăŻă MaybeUninit::set
&mut T
ăčżăă¨ă let _ = ...
ă使ç¨ăăĺż
čŚăăăă¨ăăăă¨
ăžăăĺ¤ăăŽĺ ´ĺCă¨çľăżĺăăăŚăăŚăăżăŠă¤ăşăăăé ĺăćä˝ăăă¨ăăŤĺż čŚăŞAPIăčż˝ĺ ăăĺż čŚăăăăžăă
&mut [MaybeUninit<T>]
ăă&mut [T]
ăăćšćłăăăă°äžżĺŠă§ăăăŚăźăśăźăŻăăšăŠă¤ăšĺ
ăŽăăšăŚăŽĺ¤ăéŠĺăŤĺćĺăăăŚăăăă¨ă確čŞăăĺż
čŚăăăăžăăuninitialized_array
ăăăŞăăăŞăăŻé
ĺă¤ăăˇăŁăŠă¤ăśăźé˘ć°ăžăăŻăăŻăăé常ăŤäžżĺŠă§ăăMaybeUninităŤă¤ăăŚăăŁăźăăăăŻăćäžăăăăŁă
ăŠăăăăăă¨ăďź
MaybeUninit :: setă§ďźmut Tăčżăă¨ălet _ = ..ă使ç¨ăăĺż čŚăăăăžăă
ăŠăăăŚďź ćťăĺ¤ăăć¨ăŚăăăă¨ăă§ăăžăăĺŽéăăăăĽăĄăłăăŽäžlet _ = ...
ăŻĺŽčĄăăăžăăă ďź write
/ set
ăŻăžă äžăăăăžăă...ăăăĺŽéăŤăŻread
ă¨ăťă¨ăăŠĺăă§ăăĺ¤ĺăăăŻăă ăŞăłăŻăăăšăă§ăăďź
foo.write(bar);
let
ăŞăăŚăĺéĄăŞăĺä˝ăăžăă
ăŚăăżăŠă¤ăşăăăé ĺă§ăŽä˝ćĽ
ăăăăăăŻééăăŞăĺ°ćĽăŽé˘ĺżăŽăăĺéă§ăă
@RalfJung
MaybeUninit :: setă§ďźmut Tăčżăă¨ălet _ = ..ă使ç¨ăăĺż čŚăăăăžăă
ăŠăăăŚďź ćťăĺ¤ăăć¨ăŚăăăă¨ăă§ăăžăăĺŽéăăăăĽăĄăłăăŽäž
let _ = ...
ăŻĺŽčĄăăăžăăă ďźwrite
/set
ăŻăžă äžăăăăžăă...ăăăĺŽéăŤăŻread
ă¨ăťă¨ăăŠĺăă§ăăĺ¤ĺăăăŻăă ăŞăłăŻăăăšăă§ăăďź
unused_results
ăŽčŚĺăćĺšăŤăăăŽă§ă let _ = ...
ăŞăă¨čŚĺă襨示ăăăžăă ăăăăăăŠăŤăă§ăŻăŞăăă¨ăĺżăăžăăă
ăăăç§ăŻăăŽčŚĺăŤă¤ăăŚçĽăăžăăă§ăăă é˘ç˝ăă
ăăăŻă write
ăĺç
§ăčżăăŞăăăăŤăăăăăŽĺźć°ă§ăăĺŻč˝ć§ăăăăăăăŤéčŚăăăĺ ´ĺăŻăăăŽăăăŽĺĽăŽăĄă˝ăăăćäžăăžăă
uninitialized_array
ăăăŞăăăŞăăŻé ĺă¤ăăˇăŁăŠă¤ăśăźé˘ć°ăžăăŻăăŻăăé常ăŤäžżĺŠă§ăă
ăăăŻ[MaybeUninit::uninit(); EVENTS_CAP]
ăžăă https://github.com/rust-lang/rust/issues/49147ăĺç
§ăăŚ
ăăăăăăŠăŤăă§ăŻăŞăăă¨ăĺżăăžăăă
ăăăŻă
write
ăĺç §ăčżăăŞăăăăŤăăăăăŤéčŚăăăĺ ´ĺăŻăăŽăăăŽĺĽăŽăĄă˝ăăăćäžăăăăăŽĺźć°ăŤăŞăĺŻč˝ć§ăăăăžăă
ăăăăŽăăă§ăăďź ĺ°ćĽăăăŤéčŚăăăĺ ´ĺăŻăĺç §ăčżă
ăăăăŽăăă§ăăďź
ăăăĺ¤ăč¨ĺŽăăăăă¸ăŽĺŻĺ¤ĺç §ăčżăăĄă˝ăăăŻăăăăăăăžăă
@Centril HehăäťăŽĺ ´ćă§ăăăć¸ăăă¨ăăŤăăăă§ăăŞăăŽăłăĄăłăăčŚăă¨ăŻćăăŞăďź https ďź
https://github.com/rust-lang/rust/pull/59912ă§ĺťć˘ăăăĺ¤ăĺĺĺ¤ć´ăăăé˘ć°ăĺé¤ă
ăăŽĺžă揥ăŤăăăšăăă¨ăŻĺŽĺŽĺăććĄăăăă¨ă ă¨ćăăžă...ďźtadaďź
rust-lang / rfcsďź2582ăăžă ĺŽĺ ¨ăŤçŠşä¸ăŤăăăă¨ăčăăă¨ăăăăăăăˇăĽăăăă¨ăŤă¤ăăŚĺ°ăççžăăŚăăžăă ďź/ăăŽRFCăăŞăăă°ăć§é ä˝ăŽćŽľéçăŞĺćĺăŻăžă ä¸ĺŻč˝ă§ăăăă¨ăŤăăäşşă ăŻăăăčĄăăžăă
OTOHăMaybeUninit
ăŻĺĺéˇăéĺž ăŁăŚăăžăăă ăăăŚăäşşă ăçžĺ¨ć¸ăăŚăă掾éçĺćĺăŽăłăźăăăMaybeUninit
ć¸ăăăŽăăăĺŞăăŚăăăŽă¨ăŻç°ăŞăăžăă
ăăŽĺžă揥ăŤăăăšăăă¨ăŻĺŽĺŽĺăććĄăăăă¨ă ă¨ćăăžă...đ
@RalfJungăăăŽăăăĽăĄăłăăŽçść ăŻăŠăă§ăăďź ç§ăăăăăç ăăŽăĺŠăăăăă¤ăăŽć確ăŞćć¸ă§ăäşşă ăŻă¨ăŤăăăăăăăă ăăăăčť˝ć¸ăăăă¨ăă§ăăă°... :)
MaybeUninit
ăŽăăăĽăĄăłăăçšăŤassume_init
ăŽăăăĽăĄăłăăčŞăă¨ăăĺŽĺ
¨ć§ăăťăŻăˇă§ăłă§ă mu.assume_init()
ăĺźăłĺşăăŚăăăŽçľćăčżăăăŠăăăć確ă§ăŻăăăžăăăĺŽĺ
¨ăŞfn
ă§ăŻăĺŽĺ
¨ć§ăŽä¸ĺ¤ćĄäťśăçśćăăĺż
čŚăăăăžăă ĺŽĺŽăăăĺăŤăăăăăŽăăăĽăĄăłăăćĄĺźľăăăŠă¤ăăŠăŞăćäžăăĺŽĺ
¨ć§ăŽä¸ĺ¤ćĄäťśăŽăšăăăăăćäžăăăă¨ăăĺ§ăăăžăăăăăŻă MaybeUninit
ă使ç¨ăăă¨ăăŤăćŻćăăĺż
čŚăăăăžăă
ăăă§ăŽăăăĽăĄăłăăŽçść ăŻăŠăă§ăăďź ç§ăăăăăç ăăŽăĺŠăăăăă¤ăăŽć確ăŞćć¸ă§ăäşşă ăŻă¨ăŤăăăăăăăă ăăăăčť˝ć¸ăăăă¨ăă§ăăă°... :)
ăăăăăć§é ä˝ăŽćŽľéçăŞĺćĺăŤé˘ăăăťăŻăˇă§ăłăčż˝ĺ ăăçžĺ¨ăŻăľăăźăăăăŚăăŞăă¨čż°ăšăžăă ăăăčŞăă§ăăäşşăŻăWTFăăťăă¨ďźăăżăăăŞćăăŤăŞăăžăă
TBHăăăŻăăŞăă¤ăŠă¤ăŠăăžăă :(ç§ăăĄăŻäťăžă§ăŤăăăŤă¤ăăŚăăă¤ăăŽă˘ăăă¤ăšăćăäťăăă¨ăé常ăŤĺŻč˝ă ăŁăă¨ćăăžăăăăăŚç§ăăĄăŻăăăăăăă¨ăă§ăăŞăăŁăăŽăŻć˛ăăă§ăă
ăĺŽĺ ¨ć§ăăťăŻăˇă§ăłă§ăŻămu.assume_initďźďźăĺźăłĺşăăŚăăăŽçľćăĺŽĺ ¨ăŞfnăŤčżăĺ ´ĺăĺŽĺ ¨ć§ăŽä¸ĺ¤ćĄäťśăçśćăăĺż čŚăăăăă¨ăŻćăăă§ăŻăăăžăăă ĺŽĺŽăăăĺăŤăăăăăŽăăăĽăĄăłăăćĄĺźľăăMaybeUninită使ç¨ăăă¨ăăŤăćŻćăăĺż čŚăăăăŠă¤ăăŠăŞćäžăŽĺŽĺ ¨ä¸ĺ¤ćĄäťśăŽăšăăăăăćäžăăăă¨ăăĺ§ăăăžăă
ĺşćŹçăŤăăăăăăźăżĺä¸ĺ¤ćĄäťśăŽĺ
¨ä˝çăŞčăćšă¨ăăăăRustă§ăŠăŽăăăŤćŠč˝ăăăă誏ćăăăăăĽăĄăłăăŤĺ¤ćăăăă¨ăććĄăăŚăăžăă MaybeUninit
ăŻăăŽăăăŽééăŁăĺ ´ćă ă¨ćăăžăă ăăăŻăăăŽć¸ĺżľăĺŽéăŤăŻăăă§ăŻăŞăăŽăŤMaybeUninit
ăŤĺşćă§ăăăăăŤčăăăă§ăăăă ăăŞăăćąăăŚăăăă¨ăŻăăăăłăłăŽăăăŞăăŁă¨éŤăăŹăăŤăŽĺ ´ćă§čŞŹćăăăăšăă§ăă MaybeUninit
ăŽăăăĽăĄăłăăăăăŽăżă¤ăăŽä¸ťčŚăŞĺéĄăŤçŚçšăĺ˝ăŚăäşĺŽă§ăă ăăă彚ăŤçŤă¤ă¨ćăăŞăăăăăăčŞçąăŤćĄĺźľăăŚăă ăăă :)
ĺşćŹçăŤăăăăăăźăżĺä¸ĺ¤ćĄäťśăŽĺ ¨ä˝çăŞčăćšă¨ăăăăRustă§ăŠăŽăăăŤćŠč˝ăăăă誏ćăăăăăĽăĄăłăăŤĺ¤ćăăăă¨ăććĄăăŚăăžăă
ăăăŻĺ°ă埡ĺă§ă... MaybeUninit<T>
ăŽăăăĽăĄăłăăŽćŚçĽçăŞĺ ´ćă§ăăăăă __ăĄăŞăżăŤ__ăĺŽĺ
¨ć§ăŽä¸ĺ¤ăŽĺéĄăăă ăăăă¨ććĄăăŚăăă ăă§ăă ĺ°čŞŹăčż˝ĺ ăăăă¨ăććĄăăŚăăăăă§ăŻăăăžăăă ;ďźăăŽĺ°čŞŹăŻăăăłăłăŤĺĺ¨ăăăă¨ăă§ăăžăăă MaybeUninit<T>
ă使ç¨ăăăťă¨ăăŠăŽäşşăŻăăťă¨ăăŠăŽĺ ´ĺăć¨ćşăŠă¤ăăŠăŞăŽăăăĽăĄăłăă¨ă¤ăłăżăźăă§ă¤ăšăăžăă
äşč§ŁăăžăăăăăăăăšăŚăĺŽĺŽĺPRăŤçľăżčžźăă§ăżăžăăďź https ďź
ç§ăŻăĄăăăŠăŽĺŠç¨ăŤă¤ăžăăămem::uninitialized
ăŽć¨ćşăŠă¤ăăŠăŞăŽăăăĽăĄăłăă§ăćŹĺ˝ăŤäťăŤăŠăăă¨ăŤćł¨ćăăăă¨ăŻçĽăăŞăăŁăăŽćĺžăŽäžcore::ptr::drop_in_place
ăăźăşăçŽčăŽăăăŞăăŽăďźć´ć°ăăžăhttps://github.com/rust-lang/rfcs/pull/2582ăŤăăŁăŚăŽăżčŞĺŻăăăäťăŽĺ˝˘ĺźăŽUBă示ăăŚăăăŽă§ăĺäşşçăŤăŻĺé¤ăăžăďźă
@HeroicKatoraăăăă¨ăďź ăăŽäżŽćŁăhttps://github.com/rust-lang/rust/pull/60445ăŤçľăżčžźăżăžăă
çžĺ¨ăref-to-unaligned-fieldăŤă¤ăăŚăŻä˝ăă§ăăžăăăăăăăĽăĄăłăăĺé¤ăăăŽăčŻăăăŠăăăŻăăăăžăăă
ăĄăżăăźăżăŤé¨ĺçăŤĺşăĽăăŚăăźăżăĺćĺăăăăŹă¤ăPartialUninit
ďźăžăăŻPartialInit
ďźăčż˝ĺ ăăăăăăăžăăă
äžďź MODULEENTRY32W ă
ćĺăŽăăŁăźăŤăďź dwSize
ďźăŻăć§é ä˝ăľă¤ăşďź size_of::<MODULEENTRY32W>()
ďźă§ĺćĺăăĺż
čŚăăăăžăă
pub trait PartialUninit: Sized {
fn uninit() -> MaybeUninit<Self>;
}
impl<T> PartialUninit for T {
default fn uninit() -> MaybeUninit<Self> {
MaybeUninit::uninit()
}
}
impl PartialUninit for MODULEENTRY32W {
unsafe fn uninit() -> MaybeUninit<MODULEENTRY32W> {
let uninit = MaybeUninit { uninit: () };
uninit.get_mut().dwSize = size_of::<MODULEENTRY32W>();
uninit
}
}
ăăŞăăŻăŠăŽăăăŤćăăžăăďź
@kgvçłă訳ăăăžăăăăăăŞăăŽććĄăăăăăžăăă ăăăăăăăŞăă解湺ăăăă¨ăăŚăăĺéĄă誏ćăăăăă¤ăăŽčż˝ĺ ăŽăłăłăăăšăă彚çŤă¤ĺŻč˝ć§ăăăăžăăďź ăăăŚĺ¤ĺăăŞăăŽććĄăăă解湺çăŽăăĺŽĺ ¨ăŞäžďź
@scottjmaddoxă俎ćŁăăăžăăă ăŻăŁăăăăŚăăžăăďź
@kgvăăă解湺ăăŚăăĺéĄăŻä˝
ć§é ä˝ăŽĺ˛ăĺ˝ăŚăăźăšăŽé¨ĺçăŞĺćĺăŻăĺé¤ăăĺż
čŚăŽăŞăĺăŤĺŻžăăŚăŽăżćŠč˝ăăăă¨ăŤćł¨ćăăŚăă ăăă ăă䝼ĺ¤ăŽĺ ´ĺă uninit.get_mut().foo = bar
ăŻfoo
ăăăăăăžăăăăăŻUBă§ăă
@RalfJungç§ă解湺ăăăă¨ăăŚăăĺéĄself
äžĺăăžăăďź Self
ăžăăŻä˝ăŤăäžĺăăžăăďźĺŽć°ďźďźăăă¨ăă°ăăăŁăźăŤăăŽ1ă¤ăŻSelf
ăľă¤ăşă§ăă
@kgvăăŽăăăŞăŚăźăšăąăźăšăŻăăŤăăźă˘ă¸ăĽăźăŤăžăăŻăŻăŹăźăăŤăăŁăŚăăéŠĺăŤĺŚçăăăă¨ăăçšă§ăăăă§@RalfJungăŤĺćăă
ĺŽĺŽĺPRăŻăăăźăżçăŤăĄăăăŠéăŤĺăăăăŤçé¸ăăžăăă :)ăŚăăŞăłă¨ĺćĺăăăŚăăŞăăĄă˘ăŞăŽçśćłă調ćťăĺ§ăăŚăăăç´8ăćăçľăĄăžăăăăăăŚăćçľçăŤăŻ6éąéă§ĺşčˇăăăăăŽăă§ăăžăăă ăŞăăŚć ă ďź ăăăćäźăŁăŚăăăăăšăŚăŽäşşăŤćčŹăăžăă ďźD
ăăĄăăăç§ăăĄăŻăžă çľăăŁăŚăăžăăă 解湺ăăšăhttps://github.com/rust-lang/rfcs/pull/2582ăăămem::uninitialized
ďźä¸ťăŤăăŠăăăăŠăźă ĺşćăŽăłăźăďźăŽä˝żç¨ćłăăžă ăăŞăăăăžăă ćă
ăä˝ăăăšăăăććĄăăĺż
čŚăăăăžăďźç§ăăĄăäťćăŁăŚăăĺŽĺŽăăAPIăŻé常ăŤćĺ°éă§ăăread
ă¨write
ăăăăŚćă
ăŻĺŠăăăŽé
ĺă玹ă§ăŽä˝ćĽă¨ăăăŽAPIăčăĺşăĺż
čŚăăăăžăMaybeUninit
ă ăăăŚăă¨ăłăˇăšăă ĺ
¨ä˝ămem::uninitialized
ăăăăŁăăă¨ç§ťĺăăăăăăŤčĄăăšă誏ćăăăăăăăăžăă
ăăăăăăăŤăăŠăçăăžăăăăŽćĺăŽăšăăăăŻăăăăćăéčŚăŞăšăăăă§ăăă :)
ăăăŚă
MaybeUninit
é ĺă¨ăăăŻăšăŽćä˝ăŤĺ˝šçŤă¤APIăčăĺşăĺż čŚăăăăžăă
@RalfJungăăŽăăăŤ; ăăśăäťăhttps://github.com/rust-lang/rust/issues/49147ă§ä˝ćĽăéĺ§ăăć
ăžăăćŽăăŽăăăăŽĺ°ăăĺéĄăĺŞĺ ăăŚăăăŽčż˝čˇĄăŽĺéĄăĺĺ˛ăăŚéăăĺż čŚăăăăžăă
ăăŽăăăŤ; ĺ¤ĺäťăďź49147ăŤĺăçľăżĺ§ăăćă§ăăďź = P
ăăŠăłăăŁă˘ăăăžăăăďź ;ďźďźç§ăŻăăŽăăăŽćéăăŞăăŽă§ăŻăŞăăă¨ĺżé ăăŚăăžăăďź
ăăăăăăăŽčż˝čˇĄăŽĺéĄăĺĺ˛ăăŚéăăćŽăăŽăăăăŽĺéĄăĺ°ăăăăĺż čŚăăăăžăă
ăăăŻăăăťăšăŽĺ°é厜ăŤăäťťăăăžăă ăăăăç§ăŻĺćăăĺžĺăăăăžăă
ăăŠăłăăŁă˘ăăăžăăăďź ;ďźďźç§ăŻăăŽăăăŽćéăăŞăăŽă§ăŻăŞăăă¨ĺżé ăăŚăăžăăďź
ç§ăŻä˝ăăăžăăă... = D-ç§ăŻăă§ăŤĺăçľăă§ăăăăă¸ă§ăŻăăćăŁăŚăăăŽă§ăăăăăăă°ăăćéăăăăă§ăăăă ĺ¤ĺ誰ăäťăŽäşşăčĺłăćăŁăŚăăžăăďź ďźăăăăăŞăă追补ăŽĺéĄăŤéŁăłäšăŁăŚăă ăăďź
ăăăŻăăăťăšăŽĺ°é厜ăŤăäťťăăăžăă ăăăăç§ăŻĺćăăĺžĺăăăăžăă
ăăăŻç§ă ăă...;ďźç§ăŻăăăĺĺ˛ăăŚăăăŤéăăăă¨ăăžăă
@RalfJungăŻă let x: bool = mem::uninitialized();
ăUBă§ăăă¨ăăăăŞăăŽĺŁ°ćăŤă¤ăăŚăĺéĄăŻăăŞăçĄĺšăŞăăŞăăăŁăăUBă§ăăă¨čŚăŞăăăăŽăă¨ăăăă¨ă§ăă ç§ăç解ăăŚăăăăăŤăUBăăăŞăŹăźăăăă¨ăŻçĄĺšă§ăăăă¨ă確čŞăăăăăŤăĺ¤ăčŞăżĺăĺż
čŚăăăăžăă ăăăăăăŞăăăăăčŞăžăŞăăă°ăăăăŞăä˝ă§ăăďź
䞥ĺ¤ăĺľé ăăăă¨ăăćŞăăă¨ă ă¨ćăăžăăăăăłăă¨ăŤăăăăă訹ăăŞăççąăçĽăăăă§ăăďź çĄĺšăŞçść ă茳ĺŻăăŞăăŚă厳ăŻăŞăăăă§ăă ăăăŻĺćăŽă¨ăŠăźăŽăăă ăă§ăăăăăă¨ăä˝ăäťăŽăăŽă§ăăďź
ăăăăŽäťŽĺŽăŤäžĺăăŚăăăłăłăă¤ăŠăŤĺŽéăŽăąăźăšăŻăăăžăăďź
ăă¨ăă°ă foo(x: bool)
ăăăŞé˘ć°ăŤćł¨éăäťăăŚă x
ăćĺšăŞăăźăŤĺ¤ă§ăăăă¨ăLLVMăŤéçĽăăžăă ăăăŤăăăé˘ć°ăĺ
ă
x
ăăŞăăŚăă true
ăžăăŻfalse
ă§ăŻăŞăbool
ă渥ăăă¨ăUBăŤăŞăăžăă ăăăŻăăłăłăă¤ăŠăźă䝼ĺăŤä˝żç¨ăăăŚăăŞăĺ¤ć°ăŽä˝żç¨ăĺ°ĺ
Ľăăăĺ ´ĺăăăăăäžżĺŠă§ăďźçšăŤăăŤăźăăĺ°ăŞăă¨ă1ĺĺŽčĄăăăăă¨ă訟ćăăăŤăăšăăźăăĄăłăăăŤăźăăă秝ĺăăă¨ăăŤçşçăăžăďźă
ăžăăé˘ć°ăŽĺ˘çă ăă§ăŞăăé˘ć°ĺ ă§ăăăăŽă˘ăăăźăˇă§ăłăŽä¸é¨ăč¨ĺŽďźăžăăŻč¨ĺŽăăăďźăăžăă ăăăŚăĺ°ćĽăăăŽăăăŞć ĺ ąă彚çŤă¤ĺ ´ćăăăŁă¨čŚă¤ăăăăăăăžăăă ăĺ¤ć°ă使ç¨ăăăă¨ăă塧ĺŚăŞĺŽçžŠďźĺŽçžŠăăăŤä˝żç¨ăăç¨čŞă§ăăăĺŽçžŠăăăŽăŻç˘şăăŤç°Ąĺă§ăŻăăăžăăďźă§ăăăăŤăăźă§ăăăăăăăžăăăăĺŽĺ ¨ă§ăŞăăłăźăăŽUBăŤé˘ăăŚăŻăăă ă¨ćăăžăăĺŻč˝ăŞĺ ´ĺăŻç°ĄĺăŞăŤăźăŤăç¨ćăăăă¨ăéčŚă§ăă
ăăăăŁăŚăĺŽĺ
¨ă§ăŞăăłăźăă§ăăŁăŚăăăłăźăĺ
ăŽĺăä˝ăăćĺłăăăă¨ă確čŞăăăă¨ćăăžăă ăăăŻăĺćĺăăăŚăăŞăăĄă˘ăŞăĺ°ç¨ăŽĺă§éŠĺăŤĺŚçăăăă¨ăŤăăŁăŚăŽăżĺŻč˝ă§ăăĺ¤ć°ăŽĺ
厚ăŤă¤ăăŚăłăłăă¤ăŠăŤĺăă¤ăă¨ăăă˘ăăăăŻăŞăyoloăă˘ăăăźăă§ăŻăăăžăăďźăăăăŻbool
ă ă¨ä¸ťĺźľăăžăăăăăĺŽéăŤăŻĺćĺăăŞăăďźă
ăă¨ăă°ăfooďźxďźboolďźăŽăăăŞé˘ć°ăŤćł¨éăäťăăŚăxăćĺšăŞăăźăŤĺ¤ă§ăăăă¨ăLLVMăŤéçĽăăžăă ăăăŤăăăé˘ć°ăĺ ă xăĺç §ăăŚăăŞăăŚăătrueăžăăŻfalseă§ăŻăŞăboolă渥ăăă¨ăUBăŤăŞăăžăă ăăăŻăăłăłăă¤ăŠăźă䝼ĺăŤä˝żç¨ăăăŚăăŞăĺ¤ć°ăŽä˝żç¨ăĺ°ĺ Ľăăăĺ ´ĺăăăăăäžżĺŠă§ăďźçšăŤăăŤăźăăĺ°ăŞăă¨ă1ĺĺŽčĄăăăăă¨ă訟ćăăăŤăăšăăźăăĄăłăăăŤăźăăă秝ĺăăă¨ăăŤçşçăăžăďźă
ăăăŻä˝żç¨ćłă¨čŚăŞăăă¨ăă§ăăžăă ĺ¤ăĺćĺăăŚăćĺšăŞĺ¤ă§ä¸ć¸ăăăăĺăŤăĺ¤ăčŞăżĺăŁăă渥ăăăăăŞăăă¨ăŤă¤ăăŚčłŞĺăăŚăăžăă
ăăŽăăăŞĺžŽĺŚăŞćšćłă§ĺ¤ăĺćĺăăăăăŽćç¨ăŞăŚăźăšăąăźăšăŻčŚĺ˝ăăăžăăăăçĺăŤćăŁăŚăăžăă
ä¸č¨ă§č¨ăă°ăç§ăŽčłŞĺăŻăăăŽăłăźăăUBă§ăăăăŠăăďźăăăĽăĄăłăăŤăăă¨-ăăă§ăďźăăăăăăŞăăç§ăăăć¸ăă¨ćŁç˘şăŤä˝ăĺŁăăăă¨ăăăă¨ă§ă
let _: bool = unsafe { mem::unitialized };
ăľăă¸ă§ăŻăčŞä˝ăŤé˘ăăĺĽăŽčłŞĺďźăăźăăŤç´ćĽăĄă˘ăŞăĺ˛ăĺ˝ăŚăăă¨ăă§ăăbox
ć§ćăăăăăĄă˘ăŞăăšăżăăŻăăăă¨ăăăBox::new()
ă¨ăŻç°ăŞă常ăŤćŠč˝ăăăă¨ăăăăŁăŚăăžăă ă§ăŻă box MaybeUninit::new()
ăăăăăĺ
Ľĺăăă¨ă Box<MaybeUninit<T>>
ăBox<T>
ăŤĺ¤ćăăăŤăŻăŠăăăă°ăăă§ăăăăă ć ¸ĺ¤ćăć¸ăăšăă§ăăăăăă¨ăä˝ă§ăăďź ăăśăăç§ăŻĺăŤăăăĽăĄăłăăŽăăŽçšăčŚéăăă ăă§ăă
@PzixelăŻăăăŽăšăŹăăă§ăă§ăŤBox
ă¨MaybeUninit
éăŽç¸äşä˝ç¨ăŤă¤ăăŚĺŽéăŤčŞŹćăăžăăďźsmileďź
@CentrilăŤăŻăăăăĺĺ˛ăăă¨ăăŤčŻăăăăăăŞăč°čŤăăăľă
ăŻăăăăŽč°čŤăŻčŚăăŚăăžăăăçšĺŽăŽAPIăŻčŚăăŚăăžăăă
ä¸č¨ă§č¨ăă°ăç§ăŻćŹĄăŽăăăŞăăŽă揲ăăă§ă
fn into_inner<A,T>(value: A<MaybeUninit<T>>) -> A<T> { unsafe { std::mem::transmute() } }
ăăăăăăŽăăăŞAPIăŻăŞăă¨ćăăžăăč¨čŞăŽé˛ĺăŽăăŽćçšă§ăŻăăłăłăă¤ăŠăŽăľăăźăăŞăă§ăŻĺŽčŁ ă§ăăŞăăŁăăăă§ăă
ăăĺ°ăčăăŚăżăă¨ăăăăŠăŽăŹăăŤăŽăăšăă§ăćŠč˝ăăăŻăă§ăă ăăăăŁăŚă Vec<Result<Option<MaybeUninit<u8>>>>
ăŻă into_inner
ăčżăVec<Result<Option<u8>>>
into_inner
ăĄă˝ăăăĺż
čŚă§ăă
get_refă¨get_mutăĺćăŤĺŽĺŽĺăăăă¨ćłĺŽăăŚăăžăăďźăăšăŚăŽćŠč˝ăăăŽĺéĄăććăăŚăăžăďźă ăăăăŞăççąăŻăăăžăăďź ăăăăŻç´ ć´ăăăăĺŽčĄăăă˘ăŻăˇă§ăłăŽĺŽčĄă訹ĺŻăăăŚăăăă¨ă示ăĺŻä¸ăŽćć¨ă§ăďźăăăŻćăăăŤtrueă§ăăĺż čŚăăăăžăďźă
ăăăŻä˝żç¨ćłă¨čŚăŞăăă¨ăă§ăăžăă
ăăăăŁăŚă let x: bool = mem::uninitialized()
ăŻbool
ă使ç¨ăăŚăăžăăďź x
ĺ˛ăĺ˝ăŚăăăŚăăĺ ´ĺă§ăďźďźă
fn id(x: bool) -> bool { x }
let x: bool = id(mem::uninitialized());
ăăă使ç¨ăăžăăďź ăŠăă§ăă
fn uninit() -> bool { mem::uninitialized() }
let x: bool = uninit();
ăăă§ăŽčżĺăŻç¨éă§ăăďź
ăăăŻăăăŤé常ăŤĺžŽĺŚăŤăŞăăžăă ăăăăŁăŚăç§ăăĄăä¸ăăăšăçăăŻăăăšăŚăŽĺ˛ăĺ˝ăŚďźMIRăŤä¸ăăĺžăŽăăšăŚăŽĺ˛ăĺ˝ăŚăŽăăăŤăĺŽéăŤăŻăăšăŚăŽăłăăźďźă使ç¨ă§ăăă let x: bool = mem::uninitialized()
ĺ˛ăĺ˝ăŚăĺŤăžăăă¨ăăăă¨ă§ăă
get_refă¨get_mutăĺćăŤĺŽĺŽĺăăăă¨ćłĺŽăăŚăăžăăďźăăšăŚăŽćŠč˝ăăăŽĺéĄăććăăŚăăžăďźă ăăăăŞăççąăŻăăăžăăďź ăăăăŻç´ ć´ăăăăĺŽčĄăăă˘ăŻăˇă§ăłăŽĺŽčĄă訹ĺŻăăăŚăăăă¨ă示ăĺŻä¸ăŽćć¨ă§ăďźăăăŻćăăăŤtrueă§ăăĺż čŚăăăăžăďźă
ăăăŻhttps://github.com/rust-lang/unsafe-code-guidelines/issues/77ăŽč§ŁćąşćăŤăăăăŻăă&mut bool
ăćăŁăŚăăŚăĺŽĺ
¨ă§ăăďź çăăŻăăŻăăă§ăăăšăă ă¨ćăăžăăăäşşă
ăŻĺćăăžăăă
ăăăŻărust-lang / unsafe-code-guidelinesďź77ăŽč§ŁćąşćăŤăăăăŻăăăžă
ăăăăăłă°ăçşçăăĺż čŚăŻăŞăă¨ćăăžăă ăăăĺŽĺŽăăăŚăăĄă˘ăŞăĺćĺăăăŚăăŞăĺ ´ĺăŤăăă使ç¨ăăăŽăŻUBă§ăăă¨č¨ăŁăŚăăăĺéĄăăŞăă¨ĺ¤ćăăĺ ´ĺăŻĺžă§čŚäťśă硊ĺăăăă¨ăă§ăăžăă ăăăŻăĺćĺĺžăŤä˝żç¨ăăăŽăŤéŠăăćšćłă§ăă
ăăŽĺžăčŚäťśă硊ĺăăžă
ă¤ăžăăĺ°ćĽăŽăăźă¸ă§ăłăŽăăăĽăĄăłăăŤĺŻžăăŚăłăźăăŁăłă°ăăăă誰ăăďźAPIäşćďźďźĺ¤ăăăźă¸ă§ăłăŽăłăłăă¤ăŠă使ç¨ăăŚăłăźăăăłăłăă¤ăŤăăĺ ´ĺăUBăĺĺ¨ăăă¨ăăăă¨ă§ăăďź
@Gankro
ăăăăăłă°ăçşçăăĺż čŚăŻăŞăă¨ćăăžăă ăăăĺŽĺŽăăăŚăăĄă˘ăŞăĺćĺăăăŚăăŞăĺ ´ĺăŤăăă使ç¨ăăăŽăŻUBă§ăăă¨č¨ăŁăŚăăăĺéĄăăŞăă¨ĺ¤ćăăĺ ´ĺăŻĺžă§čŚäťśă硊ĺăăăă¨ăă§ăăžăă ăăăŻăĺćĺĺžăŤä˝żç¨ăăăŽăŤéŠăăćšćłă§ăă
ăăăŻç§ăŤăŻé常ăŤčśłăăăăŽăăă§ăă &mut *foo.as_mut_ptr()
ć¸ăăŚăżăžăăăďź ăăšăŚăĺćĺăăăăăŞăăăăćŠč˝ăăŞăăŽă§ăăăăďź IOWăç§ăŻäťăăŞăăč¨ăŁăŚăăăă¨ăŤă¤ăăŚçĺăŤćăŁăŚăăžă
彟ăăĺŽčĄăăă˘ăŻăˇă§ăłăŽĺŽčĄă訹ĺŻăăăŚăăăă¨ă示ăĺŻä¸ăŽĺ ĺ
ăŞăăăă§ăŻăŞăăŽă§ăăăăďź ĺ¤ăĺćĺăăĺžă§ă§ăăăă¨ăăăšăŚçś˛çž çăŤăŞăšăăăă¨ăéˇăăŞăšăăŤăŞăăžăă^^
@shepmaster
ă¤ăžăăĺ°ćĽăŽăăźă¸ă§ăłăŽăăăĽăĄăłăăŤĺŻžăăŚăłăźăăŁăłă°ăăăă誰ăăďźAPIäşćďźďźĺ¤ăăăźă¸ă§ăłăŽăłăłăă¤ăŠă使ç¨ăăŚăłăźăăăłăłăă¤ăŤăăĺ ´ĺăUBăĺĺ¨ăăă¨ăăăă¨ă§ăăďź
äşşă
ă&mut *foo.as_mut_ptr()
ăŞăăăăăŻäťćĽçĺŽă§ăă ç§ăŻăăăéżăăćšćłăăăăăžăăă
ăžăăăăŽăăăĽăĄăłăăä˝ćăăă¨ăăŤĺŽéăŤä˝ăăĺ¤ć´ăăĺż čŚăăăĺ ´ĺăŤăŽăżăUBăăăăžăă ăăăăŞăă¨ăäżč¨źăčĄăĺăŤĺăăłăźăăĺăăłăłăă¤ăŠă§ĺŽčĄăăăĺ ´ĺăŤUBăĺĺ¨ăăă¨ăăĺĽĺŚăŞçśćłăŤ
ăăă§ăăç§ăŻăăŽăăăťăšă
@RalfJung
ăăă§ăŽčżĺăŻç¨éă§ăăďź
ăŻăăĺ¤ăčżăăăăŠăăŤă§ă渥ăăă¨ăŻä˝żç¨ćłă§ăă
ăăăŻăăăŤé常ăŤĺžŽĺŚăŤăŞăăžăă ăăăăŁăŚăç§ăăĄăä¸ăăăšăçăăŻăăăšăŚăŽĺ˛ăĺ˝ăŚďźMIRăŤä¸ăăĺžăŽăăšăŚăŽĺ˛ăĺ˝ăŚăŽăăăŤăĺŽéăŤăŻăăšăŚăŽăłăăźďźă使ç¨ă§ăăălet xďźbool = mem :: uninitializedďźďźăŽĺ˛ăĺ˝ăŚăĺŤăžăăă¨ăăăă¨ă§ăă
ćĺšăŤčŚăăžăă
ă¨ăŤăăăăăăŻäť˛čŁMaybeUninităŽĺ ĽăĺăŤă¤ăăŚă§ăăďź ăŚăźăśăźăăăšăŚăŽăŠăăăźăżă¤ăăŽĺ¤ćăä˝ćăăŞăăŚăăĺŽĺ ¨ăŤĺ¤ćă§ăăžăăďź
@PzixelăăŞăăŽčłŞĺăç解ă§ăăăăŠăăăŻăăăăžăăăă httpsďź//github.com/rust-lang/rust/issues/61011ă§č°čŤăăăŚăăă¨ćă
ăžă ĺŽĺŽăăŚăăŞăMaybeUninit::write()
ăĄă˝ăăăŻunsafe
ăŻăăăžăăăăăă§ăŤĺĺ¨ăăT
ă§dropăŽĺźăłĺşăăăšăăăă§ăăžăăăăăăŻĺŽĺ
¨ă§ăŻăŞăă¨ćłĺŽăăŚăăžăăă ăăăĺŽĺ
¨ă§ăăă¨čăăăăĺäžăŻăăăžăăďź
https://doc.rust-lang.org/nomicon/leaking.html#leaking
https://doc.rust-lang.org/nightly/std/mem/fn.forget.html
RustăŽĺŽĺ ¨äżč¨źăŤăŻăăăšăăŠăŻăżă常ăŤĺŽčĄăăăă¨ăăäżč¨źăĺŤăžăăŚăăŞăăăă
forget
ăŻunsafe
ă¨ăăŚăăźăŻăăăŚăăžăăă
ăă ăă httpsďź//github.com/rust-lang-nursery/nomicon/issues/135ăĺç §ăăŚ
MaybeUninit<T> -> NonNull<T>
ăĄă˝ăăăMaybeUninit
ăŤčż˝ĺ ă§ăăžăăďź AFAICT MaybeUninit::as_mut_ptr() -> *mut T
ăŤăăŁăŚčżăăăăă¤ăłăżănullăŤăŞăăă¨ăŻăăăžăăă ăăăŤăăă NonNull<T>
ă使ç¨ăăAPIă¨ăŽă¤ăłăżăźăă§ăźăšăĺż
čŚăŤăŞăăă¨ăć¸ăăăă¨ăă§ăăžăă
let mut x = MaybeUninit<T>::uninit();
foo(unsafe { NonNull::new_unchecked(x.as_mut_ptr() });
ăŤďź
let mut x = MaybeUninit<T>::uninit();
foo(x.ptr());
MaybeUninit :: as_mut_ptrďźďź-> * mutTăŤăăŁăŚčżăăăăă¤ăłăżănullăŤăŞăăă¨ăŻăăăžăăă
ăăăŻćŁăăă§ăă
ä¸čŹçăŤďźăăăŚ@Gankroăăăăč¨ăăŽăčŚăă¨ćăăžăăďźă NonNull
ăéć˘çść
ăă§ăăŞăăăžăćŠč˝ăăžăăăĺŽéăŤăă¤ăłăżăźă使ç¨ăăă¨ăăŻăă§ăăă ăćŠăçăŽăă¤ăłăżăźăŤĺ°éăăăă¨čăăŚăăžăă ăăăŻăŻăăăŤčŞăżăăăă§ăă
ăă ăă NonNull
ăčżăăĄă˝ăăăčż˝ĺ ăăăă¨ăŻĺéĄăŞăăăă§ăă ăăăăăăăŻä˝ă¨ĺźă°ăăăšăă§ăăďź ĺŞĺ
é ä˝ăŻăăăžăăďź
https://github.com/rust-lang/rust/issues/47336ăŽĺäžăăă
https://github.com/rust-lang/rust/pull/60445#issuecomment -488818677ăŤč¨čźăăăŚăăăŻăŹăźăżăźăŽĺŽčĄăŻçşçăăžăăăďź
@centrilăč¨ĺăăŚăă3ăćăŽĺŠç¨ĺŻč˝ćéă¨ăăčăăŻăăăźăżçăĺŽĺŽçăĺ¤éăŽăăšăŚă§čŚĺăŞăăŤăŞăăăäşşăŤăŻĺŽçžăăžăăă 1.36.0ăŻ1éąé䝼ĺ ăŤăŞăŞăźăšăăănightlyăŻăă§ăŤčŚĺăçşăăŚăăžăă
éć¨ĺĽ¨ăŻ1.40.0ăŤĺťśćăăăĺŻč˝ć§ăăăăžăăďź
éć¨ĺĽ¨ăŽčŚĺăŻăăăăăć
ĺ˝ăăăŻăŹăźăăŤĺ¸¸ăŤĺé˘ăăăŚăăăăă§ăŻăăăžăăă ăă¨ăă°ăăŻăŹăźăăĺ
é¨ă§std::mem::uninitialized
ă使ç¨ăăăăŻăăĺ
Źéăăĺ ´ĺă§ăăăľăźăăăźăăŁăŽăŻăŹăźăăŤăă使ç¨ăŻéć¨ĺĽ¨ăŽčŚĺăĺźăłĺşăăžăă äťćĽăăăă¸ă§ăŻăăŽ1ă¤ănightlyăłăłăă¤ăŠă§ăłăłăă¤ăŤăăă¨ăăŤăăăŤć°ăĽăăžăăă ăłăźăăŤuninitialized
č¨čż°ăimplement_vertex
ăăŻăăĺźăłĺşăăăăăăéć¨ĺĽ¨ăŽčŚĺă襨示ăăăžăăă
gliumăăšăżăźă§cargo +nightly test
ăĺŽčĄăăă¨ă1400čĄăčś
ăăĺşĺăĺžăăăžăăăăăŻăăťă¨ăăŠăuninitialized
é˘ć°ăŽéć¨ĺĽ¨čŚĺă§ć§ćăăăŚăăžăďźčŚĺă200ĺăŤăŚăłăăăžăăă rg "uninitialized" | wc -l
ĺşĺăŻ561ă§ăďźă
ćŽăăŽăĄă˝ăăăŽĺŽĺŽĺăăăăăŻăăćŽăăŽć¸ĺżľăŻä˝ă§ăăďź *foo.as_mut_ptr()
ăäťăăŚăăšăŚăĺŽčĄăăăŽăŻé常ăŤé˘ĺă§ăăăĺ ´ĺăŤăăŁăŚăŻďź write
ďźĺż
čŚäťĽä¸ăŽunsafe
ăăăăŻăĺż
čŚăŤăŞăăžăă
ă¨ăăĽăŹăźăăăăă¨@SimonSapin write
ăăŞăăĺ
¨ä˝ç˝Žăćăăăă¨ăă§ăă MaybeUninit
ăŞăăĺŽĺ
¨ă§ăŞă使ç¨ăăŚ*val = MaybeUninit::new(new_val)
ă¨ăăval: &mut MaybeUninit<T>
ă¨new_val: T
ăăŞăă使ç¨ă§ăăăăĺ¤ăĺ¤ăĺż
čŚăŞĺ ´ĺăŻstd::mem::replace
ă
@ est31ăăăăŻčŻăçšă§ăă 1ă2ĺăŽăŞăŞăźăšă§éć¨ĺĽ¨ăĺžćźăăăŚă大ä¸ĺ¤Ťă§ăă
ç°č°ăŻăăăžăăďź
1.36.0ăŞăŞăźăšăŽăăă°ć稿ă§ăă§ăŤčż°ăšăŚăăžăă
ĺ¤ĺUninită¨ăăŚ
Rust 1.38䝼éăăăĺŽĺ ¨ăŞäťŁćżć掾ă§ăăăé˘ć°mem :: uninitializedăŻéć¨ĺĽ¨ăŤăŞăăžăă
ăăŽăăăăăăŻčŻăăĄăăťăźă¸ăé俥ăăă桡䚹ăćăăăăăăăăăŞăăăăăăăăăă¨ăŻéżăăăšăă ă¨ćăăžăă ăăăŤăĺťć˘ćĽăŻăăă°ć稿ă§č¨ĺăăăŚăăăă¨ăčăăă¨ăĺşăçĽăăăŚăăăŻăă§ăă
uninitialized
éć¨ĺĽ¨ăŤćťăăŽăŻé
ăăăăăăžăăă ăăăă交ćăăă°ăăăŽéStableăăŁăăŤă§čĄăăăĺžăNightlyă§ăŽăżéć¨ĺĽ¨ăŽčŚĺăçşčĄăăăăŞăˇăźăćąşĺŽă§ăăă§ăăăăă
ăă¨ăă°ăFirefoxăŻăăŞăŞăźăšăă2éąéĺžăŤć°ăăRustăăźă¸ă§ăłăăžăăă
1.36.0ăŞăŞăźăšăŽăăă°ć稿ă§ăă§ăŤčż°ăšăŚăăžăă
ç§ăŻăăăă°ć稿ă§ăŽćĽäťăŽč¨ĺăăăŽăăăŞéĺŁăŽç¨ĺşŚă§ăăăă¨ăŤĺćăăžăăă ăŞăă¸ăăŞăŤăăă硨éăé俥ă§ăăžăă
ăăŽăăăăăăŻčŻăăĄăăťăźă¸ăé俥ăăă桡䚹ăćăăăăăăăăăŞăăăăăăăăăă¨ăŻéżăăăšăă ă¨ćăăžăă
ăăăŞăăăăăăăăŻćŞăăă¨ă§ăăăăăźăżă¨ăăŁăźăăăăŻăŤĺşăĽăăŚčă
ç§ăŻĺŽéăŽćąşĺŽăŤă¤ăăŚăŻăăžăć°ăŤăăžăăăăććĄăŤăăŁăŚäşşă ă桡䚹ăăăă¨ăŻăŞăă¨ćăăžăă ăăă°ć稿ăžăăŻéć¨ĺĽ¨ăŽčŚĺăčŚăäşşăŻăć°ăăăăŽăŤç§ťĺă§ăăžăă ăă ć°ăŤăăŞăäşşăŻă揥ăŽăăă¤ăăŽăŞăŞăźăšăć°ăŤăăžăăă
ăăăŞăăăăăăăăŻćŞăăă¨ă§ăăăăăźăżă¨ăăŁăźăăăăŻăŤĺşăĽăăŚčăăĺ¤ăăăă¨ăŻăăă§ăŻăăăžăăă
ĺŽĺ
¨ăŤĺćăăă ăéć¨ĺĽ¨ăŽăšăąă¸ăĽăźăŤăĺ°ăĺłăăăăăŽă§ăăŞăŞăźăšăžă§ăŤĺ
ăŤćťăăžăăăă¨ăăćŞăăĄăăťăźă¸ăé俥ăăăŚăăăŽăŻăăăăžăăă ĺŽéăŤăŻăăžăŁăăéă§ăă
ĺŽéăIIRCăŻăĺŽĺŽĺPRăŽçé¸ćăŤăĺäžăŻ2ă§ăŻăŞăĺ°ćĽ3ă¤ăŽăŞăŞăźăšăéć¨ĺĽ¨ăŤăăăă¨ă§ăăă¨čż°ăšăžăăăăä˝ăăăŽççąă§2ă使ç¨ăăžăăă3ă¤ăŽăŞăŞăźăšăŻăstable-gets-released-with-the -éć¨ĺĽ¨-çşčĄ¨ă¨éć¨ĺĽ¨-ćŻćŠăăăăŻćŻćŠčż˝čˇĄăăäşşă
ăŤă¨ăŁăŚĺ
ŹćŁăŞćéăŽăăă§ăă 6éąéăŻ1ĺš´ă§ăăăďź ;ďź
ăăŽăăăéć¨ĺĽ¨ăăźă¸ă§ăłă1.39.0ăŤĺ¤ć´ăăPRăććĽćĺşăăäşĺŽă§ăă äşşă ăăăăéčŚă§ăăă¨ćăăŞăă°ăç§ăŻăăŽăăă°ć稿ăć´ć°ăăăăăŤPRăćĺşăăăă¨ăă§ăăžăă
ăăŽăăăéć¨ĺĽ¨ăăźă¸ă§ăłă1.39.0ăŤĺ¤ć´ăăPRăććĽćĺşăăäşĺŽă§ăă äşşă ăăăăéčŚă§ăăă¨ćăăŞăă°ăç§ăŻăăŽăăă°ć稿ăć´ć°ăăăăăŤPRăćĺşăăăă¨ăă§ăăžăă
1.39ăŤĺćăăžăăăé ăă¨ăĺćăăžăă ăăă°ć稿ăŤĺ ăăŚăăŞăŞăźăšăăźăăć´ć°ăăĺż čŚăăăăžăă
éć¨ĺĽ¨ăšăąă¸ăĽăźăŤăŽĺ¤ć´ăŤă¤ăăŚPRăćĺşďź https ďź
@SimonSapin
ćŽăăŽăĄă˝ăăăŽĺŽĺŽĺăăăăăŻăăćŽăăŽć¸ĺżľăŻä˝ă§ăăďź * foo.as_mut_ptrďźďźăäťăăŚăăšăŚăĺŽčĄăăăă¨ăŻé常ăŤé˘ĺă§ăăăĺ ´ĺăŤăăŁăŚăŻďźć¸ăčžźăżăŽĺ ´ĺďźĺż čŚäťĽä¸ăŤĺŽĺ ¨ă§ăŞăăăăăŻăĺŤăžăăžăă
as_ref
/ as_mut
ĺ ´ĺăĺç
§ăĺćĺăăăăăźăżăćăĺż
čŚăăăăăŠăăăăăăăžă§ăćŁç´ăŤĺž
ăĄăăăŁăăŽă§ăă ăă䝼ĺ¤ăŽĺ ´ĺăăăăăŽăĄă˝ăăăŽăăăĽăĄăłăăŻé常ăŤäşĺçăŞăăŽă§ăă
read
/ write
ĺ ´ĺăĺĺă¨ç˝˛ĺăćĺłăăŞăăăŽă§ăăăă¨ăŤĺ
¨ĺĄăĺćăăă°ăĺéĄăŞăĺŽĺŽăăăăă¨ăă§ăăžăă ăăăŻManuallyDrop::take/read
ă¨čŞżć´ăăĺż
čŚăăăă¨ćăăžăăăăăăăManuallyDrop::write
ăăăăŻăă§ăăďź
ćŁç´ăŞă¨ăăăĺç §ăĺćĺăăăăăźăżăćăăŚăăĺż čŚăăăăăŠăăăăăăăžă§ĺž ăĄăăăŁăăŽă§ăă
ĺŽĺ ¨ă§ăŞăăłăźăăŹă¤ăăŠă¤ăłWGă¨č¨čŞăăźă ăăăŽĺéĄăŤă¤ăăŚćąşĺŽăä¸ăăŤăŻä˝ăĺż čŚă§ăăďź ć°éąéăć°ăśćăăžăăŻć°ĺš´ă§çşçăăĺŻč˝ć§ăéŤăă¨ćăăžăăďź
ăăăžă§ăŽéă as_mut
ăä¸ĺŽĺŽă§ăăŁăŚăăăŚăźăśăźăä˝ăăčĄăĺż
čŚăăăă¨ăăŤ&mut *manually_drop.as_mut_ptr()
ć¸ăăŽăć˘ăăăă¨ăŻă§ăăžăăă
ĺŽĺ ¨ă§ăŞăăłăźăăŹă¤ăăŠă¤ăłWGă¨č¨čŞăăźă ăăăŽĺéĄăŤă¤ăăŚćąşĺŽăä¸ăăŤăŻä˝ăĺż čŚă§ăăďź ć°éąéăć°ăśćăăžăăŻć°ĺš´ă§çşçăăĺŻč˝ć§ăéŤăă¨ćăăžăăďź
ć°ăśćăĺ¤ĺć°ĺš´ă
ăăăžă§ăŽéăas_mutăä¸ĺŽĺŽă§ăăŁăŚăăăŚăźăśăźăä˝ăăĺŽčĄăăĺż čŚăăăă¨ăăŤďźmut * manually_drop.as_mut_ptrďźďźăč¨čż°ă§ăăŞăăŞăăăă§ăŻăăăžăăă
ăŻăăçĽăŁăŚăăžăă ĺ¸ćăŻă &mut
é¨ĺăĺŻč˝ăŞéăé
ăăăçăŽăă¤ăłăżăźăćä˝ăăăăăŤäşşă
ăčŞĺ°ăăăă¨ă§ăă ăăĄăăă httpsďź//github.com/rust-lang/rfcs/pull/2582ăăŞăă¨ăéŁăăăă¨ăăăăăăžăă
MaybeUninităŽăăăĽăĄăłăăŻăĺ°ăŞăă¨ăăăăč¨čŞăŽăťăăłăăŁăŻăšăŽăăăžăăă§ăăăăŚăźăśăźăŻăăăOKă§ăŻăŞăă¨ć§ăăăŤćłĺŽăăĺż čŚăăăăă¨ăč°čŤăăăŽăŤćéŠăŞĺ ´ćăŽăăă§ăă
確ăăŤăăăăŻäťăŽé¸ćč˘ă§ăăăă
ć§ăăăŞäťŽĺŽă§ăăĺ¤ăĺŽĺ
¨ăŤĺćĺăăăĺžă as_mut
ăŻćĺšă§ăă
é
ĺăäżĺŽçăŤăă1ă¤ăŽćšćłăŻă MaybeUninit<[MaybeUninit<Foo>; N]>
ă§ăă ĺ¤ĺ´ăŽăŠăăăźă使ç¨ăăă¨ă1ĺăŽuninit()
ĺźăłĺşăă§é
ĺăä˝ćă§ăăžăă ďź [expr; N]
ăŞăăŠăŤăŤăŻCopy
ăĺż
čŚă ă¨ćăăžăăďźďźĺ
é¨ăŠăăăźăŻăé
ĺăăăŠăăźăšăăăăăŤslice::IterMut
ăŽäžżĺŠăă使ç¨ăăă¨ăăć§ăăăŞäťŽĺŽă§ăăĺŽĺ
¨ăŤăŞăăžăă揥ăŤă Foo
ĺ¤ă1ă¤ăă¤ĺćĺăăžăă
@SimonSapinăŻă uninitialized_array!
ăăŻăăă
@RalfJungĺ¤ĺuninit_array!
ăăăčŻăĺĺă§ăăăă
@Stargateur羜寞ăŤăăăăŻçžĺ¨ăŽĺĺă§ç˘şĺŽăŤĺŽĺŽăăăă¨ăŻăăăžăăă https://github.com/rust-lang/rust/issues/49147ăăăăŤçşçăăĺ ´ĺďźTMďźăĺŽĺŽăăăă¨ăŻăŞăă§ăăăă
@RalfJungăăźăăăăăŻç§ăŽăăă§ăăç§ăŻĺ¤§ăăŞççąăŞăăŤPRăăăăăŻăăŚăăžăăďź https ďź
@eddybăăăŻlibcoreă§ćŠč˝ăăžăă ăăăăăŠăăăăăăăliballocă§ăăŽćŠč˝ă使ăăă¨ăăă¨ăăăŠă°ăč¨ĺŽăăŚăăłăłăă¤ăŤăăăžăăă https://github.com/rust-lang/rust/commit/4c2c7e0cc9b2b589fe2bab44173acc2170b20c09ăĺç §ăăŚ
Building stage1 std artifacts (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
Compiling alloc v0.0.0 (/home/r/src/rust/rustc.2/src/liballoc)
error[E0277]: the trait bound `core::mem::MaybeUninit<K>: core::marker::Copy` is not satisfied
--> <::core::macros::uninit_array macros>:1:32
|
1 | ($ t : ty ; $ size : expr) => ([MaybeUninit :: < $ t > :: uninit () ; $ size])
| - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `core::marker::Copy` is not implemented for `core::mem::MaybeUninit<K>`
| _|
| |
2 | | ;
| |_- in this expansion of `uninit_array!`
|
::: src/liballoc/collections/btree/node.rs:109:19
|
109 | keys: uninit_array![_; CAPACITY],
| -------------------------- in this macro invocation
|
= help: consider adding a `where core::mem::MaybeUninit<K>: core::marker::Copy` bound
= note: the `Copy` trait is required because the repeated element will be copied
error[E0277]: the trait bound `core::mem::MaybeUninit<V>: core::marker::Copy` is not satisfied
--> <::core::macros::uninit_array macros>:1:32
|
1 | ($ t : ty ; $ size : expr) => ([MaybeUninit :: < $ t > :: uninit () ; $ size])
| - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `core::marker::Copy` is not implemented for `core::mem::MaybeUninit<V>`
| _|
| |
2 | | ;
| |_- in this expansion of `uninit_array!`
|
::: src/liballoc/collections/btree/node.rs:110:19
|
110 | vals: uninit_array![_; CAPACITY],
| -------------------------- in this macro invocation
|
= help: consider adding a `where core::mem::MaybeUninit<V>: core::marker::Copy` bound
= note: the `Copy` trait is required because the repeated element will be copied
error[E0277]: the trait bound `core::mem::MaybeUninit<collections::btree::node::BoxedNode<K, V>>: core::marker::Copy` is not satisfied
--> <::core::macros::uninit_array macros>:1:32
|
1 | ($ t : ty ; $ size : expr) => ([MaybeUninit :: < $ t > :: uninit () ; $ size])
| - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `core::marker::Copy` is not implemented for `core::mem::MaybeUninit<collections::btree::node::BoxedNode<K, V>>`
| _|
| |
2 | | ;
| |_- in this expansion of `uninit_array!`
|
::: src/liballoc/collections/btree/node.rs:162:20
|
162 | edges: uninit_array![_; 2*B],
| --------------------- in this macro invocation
|
= help: the following implementations were found:
<core::mem::MaybeUninit<T> as core::marker::Copy>
= note: the `Copy` trait is required because the repeated element will be copied
error: aborting due to 3 previous errors
čŹă解ăăžăăďźlibcoreă§ăŽçš°ăčżăĺźăŽä˝żç¨ăŻăĺŽéăŤăŻăłăăźă§ăăăżă¤ăăŤĺŻžăăăăŽă§ăăă
ăžăăliballocă§ćŠč˝ăăŞăççąăŻă MaybeUninit::uninit
ăćć źă§ăăŞăăăă§ăă
@RalfJungăăśăăĺŽĺ ¨ăŤä¸čŚăŞăăŻăăŽä˝żç¨ăĺé¤ăăPRăéăăžăăďź
@eddybhttpsďź//github.com/rust-lang/rust/pull/62799ăŽä¸é¨ăä˝ćăăžăăă
maybe_uninit_ref
as_ref / as_mutăŽĺ ´ĺăĺç §ăĺćĺăăăăăźăżăćăĺż čŚăăăăăŠăăăăăăăžă§ăćŁç´ăŤĺž ăĄăăăŁăăŽă§ăă ăă䝼ĺ¤ăŽĺ ´ĺăăăăăŽăĄă˝ăăăŽăăăĽăĄăłăăŻé常ăŤäşĺçăŞăăŽă§ăă
ăăŽăăăä¸ĺŽĺŽăŞget_ref
/ get_mut
ăŻééăăŞăăĺ§ăă§ăă ăă ăă MaybeUninit
ăĺćĺăăăŚăăă¨ăăŤă get_ref
/ get_mut
ă使ç¨ăăăĺ ´ĺăăăăžăăăăăŻăďźçžĺ¨çĽăăăŚăăĺćĺăăăďźăăźăżăĺŽĺ
¨ăŤĺŚçăăăăă§ăă memcpy
ďź assume_init
䝣ăăăŤă memcpy
ăăŞăŹăźăăĺŻč˝ć§ăăăăžăďźă
ăăŽăăă assume_init_by_ref
/ assume_init_by_mut
ăăăă°ăăă¨ćăăžăďź into_inner
ăŻassume_init
ă¨ĺźă°ăăŚăăăŽă§ă ref
ăŻăăŁă¨ăăăăă¨ćăăžăref mut
ă˛ăăżăźăăăăĺć ăăăăăŤçšĺĽăŞĺĺăĺĺžăăžăďźă
Drop
ç¸äşä˝ç¨ăŤé˘éŁăăŚăăăăŤăŻ2ă¤ăžăăŻ3ă¤ăŽăŞăăˇă§ăłăăăăžăă
get_ref
ăăăłget_mut
ă¨ăžăŁăăĺăAPIăăăăăă°ăŤăźăăăă¨ăĄă˘ăŞăŞăźăŻăçşçăăĺŻč˝ć§ăăăăžăă
get_ref
/ get_mut
ă¨ĺăAPIă§ăăă Copy
ăă¤ăłăăăăŚăăžăăăăăăăäżč¨źăăăăăŽăŻăăźă¸ăŁăźăšăżă¤ăŤAPIďź
impl<T> MaybeUninit<T> {
/// # Safety
///
/// - the contents must have been initialised
unsafe
fn assume_init_with_mut<R, F> (mut self: MaybeUninit<T>, f: F) -> R
where
F : FnOnce(&mut T) -> R,
{
if mem::needs_drop::<T>().not() {
return f(unsafe { self.get_mut() });
}
let mut this = ::scopeguard::guard(self, |mut this| {
ptr::drop_in_place(this.as_mut_ptr());
});
f(unsafe { MaybeUninit::<T>::get_mut(&mut *this) })
}
}
ďź scopeguard
ăŽăă¸ăăŻăŻç°ĄĺăŤĺĺŽčŁ
ă§ăăăăăăăăŤäžĺăăĺż
čŚăŻăăăžăăďź
ć示çăŞassume_init
čŚäťśăăăĺ ´ĺăăăăăŻget_ref
/ get_mut
ăăăéăĺŽĺŽăăĺŻč˝ć§ăăăăžăă
ăŞăăˇă§ăł.1
ăăŞă˘ăłăăé¸ćăăă get_ref
/ get_mut
ăassume_init
çśćłăŞăă§ä˝żç¨ĺŻč˝ăŤăŞăă¨ăăăŽAPIăŻăťăźĺłĺŻăŤĺŁăăžăă ďźććĄăăăAPIă使ç¨ăăă¨ăĺç
§ăăăŽčŞăżĺăăŻĺéĄăŞăăăă get_ref
ăăăłget_mut
ăŽĺ ´ĺăŻćąşăăŚĺŻč˝ă§ăŻăăăžăăďź
@danielhenrymantillaăget_{ref,mut}
ăŤă¤ăăŚć¸ăăăŽă¨ĺć§ăŤă read
ăŻăăăăread_init
ăžăăŻread_assume_init
ç¨ĺşŚăŤĺĺăĺ¤ć´ăăĺż
čŚăăăă¨ćăĺ§ăăŚăăžăăăăăŻăĺćĺăĺŽäşăăĺžăŤăŽăżĺŽčĄă§ăăžăă
@RalfJungăăăŤă¤ăăŚčłŞĺăăăăžăďź
fn foo<T>() -> T {
let newt = unsafe { MaybeUninit::<T>::zeroed().assume_init() };
newt
}
ăă¨ăă°ă foo<NonZeroU32>
ă¨ĺźăłăžăă ăăăŻă foo
é˘ć°ă厣č¨ăăă¨ăăŤUBăăăŞăŹăźăăžăăďźăăšăŚăŽT
ăŤĺŻžăăŚćĺšă§ăăĺż
čŚăăăăăăăžăăŻUBăăăŞăŹăźăăăżă¤ăă§ă¤ăłăšăżăłăšĺăăĺ ´ĺďźďźčłŞĺăăă
@PzixelăłăźăăŻăĺŽčĄćăŤăŽăżUBăĺźă辡ăăĺŻč˝ć§ăăăăžăă
ăăăăŁăŚă foo::<i32>()
ă§ĺéĄăăfoo::<NonZeroU32>()
ăŻUBă§ăă
ĺŻč˝ăŞăăšăŚăŽĺźăłĺşăćšćłă§ćĺšă§ăăă¨ăăçšć§ăŻăĺĽĺ ¨ć§ăă¨ĺźă°ăăžăăăŚăă ăăă RustăŽä¸čŹçăŞĺĽç´ă§ăŻăăŠă¤ăăŠăŞăŽĺŽĺ ¨ăŞAPIăľăźăă§ăšăŻĺĽĺ ¨ă§ăŞăăă°ăŞăăžăăă ăăăŤăăăăŠă¤ăăŠăŞăŽăŚăźăśăźăŻUBăŤă¤ăăŚĺżé ăăĺż čŚăăŞăăŞăăžăă RustăŽĺŽĺ ¨ć§ăŤé˘ăăăšăăźăŞăźĺ ¨ä˝ăŻăĺĽĺ ¨ăŞAPIăĺăăăŠă¤ăăŠăŞăŤĺşăĽăăŚăăžăă
@RalfJungăăăă¨ăă
ăăăăŁăŚăćŁăăĺĺžă§ăăă°ăăăŽé˘ć°ăŻćŁăăăăăžăăďźăăăăŁăŚăçĄĺšă§ăďźăă unsafe
ă¨ăăŚăăźăŻăăă¨ăăăŽćŹä˝ăŻćĺšă§ĺĽĺ
¨ăŤăŞăăžăă
@PzixelĺŽĺ ¨ă§ăŞăă¨ăăźăŻăăĺ ´ĺăĺĽĺ ¨ć§ăŻăăŻăéŠç¨ăăăćŚĺżľă§ăŻăăăžăăă ăăăŽéłă§ăăăăŻăĺŽĺ ¨ăŞăłăźăăŽčłŞĺă¨ăăŚăŽăżćĺłăăăăžăă
ăŻăăä¸é¨ăŽĺ
ĽĺăŻUBăăăŞăŹăźăăĺŻč˝ć§ăăăăăăé˘ć°unsafe
ăăăźăŻăăĺż
čŚăăăăžăă ăă ăăăăăăŚăăăăăăŽĺ
ĽĺăŻUBăăăŞăŹăźăăăăăé˘ć°ăăăŽăăăŤĺźăłĺşăăŞăă§ăă ăăă ĺŽĺ
¨ă§ăŞăăłăźăă§ăăŁăŚăăUBăăăŞăŹăźăăăă¨ăŻćąşăăŚĺ¤§ä¸ĺ¤Ťă§ăŻăăăžăăă
ăŻăăăăĄăăăç§ăŻăăăç解ăăŚăăžăă é¨ĺçăŞćŠč˝ăŻunsafe
ă¨ăăŚăăźăŻăăĺż
čŚăăăă¨çľčŤäťăăăăŁăă ăă§ăă ç§ăŤăŻçăŤăăŞăŁăŚăăžăăăăăŞăăçăăĺăŤç§ăŻăăăŤă¤ăăŚčăăŚăăžăăă§ăăă
ăăŽčż˝čˇĄăŽĺéĄăŤé˘ăăč°čŤăŻé常ăŤéˇăăŽă§ăăžă ä¸ĺŽĺŽăŞMaybeUninit
ĺćŠč˝ăŤă¤ăăŚăäťăŽăăă¤ăăŽčż˝čˇĄăŽĺéĄăŤĺ解ă§ăăžăăďź
maybe_uninit_extra
maybe_uninit_ref
maybe_uninit_slice
ĺççăŞăăă§ăă https://github.com/rust-lang/rust/issues/63291ăăă
MaybeUninit<T>
ăăä¸čŹçăŤčż˝čˇĄăăăĄăżĺéĄăćŻćăăŚăăăéăăďźďź63566
ćăĺčăŤăŞăăłăĄăłă
mem::zeroed()
ăŻăCé˘ć°ăĺźăłĺşăĺăŤmemset(&x, 0, sizeof(x))
ĺ¤ăăźăăŤăăăă¨ăćĺž ăăăçšĺŽăŽFFIăŽĺ ´ĺăŤĺ˝šçŤăĄăžăă ăăăŻăéć¨ĺĽ¨ăŤăăŞăăăăŽĺĺăŞççąă ă¨ćăăžăă