Rust: RFC 1892 рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛, "рдПрдХ рдирдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХрддрд░рдлрд╛ рдЕрдирд╛рд░рдХреНрд╖рд┐рдд"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдЕрдЧре░ 2018  ┬╖  382рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

NEW TRACKING ISSUE = https://github.com/rust-lang/rust/issues/63566

рдпрд╣ рдЖрд░рдПрдлрд╕реА "рдХрд╛ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рд╣реИ uninitialized рдПрдХ рдирдпрд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ MaybeUninit рдкреНрд░рдХрд╛рд░" (рдЬрдВрдЧ-рд▓реИрдВрдЧ / RFCs # 1892)ред

рдХрджрдо:

  • [x] RFC (cc @ rust-lang / libs) рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
  • [x] рдкреНрд░рд▓реЗрдЦрди рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ (https://github.com/rust-lang/rust/pull/60445 рдореЗрдВ)
  • [x] рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ (https://github.com/rust-lang/rust/pull/60445 рдореЗрдВ)

рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди:

  • рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ &mut T рд▓реМрдЯрд╛рдП?
  • рдХреНрдпрд╛ рд╣рдореЗрдВ MaybeUninit рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ рд╣рдореЗрдВ into_inner рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ MaybeUninit<T> Copy T: Copy ?
  • рдХреНрдпрд╛ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдЖрд░рдВрдн рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ get_ref рдФрд░ get_mut (рд▓реЗрдХрд┐рди рд▓реМрдЯреЗ рд╣реБрдП рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рдирд╛) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП? (AKA: "рдХреНрдпрд╛ рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рдбреЗрдЯрд╛ рдЗрдВрд╕реНрдЯрд╛-рдпреВрдмреА рдпрд╛ рдХреЗрд╡рд▓ рдпреВрдмреА рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?") рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕реЗ into_inner рд╕рдорд╛рди рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ рд╣рдо into_inner (рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ) рдЖрддрдВрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм T рдирд┐рд░реНрдЬрди рд╣реЛ, рдЬреИрд╕реЗ mem::uninitialized рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИ? (рдХрд┐рдпрд╛ рд╣реБрдЖ)
  • рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо mem::zeroed рдЪрд┐рддреНрд░рдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
B-RFC-approved C-tracking-issue E-mentor T-lang T-libs

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

mem::zeroed() рдХреБрдЫ рдПрдлрдПрдлрдЖрдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ C рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ memset(&x, 0, sizeof(x)) рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдо рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рд╣реИред

рд╕рднреА 382 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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/intrunic.rs#L184 -L198

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ fn_ty.ret.layout.abi Abi::Uninhabited рдФрд░ рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЬрд╛рд▓ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: https://github.com/rust-lang/rust/blob/8928de74394f320d110b110676731b12631a2167945/src/librustc_codegen_llvmmir operand.rs # L400 -L403

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЯреНрд░реИрдк (рдпрд╛рдиреА intrinsics::abort ) рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрддрдВрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдЕрдирд┐рдЪреНрдЫреБрдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖-рдорд╛рдорд▓рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: https://github.com/rust-lang/rust/blob/8928de74394f320d1109da6731b12638a216445/src/librustc_codegen_llvm/mir/rs.rs#L445 L447

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдШрдмрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: https://github.com/rust-lang/rust/blob/8928de74394f320d1109da6731b12638a2167945/src/librustc-codegen_llvm/mir/block.rs#L360 -L407
(рдЖрдк 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 рдФрд░ рдЖрдкрдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрдирдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯрд╛-рдпреВрдмреА рд╣реЛрдирд╛ рд╣реИред рд╣рдо "рдкреНрд░рдХрд╛рд░ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдареАрдХ рд╣реИрдВ" (рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрдгрд╛рдВрдХ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ) рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдЪрд╛рд╣рддреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдмрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ undef рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред рдЗрд╕реАрд▓рд┐рдП RFC рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ into_inner рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рднреА рдХрд╣рддрд╛ рд╣реИ рдХрд┐ get_mut , рд▓реЗрдХрд┐рди RFC рдЪрд░реНрдЪрд╛ рдиреЗ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд▓рд╛рдпрд╛ред рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди into_inner ред

рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ uninitialized рдЗрди рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреА, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ RFC рдХреЗ рдЗрд░рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╛рдкрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддреЗрдВ, рдЕрдЧрд░ рд╣рд░ рдХреЛрдИ рддреБрд░рдВрдд into_inner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ RFC рдмреЗрдХрд╛рд░ рд╣реИред

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реНрдпрд╛рдкрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддреЗрдВ, рдЕрдЧрд░ рд╣рд░ рдХреЛрдИ рддреБрд░рдВрдд into_inner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ RFC рдмреЗрдХрд╛рд░ рд╣реИред

рдпрд╣ рдореБрдЭреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ ... рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реГрдХреНрд╖ (рд╕рдореВрд╣: "рд╢реБрджреНрдзрддрд╛") рдЪрд╛рд╣рд┐рдП? cc @ рдУрд▓реА-рдУрдмреНрдХ

рдЕрдм рдореИрдВ (рдХрдИ) рдбрд┐рдкреНрд░реЗрд╢рди рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЙрди рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд░рд╛рдд рдХреЛ рдЬрд╣рд╛рдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрдо рд╕реЗ рдХрдо рд╕реНрдерд┐рд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛред рдЗрд╕реА рддрд░рд╣ рдХреА рдЪрд░реНрдЪрд╛ https://github.com/rust-lang/rust/pull/52994#issuecomment -42813133 рдкрд░

@RalfJung

рд╣рдо "рдкреНрд░рдХрд╛рд░ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдареАрдХ рд╣реИрдВ" рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ)

рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛: рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╣реИ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреБрдХрд┐рдпрд╛ рдореЗрдВ рдХрдИ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ( FromBytes ) рдФрд░ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛред рдЗрдиреНрд╣реЗрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (cc @gnzlbg @joshlf) рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкреВрд░реНрд╡ RFC рднреА рдерд╛ред

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдкрд╣рд▓реВ рд╣реИ рдЬрд┐рд╕рдореЗрдВ mem::zeroed() mem::uninitialized() рд╕реЗ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИред

@cramertj

рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛: рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреБрдХрд┐рдпрд╛ рдореЗрдВ рдХрдИ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ (FromBytes) рдФрд░ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдПред рдЗрдиреНрд╣реЗрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (cc @gnzlbg @joshlf) рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкреВрд░реНрд╡ RFC рднреА рдерд╛ред

рдЙрди рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ memcpy рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдХреА рдирдХрд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдУрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИ - рдпрджрд┐ рдЖрдк рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдореЗрдореЛрд░реА рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдореЗрдореЛрд░реА рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдпрд╣ рднреА рдереА рдХрд┐ рдкрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдореЗрдВ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдореЗрдореЛрд░реА рдХреЛ рдЕрдВрджрд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗред

IIRC, рд╡рд╣рд╛рдВ рдХрд┐рд╕реА рдиреЗ рднреА рдРрд╕рд╛ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рдФрд░ рди рд╣реА рдЪрд░реНрдЪрд╛ рдХреА, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЕрдирдзрд┐рдХреГрдд рдореЗрдореЛрд░реА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдЙрди рдЪрд░реНрдЪрд╛рдУрдВ рдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВред

рдкреЙрдЗрдВрдЯ рд╣реЛрдо рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд▓рдПрд▓рд╡реАрдПрдо рдЕрд╕рдорд╛рди рдбреЗрдЯрд╛ рдХреЛ рдкреЙрдЗрдЬрд╝рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ "рдХреБрдЫ рдордирдорд╛рдиреЗ рд▓реЗрдХрд┐рди рд╡реИрдз рдмрд┐рдЯ рдкреИрдЯрд░реНрди" рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдПрдХ рдЬрд╝рд╣рд░ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдпрд╛ рдПрдХ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм рдбреАрдПрдлрд╝рд░реЗрдб рд╣реИ рдпреВрдмреАред рдЗрд╕рд▓рд┐рдП, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, "рдкреНрд░рдХрд╛рд░ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдареАрдХ рд╣реИрдВ" рдЕрднреА рднреА рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпреВрдмреА рд╣реЛрдЧрд╛ред

рд╕рд╣реА рд╣реИ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛ред рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ "рдкреНрд░рдХрд╛рд░ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдареАрдХ рд╣реИрдВ" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ @RalfJung рдиреЗ рдКрдкрд░ рдХрд╣рд╛,

рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛ рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИред

рднрдЧрд╡рд╛рди рдХрд╛ рд╢реБрдХреНрд░ рд╣реИ рдЬреЛ рд▓реЛрдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ ...

рдареАрдХ рд╣реИ, рддреЛ рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдареАрдХ рд╣реИрдВ - рд╕рднреА i* рдФрд░ u* рдкреНрд░рдХрд╛рд░, рдХрдЪреНрдЪреЗ рд╕рдВрдХреЗрдд, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ f* рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдлрд┐рд░ tuples / рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдПрдХ рдЦреБрд▓рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ , рдпрд╛рдиреА рдЬрд╣рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИред рдореЗрд░рд╛ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рдЙрддреНрддрд░ "рдХрднреА рдирд╣реАрдВ" рд╣реИред

рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдпрд╣ рднреА рдереА рдХрд┐ рдкрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдореЗрдВ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдореЗрдореЛрд░реА рдХреЛ рдЕрдВрджрд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗред

MaybeUninit<u8> рд░реВрдк рдореЗрдВ рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдпрд╣ рднреА рдереА рдХрд┐ рдкрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░рд╛рдзрд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдореЗрдВ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдореЗрдореЛрд░реА рдХреЛ рдЕрдВрджрд░ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗред

рд╢рд╛рдпрдж рдЧрджреНрджреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝рдирд╛рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ Compatible<T> , рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде fn safe_transmute(self) -> T рд╣реИ рдХрд┐ "reinterprets" / "memcpys" рдХреЗ рдЯреБрдХрдбрд╝реЗ self рдореЗрдВ рдПрдХ T ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ self рдХрд╛ рдареАрдХ рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореА T ред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордгреАрдп рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реНрд╡рддрдГ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ impl Compatible<V> for U , рдФрд░ impl Compatible<W> for V рддреЛ рдПрдХ impl Compatible<W> for U (рдпрд╛ рддреЛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ, рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдЯреЛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╛рде рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП unsafe рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрджрд┐ рдЖрдк рдЗрд╕реЗ T рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ рдЬрд╣рд╛рдБ Self рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдЖрдк T рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ MaybeUninit<u8> , рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХреЗрдВ?

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдХреА рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдПрдХ рдХрдВрдмрд▓ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: unsafe impl<T> Compatible<[MaybeUninit<u8>; size_of::<T>()]> for T { ... } рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ [MaybeUninit<u8>; N] рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдЗрдореНрдкреНрд▓рд╛рдиреНрдЯ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ MaybeUninit рдПрдХ рдпреВрдирд┐рдпрди рд╣реИ, рдФрд░ рдЬреЛ рдХреЛрдИ рднреА [MaybeUninit<u8>; N] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд░реЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рддрддреНрд╡ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВ ред

@gnzlbg рд╡рд╛рдкрд╕ рддреЛ рдЖрдк FromBits<T> for [u8] рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп [MaybeUninit<u8>] рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ RustConf рдореЗрдВ @nikomatsakis рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ RFC рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ред рдореИрдВ рдЗрд╕реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛?

@ рдЬреЛрд╢рдлреЗрд▓ рдЖрдк рдХрд┐рд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@RalfJung

@gnzlbg рддрдм рдЖрдк FromBits рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ[u8] рдХреЗ рд▓рд┐рдПред рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ [рд╢рд╛рдпрдж рдпреВрдиреАрдирд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ] рдмрдЬрд╛рдпред

рдЧреЛрддреНрд░, рдпрд╣рд╛рдБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реИрдВред рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рднреА рдЙрд╕ also рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ

@ рдЬреЛрд╢рдлреЗрд▓ рдЖрдк рдХрд┐рд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдПрдХ FromBits / IntoBits рдкреНрд░рд╕реНрддрд╛рд╡ред TLDR: T: FromBits<U> рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдмрд┐рдЯ рдкреИрдЯрд░реНрди, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдорд╛рдиреНрдп рд╣реИ U рдПрдХ рд╡реИрдз рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ T ред U: IntoBits<T> рдорддрд▓рдм рд╡рд╣реА рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЛ рджрд┐рдП рдЧрдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рдордЬреЗрджрд╛рд░ рдЕрдЪреНрдЫрд╛рдИ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ unsafe рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ RFC рдХрд╛ рдПрдХ рдкреНрд░рд╛рд░реВрдк

@ рдЬреЛрд╢рдлрд╛рдЗрд▓ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЕрдзрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛

  • рдХреНрдпрд╛ рдпрд╣ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ? рдореИрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рддрджрдиреБрд╕рд╛рд░ MaybeUninit::get_mut рдбреЙрдХреНрд╕ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреВрдмреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд░рдмреАрдмреА рд╣реИ рдЬреЛ рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ
  • рдХреНрдпрд╛ u8 (рдФрд░ рдЕрдиреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ, рд░реЙ рдкреЙрдЗрдВрдЯрд░) рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдпрд╛рдиреА MaybeUinit<u8>::uninitialized().into_inner() рдЗрдВрд╕реНрдЯрд╛-рдпреВрдмреА рд╣реИ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдЖрдВрдд рднрд╛рд╡рдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо poison / undef рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рд╣реИрдВ (рдФрд░ рдореИрдВ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореАрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ)ред

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ?

@RalfJung рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ "рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдиреАрдЪреЗ рдЖрдиреЗ" рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдХреНрдпрд╛ рдПрдХ u8 (рдФрд░ рдЕрдиреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░, рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ, рд░реЙ рдкреЙрдЗрдВрдЯрд░) рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:: uninitialized () .k_inner () рдЗрдВрд╕реНрдЯрд╛-рдпреВрдмреА?

рдпрджрд┐ рдпрд╣ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореИрдВ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рдХ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдпреВрдмреА рдХреЛ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдореВрд▓реНрдп рдкрд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рд╣рдордиреЗ mem::uninitialized рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдореИрдВ рдореВрд▓реНрдп рдкрд░ рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рд╣реА рд╢рд╛рдЦрд╛ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рдСрдкреНрдЯ-рд╕реНрддрд░, рдЖрджрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдордиреЗ mem::zeroed рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ (рдФрд░ MaybeUninit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддрд░рд╣ рд╣реИ

рдХреНрдпрд╛ рдПрдХ u8 (рдФрд░ рдЕрдиреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ, рд░реЙ рдкреЙрдЗрдВрдЯрд░) рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдпрд╛рдиреА MaybeUinit<u8>::uninitialized().into_inner() рдЗрдВрд╕реНрдЯрд╛-рдпреВрдмреА рд╣реИ? рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдЖрдВрдд рдХреА рднрд╛рд╡рдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдо poison / undef рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ рд╣реИрдВ (рдФрд░ рдореИрдВ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореАрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ)ред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдЗрд╕рдХреЗ рдпреВрдмреА рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рджреЛ рд▓рд╛рдн рдпрд╣ рд╣реИрдВ рдХрд┐ рдП) рдпрд╣ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмреА) рдпрд╣ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдЙрдкрдпреЛрдЧ рд╕рдордп рдкрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рднреА рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред

рдпрджрд┐ рдпрд╣ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореИрдВ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рдХ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдпреВрдмреА рдХреЛ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдореВрд▓реНрдп рдкрд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рд╣рдордиреЗ mem::uninitialized рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдореВрд▓реНрдп рдкрд░ рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рд╣реА рд╢рд╛рдЦрд╛ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рдСрдкреНрдЯ-рд╕реНрддрд░, рдЖрджрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдордиреЗ mem::zeroed рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ (рдФрд░ MaybeUninit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддрд░рд╣ рд╣реИ

рдЖрдк рдЙрд╕ рдЪреАрдЬрд╝ рдкрд░ рдорд┐рд▓рд╛рди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдЕрдирдзрд┐рдХреГрдд рд╣реИ? рдпреВрдПрдирдмреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдЦрд╛ рдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЧрд╣ рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдмрд╛рдВрдзрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдХреЛрдИ рд╕рдореНрдореЛрд╣рдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред

рдЖрдк рдЙрд╕ рдЪреАрдЬрд╝ рдкрд░ рдорд┐рд▓рд╛рди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдЕрдирдзрд┐рдХреГрдд рд╣реИ?

рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдЕрдЧрд░ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ MaybeUinit<u8>::uninitialized().into_inner() рдФрд░ рд╕рд┐рд░реНрдл mem::uninitialized() рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

@RalfJung рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ "рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдиреАрдЪреЗ рдЖрдиреЗ" рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:

let mut b = MaybeUninit::<bool>::uninitialized();
let bref = b.get_mut(); // insta-UB?

рдпрджрд┐ рд╣рдо рдпрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХрд┐рд╕реА рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА "рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдиреАрдЪреЗ рдЖрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ"), рдпрд╣ рдХреЛрдб рдпреВрдмреА рд╣реИред

рдпрджрд┐ рдпрд╣ рддрддреНрдХрд╛рд▓ рдпреВрдмреА рдирд╣реАрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореИрдВ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рдХ рд╣реИ?

рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ u8 рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред match рдХрдИ рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдирд╛рдо рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг; рдкреВрд░реНрд╡ рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдпреВрдмреА рдХреЛ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдореВрд▓реНрдп рдкрд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЗрдо рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :: рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓рд┐рдЬреНрдбред

рдпрд╣ рдХреНрдпреЛрдВ? 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдЗрд╕рдХреЗ рдпреВрдмреА рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рджреЛ рд▓рд╛рдн рдпрд╣ рд╣реИрдВ рдХрд┐ рдП) рдпрд╣ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмреА) рдпрд╣ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдЙрдкрдпреЛрдЧ рд╕рдордп рдкрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЖрдкрдХреЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рднреА рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рдХреМрди рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛?
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ LLVM рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрдирдХреИрдкреНрдб рдХреЛрдб рдкрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИред рд╣рдо рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ MIR рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рддрдХ рд╣рдорд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╣рдореЗрд╢рд╛ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЙрдкрдпреЛрдЧ рдЬреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдкреБрд░рд╛рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо u* рдФрд░ i* рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдпрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХрд┐рд╕реА рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА "рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдиреАрдЪреЗ рдЖрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ"), рдпрд╣ рдХреЛрдб рдпреВрдмреА рд╣реИред

рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред

рдореЗрдо рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ :: рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓рд┐рдЬреНрдб рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдереА рдЬреЛ рдЙрдирдХреЗ рд╡реИрдз рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред

mem::uninitialized рднреА рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рдКрдкрд░ рдмрддрд╛рдИ рд╣реИ: рдЬреЛ рдХрд┐ рдПрдХ рдЕрд╕рдВрдХреНрд░рдорд┐рдд рдореВрд▓реНрдп рдХрд╛ рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╣реБрдП рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ (рдпрд╛ рдирд╣реАрдВ) рд╣реЛ рд╕рдХрддреА рд╣реИред рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреВрдмреА рд╣реИ?

let mut b = MaybeUninit::<u8>::uninitialized().into_inner();
let bref = &mut b; // Insta UB ?

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ MaybeUninit рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдпреВрдирд┐рдпрди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб (рдЬреИрд╕реЗ рдпреВрдирд┐рдЯ), рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореНрдпреВрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧ u8 рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдлрд╝реАрд▓реНрдб рдФрд░ рдЗрд╕реЗ UB рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдмрд┐рдирд╛ ptr::write рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдореВрд▓реНрдп рджреЗ рд░рд╣рд╛ рд╣реИред

рддреЛ рдЗрд╕ рдХрд╛рд░рдг рдореИрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реВрдВред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ into_inner рдХрд┐рд╕реА рднреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ:

let mut b: u8 = uninitialized();
let bref = &mut b; // Insta UB ? 

рджреЛрдиреЛрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдордп рдмрдо рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣реЗ рд╣реЛ рдореБрдЭреЗред

рдпрд╣ рдХреМрди рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛?
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ LLVM рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрдирдХреИрдкреНрдб рдХреЛрдб рдкрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИред рд╣рдо рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ MIR рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрджрд┐ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдореГрддрд┐ рдХрд╛ рдХреБрдЫ рдореВрд▓реНрдп рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рд░реБрд╕реНрдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрд╕ рдкрд░ рд╢рд╛рдЦрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ LLVM рдХреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдЧрд╛ред

рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рддрдХ рд╣рдорд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╣рдореЗрд╢рд╛ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВред

рд╕рд╣реА рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЙрдкрдпреЛрдЧ рдЬреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдкреБрд░рд╛рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо u* рдФрд░ i* рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╛рдЗрдЯ рдХреА рд╕реНрд▓рд╛рдЗрд╕реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЕрд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦрддреА рд╣реИрдВ?

рдПрдХ рдЬрдЧрд╣ рд╣реИ рдХрд┐ рдПрдХ uninitialized-but-not-poison &mut [u8] рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Read::read - рд╣рдо рдмрдлрд░ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЕрдЬреАрдм Read рдирд┐рд╣рд┐рддрд╛рд░реНрде рдЗрд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЬрдЧрд╣ рд╣реИ рдХрд┐ рдПрдХ uninitialized-but-not-poison &mut [u8] рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Read::read - рд╣рдо рдмрдлрд░ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЕрдЬреАрдм Read рдирд┐рд╣рд┐рддрд╛рд░реНрде рдЗрд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ MaybeUninit рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ рдЬреЛ рдХрд┐ рдЖрд░рдВрднрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕рдВрд╡реИрдзрд╛рдирд┐рдХ рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ, рдкреИрдбрд┐рдВрдЧ рдлрд╝реАрд▓реНрдб) рдЕрднреА рднреА рдПрд▓рдПрд▓рд╡реАрдПрдо рдЬрд╣рд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реЛрдВрдЧреЗ?

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдЖрдИрдлрд┐рдирд┐рдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдХреБрдЫ рдПрдкреАрдЖрдИ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреЛ "рдлреНрд░реАрдЬ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд-рд▓реЗрдХрд┐рди-рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдореГрддрд┐ рдХрд╛ рдХреБрдЫ рдореВрд▓реНрдп рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рд░реБрд╕реНрдд рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрд╕ рдкрд░ рд╢рд╛рдЦрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ LLVM рдХреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдЧрд╛ред

рд╡рд╣ рдХрднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдерд╛ред рдпрд╣ poison рдкрд░ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП UB рд░рд╣реЗрдЧрд╛ред

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп u8 " poison " рдХрд╛ UB рд╣реИред

рдХреНрдпрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╛рдЗрдЯ рдХреА рд╕реНрд▓рд╛рдЗрд╕реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдЕрд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦрддреА рд╣реИрдВ?

рд╕реНрд▓рд╛рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП &mut [u8] рдЕрдирд╡рд┐рдЬреНрдЮрд╛рдиреАрдХреГрдд рдбреЗрдЯрд╛ рддрдм рддрдХ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдорд╛рдзрд╛рди рд▓реЗрддреЗ рд╣реИрдВ)ред

@sfackler

рдПрдХ рдЬрдЧрд╣ рд╣реИ рдХрд┐ рдПрдХ uninitialized-but-not-poison рдФрд░ mut [u8] рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП :: рдкрдврд╝реЗрдВ - рд╣рдо рдмрдлрд░ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЕрдЬреАрдм рдкрдврд╝реЗрдВ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдЗрд╕реЗ рд╕реЗ рдмрд╛рд╣рд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдмрд▓реНрдХрд┐ рдЗрд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдпред

рдареАрдХ рд╣реИ, &out рдмрд┐рдирд╛ рдЖрдк рдХреЗрд╡рд▓ рдРрд╕рд╛ рд╣реА рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдпрджрд┐ рдЖрдк рдирд┐рд╣рд┐рдд рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╕рд╡рд╛рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдирд╣реАрдВ рд╣реИ рдХрд┐ poison рдореЗрдВ u8 (рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛, рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рдареАрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ!), рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдзреНрдпрд╛рди рд╕реЗ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕ рддрд░рдлред (рдЙрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦреЗрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдЬ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдФрд░ рд╡реИрдзрддрд╛ рдХреЗ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ ...)

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рджреЗрд░ рд╣реЛ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдерд╛ set() рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП &mut T ред рдЗрд╕ рддрд░рд╣, MaybeUninit (рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ред

fn init(dest: &mut MaybeUninit<u8>) -> &mut u8 {
    dest.set(produce_value())
}

рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ init() рдпрд╛ рддреЛ рдореВрд▓реНрдп рдпрд╛ рдбрд╛рдпрд╡рд░реНрдЬ рдХреЛ рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛ред (рдпрджрд┐ рдЗрд╕рдиреЗ рдХреБрдЫ рдФрд░ рд╡рд╛рдкрд╕реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рдЬреАрд╡рдирдХрд╛рд▓ рдЧрд▓рдд рд╣реЛрдЧрд╛ рдФрд░ &'static mut u8 рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рдЕрд╕рдВрднрд╡ рд╣реИред) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ placer 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 s рд▓реМрдЯреЗ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрдХ рдмрд╛рд░ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг Foo рд╡реИрдз рд╣реИ - рдЗрд╕рд▓рд┐рдП рдпрд╣ did_init() рдХреЛ Uninitialized<'a, Foo> рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл рдЗрд╕реЗ рдбрд╛рд▓рддреА рд╣реИ рдЗрд╕реА DidInit рдкреНрд░рдХрд╛рд░, рдЬреЛ init_foo рдлрд┐рд░ рд▓реМрдЯрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореИрдХреНрд░реЛ рднреА рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдФрд░ рдЖрддрдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ

(рдиреЛрдЯ: DidInit<'a, T> рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреНрдп рдирд╛рдо рд╣реИ &'a mut _DidInitMarker<'a, T> , рдХреЗ рд╕рд╛рде рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП DerefMut ред)

рд╡реИрд╕реЗ, рдЬрдмрдХрд┐ рдКрдкрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд┐рдирд╛рд╢рдХреЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг DidInit<тАШa, T> T рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдЙрдкрдирд╛рдо рдирд╣реАрдВ; рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╣рд╛рде рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ T рдХрд┐ рд▓рд╛рдЗрд╡ рд░реВрдк рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ DidInit рд╣реА рд╣реИ, рдирд╣реАрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП тАЩa (рдЕрдиреНрдпрдерд╛ рдЬрдм рд╕реЗ рддреБрдо рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рдж рдпрд╣ рдкрд╣реБрдВрдЪ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд╕рдХрддрд╛ рд╣реИ)ред

+1 рдиреЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ set рдореЗрдВ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдерд╛, рдЙрд╕реЗ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдирд╛рдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред

рдЙрд╕ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? set_and_as_mut ? ^ ^

set_and_borrow_mut ?

insert / insert_mut ? Entry рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди or_insert рд╡рд┐рдзрд┐ рд╣реИ (рд▓реЗрдХрд┐рди OccupiedEntry рднреА insert рдЬреЛ рдкреБрд░рд╛рдирд╛ рдореВрд▓реНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ)ред

рдХреНрдпрд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рд╣реИ? рдпрд╣ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ #[inline] рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЧрдд рдХреА рдЙрдореНрдореАрдж рди рдХрд░реВрдВред

рдХреНрдпрд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рд╣реИ? рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ 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 рди-рдУрдк рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓реНрдп рдХрд╛ рд▓рд╛рдн рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдпреВрдмреА рд╣реИ? рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛?

@Pixix рдпрд╣ рд╕рднреА рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди рджреНрд╡рд╛рд░рд╛ MaybeUninit рд▓рд┐рдП рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ some_native_function рдПрдХ рдПрдирдУрдкреА рд╣реИ, рддреЛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ; рдЖрдк рддреЛ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ foo_ref.value (рдпрд╛ рдмрд▓реНрдХрд┐ рдРрд╕рд╛ foo_ref.as_mut() рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдпреВрдмреА рд╣реИ рдХрд┐ рдЗрд╕рдХреА рд╡рдЬрд╣ рд╕рдорд╛рд░реЛрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдм рдХреБрдЫ рдЖрд░рдВрдн рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

MaybeUninit рдЕрдорд╛рдиреНрдп рдорд╛рди рд░рдЦрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ - рдпрджрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдлрд╝реБрдЯрдЧреБрди рдХреЗ рдХрдо рдЕрдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХрд┐ рдореВрд▓реНрдп рдЕрдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдПрдХ IRC рдмрд╛рддрдЪреАрдд рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреИрджрд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @sfackler рдХреЗ рд╕рд╛рде рд╣реЛред

рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ mem::zeroed рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП MaybeUninit<NonZeroU8> mem::zeroed рдПрдХ рдорд╛рдиреНрдп рдЗрди-рдореЗрдореЛрд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИред рдореЗрд░реА рд╕реЛрдЪ рдореЗрдВ, "рдпреВрдирд┐рдирд┐рдЯ" рд░рд╛рдЬреНрдп рдореЗрдВ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдкреИрдбрд┐рдВрдЧ рд╣реИ, рдЬрд┐рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд┐рд╕реА рднреА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ "рдореВрд▓реНрдп" рд░рд╛рдЬреНрдп рдореЗрдВ, mem::zeroed рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдорд╛рдиреНрдп рд╣реИрдВ ( NonZero )ред

рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдПрдирдо рдбрд┐рд╕реНрдХреНрд░рд┐рдорд┐рдиреЗрдиреНрдЯ рдкреИрдХрд┐рдВрдЧ (рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕) рдХреЗ рд╕рд╛рде рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдгрд╛рд▓реА "рдЕрдирдЗрдирд┐рдЯ" рд╕реНрдерд┐рддрд┐ / "рдореЗрдореЛрд░реА" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╢реВрдиреНрдп рдореЗрдореЛрд░реА рдХреА рдкреИрдбрд┐рдВрдЧ рдореЗрдВ рдПрдХ рднреЗрджрднрд╛рд╡ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреА рд╣реИред рдЙрд╕ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ, Option<MaybeUninit<NonZeroU8>> рдХрд╛ рдЖрдХрд╛рд░ 1 рд╣реИ, рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ 2. рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ, Some(MaybeUninit::uninitialized()) None рд╕реЗ рдЕрдкреНрд░рднреЗрджреНрдп рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ MaybeUninit (рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдирд╣реАрдВ) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ NonZeroU8 рдФрд░ &'static i32 рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдпреЗ рджреЛрдиреЛрдВ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд╣рд╛рдБ "0" рдорд╛рдиреНрдп рдирд╣реАрдВ MaybeUninit<T>::zeroed().into_inner() insta-UB рд╣реИред

рдХреНрдпрд╛ Option<Union> рд▓реЗрдЖрдЙрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдиреБрдХреВрд▓рди рдПрдХ рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рд╡реИрдзрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рддрдХ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭреМрддрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ () рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдХреЛрдИ рднреА рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ MaybeUninit ред рддреЛ Option<MaybeUninit<NonZeroU8>> рдХрд╛ рдЖрдХрд╛рд░ рдХрднреА рднреА 1 рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭреМрддрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ () рд╣реИ, рдХреЛрдИ рднреА рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рд╡реИрдз рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ "рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ (рдкреНрд░рдХрд╛рд░)"? рдХреНрдпрд╛ рдЗрд╕ рдлреАрдЪрд░ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ Rust ABI рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? union рдпреБрдХреНрдд struct UnitType; рдпрд╛ struct NewType(()); рдХреНрдпрд╛? struct Padded (рдиреАрдЪреЗ) рдХреНрдпрд╛ рд╣реИ? рдПрдХ union struct Padded рдпреБрдХреНрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

#[repr(C, align(4))]
struct Padded {
    a: NonZeroU8,
    b: (),
    c: NonZeroU16
}

рдореЗрд░рд╛ рд╢рдмреНрджрд╛рдВрдХрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╕реНрддреБрддрдГ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдмреАрдЪ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рдорддрд┐ рд╣реИред :) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рд╕рднреА ZST рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ), рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ (рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдорд╛рддреНрд░ рд╣реИред

рд╡рд░реНрддрдорд╛рди рд╕рд╣рдорддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдЪрд┐рдд рдЪрд░реНрдЪрд╛ рд╣реЛрдЧреА рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ UCG рд░реЗрдкреЛ рдореЗрдВ рдЕрдЧрд▓реЗ рдбрд┐рд╕реНрдХрд╢рди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ рдЕрдзрд┐рдХ рдЪреАрдЬреЛрдВ рдкрд░ рд╕рд╣рдорддрд┐ рд╣реЛ, рдФрд░ рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХрд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдлреАрдЪрд░ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ Rust ABI рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рдо рдпрд╣рд╛рдВ рд╡реИрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рди рдХрд┐ рдбреЗрдЯрд╛ рд▓реЗрдЖрдЙрдЯ (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдмреАрдЖрдИ рдХреЛ рд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ)ред рддреЛ рдпрд╣ рдХреЛрдИ рднреА ABI рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдПрдмреАрдЖрдИ рдкрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ

рдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдПрдмреАрдЖрдИ рдкрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЪрд▓ рд░рд╣реА рд╣реИред

AFAICT рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреЗрд╡рд▓ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдореЗрдореЛрд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдлрдВрдХреНрд╢рди рд╕реАрдорд╛рдУрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдПрдмреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ UCG рд░реЗрдкреЛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп Rust рдХреЗ рд▓рд┐рдП ABI рдмрдирд╛рдирд╛ рд╣реИред

рдЦреИрд░, рдЙрджреНрджреЗрд╢реНрдп рд╕реА рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реЛрдк рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЪреАрдЬреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред "рд░рд╕реНрдЯ bool рдФрд░ C bool ABI- рд╕рдВрдЧрдд рд╣реИрдВ"ред

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, repr(Rust) , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдмреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд░рд┐рдгрд╛рдореА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓реЗрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЪреВрдХред

рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЙрддреНрд╕реБрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реЗрдЖрдЙрдЯ-рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ Option<Foo> рдЦрд┐рд▓рд╛рдл рдХреБрдЫ рддрд░реНрдХ рд╣реИ рдЬрд╣рд╛рдБ 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]; рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рддреАрдХ tobss рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ uint8_t a[100] = {}; рд▓рд┐рдЦрддрд╛ рд╣реВрдБ рддреЛ рдПрдХ рдкреНрд░рддреАрдХ .data рд╕реЗрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреЛ рдХрд┐ рдореБрдЦреНрдп рд╕реЗ рдкрд╣рд▓реЗ FLASH рд╕реЗ RAM рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред

рдпрд╣ 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 рдЪрд┐рдиреНрд╣ рд╣реЛрдВрдЧреЗ?

рдкреАрдПрд╕ рдореБрдЭреЗ рдкреНрд░рддреАрдХ рдореИрдиреНрдмрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

@ qwerty19106 рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ a рдФрд░ b .bss рдореЗрдВ рдЬрдЧрд╣ рд╣реЛрдЧреАред рдПрд▓рдПрд▓рд╡реАрдПрдо undef рдорд╛рдиреЛрдВ рдХреЛ рдорд╛рдирддрд╛ рд╣реИ, рдЬреИрд╕реЗ MaybeUninit::uninitialized() , рд╢реВрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдм рдПрдХ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ A::new() len рд╕реЗ 1 рддрдХ рддреЛ b .data рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗред рдпрджрд┐ static рдореЗрдВ рдХреЛрдИ рднреА рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд╣реИ рддреЛ рдЪрд░ .data ред рдкреИрдбрд┐рдВрдЧ рдХреЛ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрд▓рдПрд▓рд╡реАрдПрдо рдпрд╣реА рдХрд░рддрд╛ рд╣реИред рдЬрдВрдЧ рдХреЛрдИ ~ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ~ рд╡рд╛рджреЗ (*) рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдВрдХрд░ рдЦрдВрдб static рдЪрд░ рдореЗрдВ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

(*) рдЬрдм рддрдХ рдЖрдк #[link_section]

рдордЬрд╝реЗрджрд╛рд░ рддрдереНрдп: рдХреБрдЫ рдмрд┐рдВрджреБ рдорд╛рдирд╛ рдЬрд╛рддрд╛ LLVM рдкрд░ undef рдПрдХ рдЧреИрд░ рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рддреЛ рдЪрд░ a рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рдореЗрдВ .data ред # 41315 рджреЗрдЦреЗрдВред

рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП @japaric рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдорджрджрдЧрд╛рд░ рд░рд╣рд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рдирдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдПрдХ рдХреЙрд▓ рдореБрдЦреНрдп рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ mut рдЪрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдореЗрдВ .init_array рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИ:

#[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 рдХреЗ рд▓рд┐рдП рдПрдХ inрд┐рдд

рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг : рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдкреНрд░рд╢реНрди :
рдореИрдВ concat_idents рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ a_init_fn рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ A_INIT_VAR рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ # 1628 рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдЬрдЯрд┐рд▓ structs рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбреЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ .bss рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдлрд╝реНрд▓реИрд╢ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред

рдХреНрдпреЛрдВ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ .init_array рдЕрдиреБрднрд╛рдЧ? рдпрд╣ рдПрд▓рдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк ( рд▓рд┐рдВрдХ ) рдХрд╛ рдмрдбрд╝рд╛ рдЦрдВрдб рд╣реИред

@ qwerty19106 рдХреНрдпреЛрдВрдХрд┐ рдореБрдЦреНрдп () рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдЬреАрд╡рди рдПрдХ рдорд┐рд╕рдлрд┐рдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░реБрд╕реНрдд рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рд╣реЛ рдЧрдпрд╛ рдерд╛ред

рдареАрдХ рд╣реИ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдВрдЧ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИред

рд▓реЗрдХрд┐рди # [no_std] рдореЗрдВ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ (рд╢рд╛рдпрдж рдореИрдВ рдмреБрд░рд╛ рдЦреЛрдЬ рд░рд╣рд╛ рдерд╛)ред

рд╣рдо рд╕реНрдкрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдСрд░реНрдбрд░рд┐рдВрдЧ :: рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░

рдореИрдВ рдПрдореНрдмреЗрдбреЗрдб рдкрд░ рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдпрд╣ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИ (рд╣рд░ рд╕рдВрджрд░реНрдн рдореЗрдВ Ordering::SeqCst )ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рд╕рднреА "рдПрдХ рдмрд╛рд░" рд╕рд╛рд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдЖрд░рд╛рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрд░рдВрднреАрдХрд░рдг рдкрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВ? рдпрд╛ рдореИрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ?
cc @Amanieu @alexcrichton

@ qwerty19106 :

рдЬрдм рдЖрдк "рдПрдореНрдмреЗрдбреЗрдб" рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдирдВрдЧреЗ-рдзрд╛рддреБ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ .init_array рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ELF рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ part - рдпрд╣ рд╕рд┐рд╕реНрдЯрдо V ABI рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдХреЗрд╡рд▓ .init рд╣реИред рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо V ABI рдбреНрд░рд╛рдлреНрдЯ рдЕрдкрдбреЗрдЯ рдорд┐рд▓рдиреЗ рддрдХ .init_array рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреЛ Linux ABI рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред

рдирддреАрдЬрддрди, рдпрджрд┐ рдЖрдк рдирдВрдЧреЗ рдзрд╛рддреБ рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рддреЛ .init_array рднреА рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ рдФрд░ / рдпрд╛ libc рдореЗрдВ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЧреИрд░-рдирдВрдЧреЗ-рдзрд╛рддреБ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рдЖрдкрдХрд╛ рдмреВрдЯрд▓реЛрдбрд░ .init_array рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рд▓реЗрддрд╛, рддрдм рддрдХ рд╡рд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

1: рдкреГрд╖реНрда 28 рджреЗрдЦреЗрдВ, рдЖрдВрдХрдбрд╝рд╛ 1-13 "рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрднрд╛рдЧ"
реи: рдкреГрд╖реНрда ремрей рджреЗрдЦреЗрдВ, рек-резрей рдХрд╛ рдЖрдВрдХрдбрд╝рд╛ "рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб (рдЬрд╛рд░реА)"

@eddyb рдЖрдк рдПрдХ рдХреА рдЬрд░реВрд░рдд рд╣реИ Acquire рдмрд╣реБрдд рдХрдо рдЬрдм рдкрдврд╝рдиреЗ рдкрд░ рд▓реЛрдб Once ред рдпрд╣ x86 рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд░ рдФрд░ ARM рдкрд░ рд▓реЛрдб + рдмрд╛рдбрд╝ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди load(SeqCst) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ load(Acquire) рдХреЗ рд╕рдорд╛рди рд╣реА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

(рдХреНрдпрд╛ рдЖрдк рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдорди рдмрдирд╛ рд▓реЗрдВрдЧреЗ? рдЙрдирдХреЗ рдкрд╛рд╕ рд╢рд╛рдпрдж рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдпреВрдиреЗрдЯрд┐рдирд┐рдЯ рдмрдирд╛рдо рдореЗрдо :: рдХрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред рджреЛрдиреЛрдВ рдПрдХ рд╣реА рд▓реЗрдЦрди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ - рдЕрдкрд░рд╛рдЬрд┐рдд рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдпрд╣рд╛рдБ рдирд╣реАрдВ рд╣реИред )

Am 13. рд╕рд┐рддрдВрдмрд░ 2018 00:59:20 MESZ schrieb Amanieu рд╕реВрдЪрдирд╛рдПрдВ @github.com:

@ рд╣реЗрдбреНрдбреА рдЖрдкрдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо Acquire рд▓реЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
Once ред рдпрд╣ x86 рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд░ рдФрд░ ARM рдкрд░ рд▓реЛрдб + рдмрд╛рдбрд╝ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди load(SeqCst) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣
рд╕рднреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ load(Acquire) рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рдПрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ 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> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИред рдХрдо рд╕рдВрдкреНрд░реЗрд╖рдг рд╡рд╛рд▓реЗ рдмрдХреНрд╕реЗ рдФрд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рд╣рдо рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреБрдЫ рдФрд░ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

рдЖрд░рдВрднрд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 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) }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ :: рдирдпрд╛ (рд╢рд╛рдпрдж рдпреВрдиреАрдЯрд╛рдЗрди :: рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб ()) рдЕрднреА рднреА size_of рдХреЙрдкреА рдХрд░реЗрдЧрд╛ ::() рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕

рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡рд╣рд╛рдБ рдПрдХ codegen рдкрд░реАрдХреНрд╖рдг рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред

рдкреИрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдмрд┐рдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ (рдХреБрдЫ рднреА рдЬреЛ рдмрд┐рдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рджрд░реНрд╢рд╛рдПрдЧрд╛ рдпреВрдмреА рд╡реИрд╕реЗ рднреА рд╣реИ)ред

рдареАрдХ рд╣реИ, рддреЛ рд╢рд╛рдпрдж Box::new_uninit рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ? рд╕реНрд▓рд╛рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдЕрд▓рдЧ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, Box::new рд▓рд┐рдП T: Sized рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВ MaybeUninit::zeroed рд▓рд┐рдП рд╡рдХрд╛рд▓рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдБрдЧрд╛ const fn ред рдХреБрдЫ рдПрдлрдПрдлрдЖрдИ-рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рд╣реИрдВ рдЬреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдЬрд┐рд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ zeroed рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рдордп рд╕реНрд╡реЗрдЪреНрдЫрд╛ рд╕реЗ рдЦреБрд╢ рдХрд░реВрдВрдЧрд╛ред

@mjbshaw рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП #[rustc_const_unstable(feature = "const_maybe_uninit_zeroed")] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ zeroed рдРрд╕реА рдЪреАрдЬрд╝реЗрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ min_const_fn рдЪреЗрдХ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреА (https://github.com/rust-lang/ рдЬрдВрдЧ / рдореБрджреНрджреЛрдВ / 53555) рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ MaybeUninit::zeroed 'рдХреА рдЧрддрд┐ рд╕реНрдерд┐рд░ рд╣реИ, рднрд▓реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рд░ рд╣реЛред

рдХреНрдпрд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ / рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдХреБрдЫ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╡реНрдпрд╛рдкрдХ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж IFUninit рдкреНрд░рдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ? рдХрджрдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

1) IFUninit рдЬреЛрдбрд╝реЗрдВ
2) рдореЗрдо рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ :: рдЕрд╕рд┐рдВрдЪрд┐рдд / рд╢реВрдиреНрдп рдФрд░ рдкрджрд╛рд╡рдирдд

@scottjmaddox

IFUninit рдЬреЛрдбрд╝реЗрдВ

https://doc.rust-lang.org/nightly/core/mem/union.MaybeUninit.html :)

рдЕрдЪреНрдЫрд╛! рддреЛ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпреЛрдЬрдирд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ ASUninit ASAP?

рдЕрдЧрд▓рд╛ рдХрджрдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/pull/54668 рдЗрддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ (рдХреБрдЫ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ) рд░рд┐рдЧреНрд░реЗрд╕ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рддреЛ рд╡рд╣ рдЦреБрд╢ рд╣реЛрдЧрд╛ред : рдбреА

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬрд╝реА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдЕрдирд▓рд┐рдорд┐рдЯреЗрдб рдбреЗрдЯрд╛ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдПрдкреАрдЖрдИ рдорд┐рд▓рд╛ рд╣реИ, рдЪрд▓реЛ рдЬрд▓реНрджреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкреЗрдВрдЪ рдХрд░реЗрдВред ;)

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рджреЗрд░реА рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рддрд╛рдХрд┐ рд╣рдо рдЕрдВрдд рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдлреБрдЯрдЧрди рдХреЛ рд╣рдЯрд╛ рд╕рдХреЗрдВред :)

рдУрд╣, рдФрд░ рдХреБрдЫ рдФрд░ рд╣реА рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдЖ ... https://github.com/rust-lang/rust/pull/54667 рдХреЗ рд╕рд╛рде, рдкреБрд░рд╛рдиреЗ рдПрдкреАрдЖрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдлреБрдЯрдЧрдиреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреА рд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо MaybeUninit рд▓рд┐рдП рднреА рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдирд┐рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ MaybeUninit::into_inner рдШрдмрд░рд╛рд╣рдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдмрдЧ рдмрд┐рд▓реНрдб рдореЗрдВ, рдореИрдВ *x рдШрдмрд░рд╛рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрдм x: &[mut] T T рдирд┐рд░реНрдЬрди рдХреЗ рд╕рд╛рдеред

рд╕реНрдерд┐рддрд┐ рдЕрджреНрдпрддрди: https://github.com/rust-lang/rust/pull/54668 рдХреЗ рд╕рд╛рде рдкреНрд░рдЧрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдХреЛ рдЯреНрд╡реАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред @ рд╣реЗрдбрдм рд╕рдВрд░рдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред :)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд░реИрдкрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИ, рдЗрд╕реЗ рдПрдХ рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛:

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 ?

рдпрд╣ рдПрдХ рдмреИрдХрдЕрдк рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХреЗ рдХрд┐ рдЖрдкрдиреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рджреЛрдиреЛрдВ рдЬреЛрд░ рджреЗрдХрд░ рдХрд╣рд╛ рдХрд┐ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ (рдкреВрд░реНрд╡рд╡рдд / in_inner / etcред) рдПрдХ рдирд╛рдо рдореЗрдВ рдмрд▓реНрдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреИрд╕реЗ рдмрд╕ assert_initialized рд╕рд╛рде рдкреВрд░реНрд╡ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЛ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИ? unchecked_assert_initialized рддрд░рд╣ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП assert!() рд╣реИред

рд╕рдВрднрд╡ рд╣реИ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд_рдЖрд╕рд╛рдиреА_рдЕрдиреБрд╢рд╛рд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдирдЯрд╛рдЗрдо рдЬрд╛рдБрдЪ рдЬреИрд╕реЗ рдореБрдЦрд░ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП! () рд╣реИред

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА intrinsics::assume(foo) рдмрдирд╛рдо assert!(foo) рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдФрд░ рдХрдердиреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж assume_initialized ?

assume рдЕрд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рд╣реИ, рдзрд╛рд░рдгрд╛ рдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдо рдЬреЛрд░ unreachable_unchecked unreachable рдФрд░ get_unchecked рдмрдирд╛рдо get ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ unchecked рд╕рд╣реА рдЕрд╡рдзрд┐ рд╣реИред

рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдХрд┐ foo_unchecked рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рд╡рд╣рд╛рдБ рдПрдХ рд╕рдорд╛рди foo , рдЕрдиреНрдпрдерд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд░рд╛рд╕рд░ рд╕реНрд╡рднрд╛рд╡ unsafe рд╣реЛрдирд╛ рдореБрдЭреЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ "рдЕрд▓рдЧ" рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдкрд░ред

рдпрд╣ рдмрд┐рдХреЗрд╢реЗрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд░рдВрдЧ рд╣реИ

рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ API рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓рд┐рдЬреНрдб рдбреЗрдЯрд╛ рдХрдЪрд░рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдпреВрдмреА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд▓рд╛рдкрд░рд╡рд╛рд╣реА рд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ", рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рдЗрдЪреНрдЫрд┐рдд рдпреВрдмреА" рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ рдЕрдирдзрд┐рдХреГрдд рдбреЗрдЯрд╛ рдкрд░, рдЕрд╡рдзрд┐ "ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрдХреАрдирди unchecked рдХреА рддрд░рд╣ рдорджрдж рдорд┐рд▓реЗрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рджреБрдЦреА рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ (= рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдбреЙрдХреНрд╕ рдкрдврд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ) рдмрд╣реВрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ)ред

@RalfJung

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ into_inner рдПрдХ рддрд░рд╣ рд╕реЗ рдмрд╣реБрдд рд╣реА рдирд┐рд░реНрджреЛрд╖ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд╣реИред рд▓реЛрдЧ, рд╢рд╛рдпрдж рдбреЙрдХреНрд╕ рдХреЛ рднреА рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗ рдмрд┐рдирд╛, рдЕрднреА рднреА MaybeUninit::uninitialized().into_inner() ред рдХреНрдпрд╛ рд╣рдо was_initialized_unchecked рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЖрд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

I _ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣; рдореБрдЭреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреЛрдиреЛрдВ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рдмрд╛рдд рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЦрддрд░рдирд╛рдХ рд╣реИред

@rkruppe

рджреЛрдиреЛрдВ рдЬреЛрд░ рджреЗрдХрд░ рдХрд╣рд╛ рдХрд┐ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ (рдкреВрд░реНрд╡рд╡рдд / in_inner / etcред) рдПрдХ рдирд╛рдо рдореЗрдВ рдмрд▓реНрдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреИрд╕реЗ рдмрд╕ assert_initialized рд╕рд╛рде рдкреВрд░реНрд╡ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЛ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдирд┐рд╣рд┐рдд рд╣реИ? unchecked_assert_initialized рдЬреИрд╕реЗ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП assert!() рд╣реИред

рдЦрддрд░рдирд╛рдХ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЧрдзреЗ рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдЧреБрдг рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рджреЛ рдмрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ рддреЛ рднреА was_initialized_into_inner_unchecked рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИред рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ (рдХрд╛рд░рдг рдХреЗ рднреАрддрд░) рдмрдирд╛рдирд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдмрдЧ рдирд╣реАрдВ;)

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдХреЗ рд╕рд╛рде IDE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рдирд╛рдо рдПрдХ рдорд╛рдореВрд▓реА рд░реЛрдбрдореИрдк рд╣реИред

рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдирд╛рдо рдкрд┐рдЫрд▓реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдХрд┐рдореНрдб рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдирд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА / рд▓рдЧрднрдЧ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд▓рд╛ рдФрд░ рдмрд╣реБрдд рд╣реА рд╕реВрдХреНрд╖реНрдо рд╣реИ), рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд▓рдВрдмреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж), рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ред рдПрдХ рдЪреИрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдореЗрдореЛрд░реА ... рдХрдо рдЕрдЪреНрдЫрд╛ рд╣реИ (рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдзрд╛ рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЖрдзрд╛)ред

@ рд╢реЗрд░реЗрдорд╛рд╕реНрдЯрд░ рд╢реНрдпреЛрд░; рдореИрдВ рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдЯреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╣реА рдХрд░рддрд╛ рд╣реВрдВ; рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ unchecked рд╕рд╛рде рдПрдХ рд▓рдВрдмрд╛ рдирд╛рдо unsafe рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдХрд┐ рдЦреБрдж рдХреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдард╣рд░рд╛рд╡ рджреЗрдЧрд╛ред

@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()) рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ unsafe fn drop_in_place(&mut self) MaybeUninit рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

ManuallyDrop::drop рд╕рд╛рде рдорд┐рд╕рд╛рд▓ рд╣реИред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ foo_unchecked рдХреЗрд╡рд▓ рддрднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╕рдВрдЧрдд рдлреВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд░рд╛рд╕рд░ рдкреНрд░рдХреГрддрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдореБрдЭреЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ "рдЕрд▓рдЧ" рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред

рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рд╕рд╛рдЗрди рд╣рдЯрд╛ рджреЗрдВ

рдПрдХ рдмрд╛рд▓рдХ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдЬрдм unsafe рдлрд╝рдВрдХреНрд╢рди _unchecked рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрдм рдЕрдВрдд рдореЗрдВ рдЕрдЯрдХ рдЧрдпрд╛? рдПрдХ рд╣реА рдмрд╛рдд рдХрд╣рдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╕рд╡рд╛рд▓ рд╣реИред :) рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ "рд▓рдЧрднрдЧ рдХрднреА рдирд╣реАрдВ" рд╣реИ, рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдЫрддрд╛рд╡рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ offset рд╕рдВрдХреЗрдд рдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ unchecked , рд▓реЗрдХрд┐рди IMO рд╡рд╣рд╛рдБ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдореИрдВ рд╡реИрд╕реЗ рднреА рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реВрдБ рдФрд░ рдЧрд▓рддреА рд╕реЗ рд▓рд┐рдЦ .offset рдХреЗ рдмрдЬрд╛рдп .wrapping_offset , рдореИрдВ рд╕рдВрдХрд▓рдХ рд╣реИ рдХрд┐ рдореИрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рджрд╛ рдХрд░ рджрд┐рдпрд╛ред

рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ

рдпрд╣ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдореЗрд░реА рдзреВрд░реНрддрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

@shepmaster рддреЛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ рдХрд┐ рдХреЛрдИ рдореМрдЬреВрджрд╛ unsafe рдмреНрд▓реЙрдХ (рд╢рд╛рдпрдж рдПрдХ рдмрдбрд╝рд╛, рд╢рд╛рдпрдж рдПрдХ рдмрдбрд╝реЗ unsafe fn рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде unsafe рдмреНрд▓реЙрдХ), рдФрд░ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЬреЛ рдХреЙрд▓ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ unsafe ?

рдХреЛрдИ рдореМрдЬреВрджрд╛ unsafe рдмреНрд▓реЙрдХ [...] рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рдЬреЛ рдХреЙрд▓ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ unsafe

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдкрд░ рдХреНрд╡рд╛рд▓рд┐рдлрд╝рд╛рдпрд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореМрдЬреВрджрд╛ unsafe рдХреНрд╡рд╛рд▓реАрдлрд╝рд╛рдпрд░ рд╣рдореЗрдВ рдЧрд╣рд░реА рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдореЗрдВ

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рдмреНрджреЛрдВ рдХреЛ рдирд╛рдореЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╢рд╛рдпрдж рдПрдХ рдмрдбрд╝рд╛ рдПрдХ, рд╢рд╛рдпрдж рдПрдХ рдмрдбрд╝реЗ unsafe fn рдЬрд┐рд╕рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде unsafe рдмреНрд▓реЙрдХ рд╣реИ

рдореБрдЭреЗ рдкреВрдЫрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рд░реБрд╕реНрдЯ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЫрд╛рдпрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рдХрдИ-рд╕реМ рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЫрд╛рдпрд╛рдВрдХрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЖрдорддреМрд░ рдкрд░ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм, рдЕрдЧрд░ рд░реБрд╕ рдХреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХреЛ "рдЬрд░реВрд░рдд" рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рднреА рдПрдХ рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рдореБрджреНрджреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред


рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИ + рдЖрд░рдПрд▓рдПрд╕ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд╕рдВрдкрд╛рджрдХ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА unsafe рдХреАрд╡рд░реНрдб рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рд╣реИред

рдЕрдм, рдЕрдЧрд░ рд░реБрд╕ рдХреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХреЛ "рдЬрд░реВрд░рдд" рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рднреА рдПрдХ рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рдореБрджреНрджреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╡реИрд╕реЗ рд╡рд╣рд╛рдБ https://github.com/rust-lang/rfcs/pull/2585;) рд╣реИ

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИ + рдЖрд░рдПрд▓рдПрд╕ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╣ рдорд╣рд╛рди рд╣реЛрдЧрд╛! рд╕рднреА рд▓реЛрдЧ рдХреЗрд╡рд▓ IDEs рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рдкрдврд╝рддреЗ рд╣реИрдВ - рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдореАрдХреНрд╖рд╛рдПрдБ рдЖрдорддреМрд░ рдкрд░ IDEs рдореЗрдВ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдЕрдм, рдЕрдЧрд░ рд░реБрд╕ рдХреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХреЛ "рдЬрд░реВрд░рдд" рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рднреА рдПрдХ рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рдореБрджреНрджреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рдмрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ - рдмреАрдЪ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ let -рдмрд╛рдВрдб рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рдЧреИрд░-рдЖрд░реНрдерд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ, рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рдлреА 'рддрд╛рдХрддреЛрдВ' рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 'рдкреНрд░реЗрд░рд┐рдд'ред

l рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 2585 ;) рд╣реИ

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЛрдЧ рд╣рдореЗрд╢рд╛ рдкреВрд░реЗ рд╢рд░реАрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ unsafe рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдлрд┐рд░ рдЖрдк рдареАрдХ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ: рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ "рдЪреБрдкрдХреЗ"ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдЖрдИрдбреАрдИ рдореЗрдВ рдХреЗрд╡рд▓ рдХреЛрдб рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИ

рд╣рд╛рдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рддрд░рдл рд░рдЦ рджрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ , рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рдХрд╛рд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

unsafe fn unsafe_real_name_of_function() { ... }
          ^~~~~~ for humans
^~~~~~           for the compiler

рдпрд╣ рдЖрдкрдХреЛ рдХреЛрдб рдкрдврд╝рддреЗ рд╕рдордп рд╣рд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдк-рд╡рд┐рд╖рдпреА рд╣реИред

рдпрд╣ рдЖрдкрдХреЛ рдХреЛрдб рдкрдврд╝рддреЗ рд╕рдордп рд╣рд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдк-рд╡рд┐рд╖рдпреА рд╣реИред

рдореИ рд╕рдордЭрддрд╛ рд╣реБрдБред рдЖрдк рдЗрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ 4-рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреЛ рдЖрдВрдЦреЛрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИред ;)

@shepmaster рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди IMO рдореВрд▓ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреНрдпрд╛ рд╣реИрдВ - рдпрд╛рдиреА unsafe рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ UB рдирд╣реАрдВ рд╣реИ , рд╕рд░рд▓ рдирд╛рдо рдХреЗ рд╕рд╛рдеред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ "рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд" рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ "рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд╕рд╛рд▓ рд╣реИред

рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ initialized_or_ub рдХреА рддрд░реНрдЬ рдкрд░ рдПрдХ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдореИрдВ рдЦреБрдж рдРрд╕рд╛ рдХрд╣рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЯреБрдХрдбрд╝рд╛ (рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХреЛрдИ рдореБрдЭрд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЭреВрда рдмреЛрд▓рдиреЗ рджреВрдВрдЧрд╛; рдЖрдк рдЬреЛ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдЪреБрдиреЗрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ initialized_or_ub рдХреА рддрд░реНрдЬ рдкрд░ рдПрдХ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдерд╛

рдЖрдк maybe_uninit(ialized) рддрд░рд╣ рдорддрд▓рдм рд╣реИ? рдХреБрдЫ рд╣реИ рдХрд┐ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? ЁЯШЗ

рдирд╣реАрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ unwrap_or_else - рдкрджреНрдзрддрд┐ рдХреЗ рдирд╛рдо рдореЗрдВ "рджреБрдЦреА рдорд╛рдорд▓реЗ" рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

@ рд╣реЗрдбреНрдбреА рдЕрд░реЗ рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ ... .initialized_or_unsound рд╢рд╛рдпрдж?

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдореЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЛ рдПрдХ рдПрдВрдЯреА-рдкреИрдЯрд░реНрди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ foo_i32 , bar_mutex , baz_iterator ) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рдлрд┐рд░ рднреА рдЬрдм рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рднрд▓реЗ рд╣реА unsafe fn рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ, _unchecked , _unsafe , _you_better_know_what_you_are_doing рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдмрд╣реБрдд рдЖрдо рд╣реЛред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдпрд╣ рдорд╛рдорд▓рд╛ рдХреНрдпреЛрдВ рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, FYI рдХрд░реЗрдВ, рдПрдХ рдореБрджреНрджрд╛ рд╣реИ (https://github.com/rust-analyzer/rust-analyzer/issues/190) rust-analyzer рдпрд╣ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдп unsafe рдпрд╛ рдирд╣реАрдВред рд╕рдВрдкрд╛рджрдХреЛрдВ рдФрд░ IDE рдХреЛ рдЙрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреЗ рд▓рд┐рдП unsafe unsafe рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП unsafe рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рди рдХреЗрд╡рд▓ unsafe рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд╛рд╣реЗ рд╡реЗ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрдп рд╣реЛрдВ, рдЬреИрд╕реЗ,) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _unchecked рдпрд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕, рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрдХреАрдирди, rust-analyzer рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (EDIT: intellij-Rust рддрд░рд╣ рдХрд╛: https://github.com/intellij-rust/intellij-rust/issues/3013#issuecomod-440442306), рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╢рдп рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдХрд┐ unsafe рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП unsafe рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдпрд╣ рдкреНрд░рддреНрдпрдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо "рд╕рд┐рдВрдЯреИрдХреНрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдореЗрдВ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рджрд┐рди рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

@gnzlbg

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдореЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЛ рдПрдХ рдПрдВрдЯреА-рдкреИрдЯрд░реНрди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ foo_i32 , bar_mutex , baz_iterator ) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдпреБ рд╡рд┐рдЪрд▓рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдмреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдЦрддрд░реЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдпрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВред

рдлрд┐рд░ рднреА рдЬрдм рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рднрд▓реЗ рд╣реА unsafe fn рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ, _unchecked , _unsafe , _you_better_know_what_you_are_doing рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдмрд╣реБрдд рдЖрдо рд╣реЛред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдпрд╣ рдорд╛рдорд▓рд╛ рдХреНрдпреЛрдВ рд╣реИ?

рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ: рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ред рдЬрдм рдЕрд╕рдорд╛рдирддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, рддреЛ рдЕрддрд┐рд░реЗрдХ рдЖрдкрдХреЗ рджреЛрд╕реНрдд рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рджреЛрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, FYI рдХрд░реЗрдВ, rust-analyzer рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ ( рдЬрдВрдЧ-рд╡рд┐рд╢реНрд▓реЗрд╖рдХ / рдЬрдВрдЧ-рд╡рд┐рд╢реНрд▓реЗрд╖рдХ # 190 ) рд╣реИ, рдпрд╣ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдп unsafe рдпрд╛ рдирд╣реАрдВред рд╕рдВрдкрд╛рджрдХреЛрдВ рдФрд░ IDE рдХреЛ рдЙрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреЗ рд▓рд┐рдП unsafe unsafe рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП unsafe рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рди рдХреЗрд╡рд▓ unsafe рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЪрд╛рд╣реЗ рд╡реЗ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрдп рд╣реЛрдВ, рдЬреИрд╕реЗ,) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, _unchecked рдпрд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕, рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрдХреАрдирди, rust-analyzer рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЗрд░рд╛рджрд╛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдХрд┐ unsafe рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП unsafe рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдкреНрд░рддреНрдпрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рдеред

рдпрд╣ рд╕рдм рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ @RalfJung рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ: "рд╣рд░ рдХреЛрдИ рдХреЗрд╡рд▓ IDEs рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдореАрдХреНрд╖рд╛рдПрдБ рдЖрдорддреМрд░ рдкрд░ IDEs рдореЗрдВ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред" рдпрд╣ рдореБрдЭреЗ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ GitHub рдЕрдкрдиреЗ UI рдореЗрдВ рдЬрдВрдЧ-рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдПрдХ рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди / рдСрдкрд░реЗрд╢рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ рдЯреНрд░реЗрдбрдСрдлрд╝ рдмрджрд╕реВрд░рдд рд╣реЛрдиреЗ рдФрд░ рдЧрд▓рдд (рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ) unsafe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реЛрдиреЗ рдХреЗ рдмреАрдЪ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдкреВрд░реНрд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ _рд╣рд╛рд╕_ рдХреЛ рдЦреБрдж рдХреЛ рдерд╛рдордиреЗ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, "рд░реБрдХреЛ, рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рд╕рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?"

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдореБрдВрдбрди рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рдЗрд╕реЗ insecure рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВ
  • рдЬрдм рднреА рдЖрдк рдЙрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддрдм allow(deprecated) рд▓рд┐рдЦреЗрдВ рдпрд╛ рдмрд╕ рд╕рдВрдХрд▓рд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рд░рд╣реЗрдВ
  • рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдЬреЛ let mut hash = InsecureSha1::default(); hash.insecure_write(bytes); ... рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рдпрд╣ рд╕рдм рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдВрднреАрд░ рд╕реБрдЭрд╛рд╡

рдЪреВрдБрдХрд┐ рд╣рдо 95% рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ 5% рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рдЖрдЗрдП MaybeUninitialized рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред рдЕрддрд┐рд░рд┐рдХреНрдд 7 рд╡рд░реНрдг рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред

рдЬреНрдпрд╛рджрд╛рддрд░ рдЧрдВрднреАрд░ рд╕реБрдЭрд╛рд╡

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдереМрдбрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ MaybeUninitializedOrUndefinedBehavior рдХрд╛ рдирд╛рдо рджреЗрдВред

  2. рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдзрд┐

    MaybeUninitializedOrUndefinedBehavior::into_inner(value)
    

рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╕реБрдЭрд╛рд╡

MaybeUninitializedOrUndefinedBehaviorReadTheDocsAllOfThemYesThisMeansYou

рдЦреИрд░ ... рд╕рдЪ рдореЗрдВ, MaybeUninitializedOrUndefinedBehavior рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рдирд╛рдо рд╣реЛрдиреЗ рд╕реЗ рдореБрдЭреЗ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдСрдкрд░реЗрд╢рди .into_inner() рд╣реИ рдЬрд┐рд╕реЗ рдЕрдЪреНрдЫреЗ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдмрд┐рдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдиреЗ рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред MaybeUninit::initialized_or_undefined(foo) рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред

IMO рдХреЛ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рд╕рд╣реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╛рдореЛрдВ рдФрд░ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд╣реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдХреЗ рд╕рд╛рде IDE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рдирд╛рдо рдПрдХ рдорд╛рдореВрд▓реА рд░реЛрдбрдореИрдк рд╣реИред

рдЬрдм рддрдХ рдЖрд░рдПрд▓рдПрд╕ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╣рдордд рд╣реИрдВ

  • рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо рдЕрдЪреНрдЫреЗ рд╣реИрдВ

  • рдХрдо рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╛рдо рдЦрд░рд╛рдм рд╣реИрдВ

рдФрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рддрдирд╛рд╡ рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ into_inner рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рдмреБрд░рд╛ рдирд╛рдо рд╣реИ (рдлреИрдВрд╕реА рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд╛рд░реЗрддреЛ рд╕реАрдорд╛ рдкрд░ рдирд╣реАрдВ рд╣реИ)ред рд╕рд╛рдорд╛рдиреНрдп рд╕рдореНрдореЗрд▓рди рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ into_inner рдЬрдм Foo<T> рдореЗрдВ рдареАрдХ рдПрдХ T , рдФрд░ рдЖрдк рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ MaybeUninit<T> рдХрд╛ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рд╢реВрдиреНрдп рдпрд╛ рдПрдХ T s рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рддреЛ рдПрдХ рдХрдо рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк, рдХрдо рд╕реЗ рдХрдо, рдЗрд╕реЗ unwrap , рдпрд╛ рд╢рд╛рдпрдж unwrap_unchecked рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ from_initialized рдпрд╛ from_initialized_unchecked рдзреНрд╡рдирд┐ рдареАрдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ "рд╕реЗ" рдЖрдорддреМрд░ рдкрд░ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред

рд╢рд╛рдпрдж unwrap_initialized_unchecked рдареАрдХ рд╣реЛрдЧрд╛?

рдЗрд╕реЗ take_initialized рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ &mut self рдмрдЬрд╛рдп self ред рдирд╛рдо рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЖрд░рдВрднрд┐рдХ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред MaybeUninit , unsafe рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐ рдпрд╣ Option / Result рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдСрдкрд░реЗрд╢рди рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИред

рдПрдХ &mut self рд╣реЛрдиреЗ рд╕реЗ рдпрд╣ рдПрдХ рдлреБрдЯрдЧрди рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд╢рдмреНрджрд╛рд░реНрде MaybeUninit рдмрд╛рд╣рд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред

рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдо: рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ into imply, рд╢рд╛рдпрдж into_initialized_unchecked рдирд╛рдо рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд░рд╣ рд╣реА рдЪрд▓рддреА рд╣реИ?

рдпрд╣ рд╣реЛрдиреЗ рдореЗрдВ рдПрдХ & mut рд╕реНрд╡рдпрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдлреБрдЯрдЧрди рдХреА рддрд░рд╣ рдпрд╣ рдЯреНрд░реИрдХ рдХреЛ рдЦреЛрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЪрд╛рд╣реЗ рдЖрдк рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓реЗ рдЧрдП рд╣реЛрдВред

рдпрд╣ рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдФрд░ рдЬрдм рддрдХ рдЖрдк рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ рдЕрдиреНрдпрдерд╛ рдпрд╣ рджреЛ рдмрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдареАрдХ рд╣реИред

рдФрд░ рдпрд╣ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдФрд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ take_initialized , рдпрд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг take_initialized_unchecked ред

рдЖрдЗрдП рд╢рд╛рдпрдж рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╛рдо рджреЗрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ

рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА?

рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реБрдЭрд╛рдпрд╛ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рднрдпрд╛рдирдХ sed рдХреМрд╢рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ;-)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ into_inner рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ unchecked рдХрд╛ рдЬреЛрдбрд╝ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫрд╛ рдФрд░ рдЕрдкреНрд░рднрд╛рд╡реА рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ: рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдореЗрдВ рдирд╣реАрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: take_initialized рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ

assume_initialized рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣:

  • 'рдкреНрд░рдорд╛рдг рджрд╛рдпрд┐рддреНрд╡' рдореЙрдбрд▓ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ
  • 'рдзрд╛рд░рдгрд╛рдПрдБ рдЬреЛрдЦрд┐рдо рднрд░реА рд╣реИрдВ' рд╕реЗ рдХрд╛рдлреА рд╣рдж рддрдХ рдЬреБрдбрд╝рддрд╛ рд╣реИ
  • рдХреЗрд╡рд▓ рджреЛ рд╢рдмреНрджреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИ
  • рдСрдкрд░реЗрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдЕрд░реНрде рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ
  • рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ
  • рдПрд▓рдПрд▓рд╡реАрдПрдо assume рдЖрдВрддрд░рд┐рдХ рдХреА рддрд░рд╣, рдЧрд▓рдд рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рдП рддреЛ UB рд╣реИ

рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА?

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред рдПрдлрдмреАрдЖрдИ рдХреА рдЯреАрдо рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ MaybeUninit<T> Copy рдЬрдм T: Copy ?

@tommit рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ MaybeUninit<T> ManuallyDrop<T> рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ Copy , рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реБрд╕реНрдЯ рдирдП-рдХреЙрдорд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп T рд╣рд░ рд╕рдордп, рдпрд╛рдж рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рддреЛ рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдЗрд╕рдХреА рдкреНрд░рддрд┐рдпрд╛рдБред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдЕрдзрд┐рдХ рдмреЗрд╣реВрджрд╛ рдореЗрдореЛрд░реА рд▓реАрдХ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@ luojia65 рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рддрд░реНрдХ рдХреА рд▓рд╛рдЗрди рддрдм рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ рдЬрдм T рд╕реНрд╡рдпрдВ Copy , рднрд▓реЗ рд╣реА ManuallyDrop рдФрд░ MaybeUninit рднреА рд╣реЛред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИред рдмрд╕ рдХрд┐рд╕реА рдиреЗ #[derive(Copy)] рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛;)

рдЗрд╕рдХрд╛ рдПрдХ рдЕрд╡рд▓реЛрдХрди рд╢рд╛рдпрдж рдХреБрдЫ рд╕реВрдХреНрд╖реНрдо рдкрд╣рд▓реВ рд╣реИ:
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА MaybeUninit<T> Copy MaybeUninit<T> рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм 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 рдЬрд╣рд╛рдБ рддрдХ рд▓реЗрдЖрдЙрдЯ рдЕрдиреБрдХреВрд▓рди рдкрд░рд╡рд╛рд╣ ... рдХрдо рд╕реЗ рдХрдоред

"рдмрд╛рд╕реА" / "рдЕрдорд╛рдиреНрдп", рд╢рд╛рдпрдж? рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рдВрдХрди рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП) рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдП
рдСрдмреНрдЬреЗрдХреНрдЯ рджреЛ рдмрд╛рд░ рдирд╣реАрдВ рдЧрд┐рд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдПрдХ "рд╕реБрд░рдХреНрд╖рд╛" рдореБрджреНрджрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдерд╛
"рд╕реБрд░рдХреНрд╖рд╛" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ UCG рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЬреЛрдбрд╝реЗрдВ рдХрд┐ рдЯреА "рд╡реИрдз" рдФрд░ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ "рд╡реИрдз" рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо
рдЗрди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрднреА рддрдХ рдХрд╣реАрдВ рднреА рдиреАрдЪреЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдореИрдВ
рд╣рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрди рд╕рднреА рдбреЙрдХреНрд╕ рдкрд░ рджреГрд╖реНрдЯрд╛рдВрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рд╣рдо рдЕрд╕рдВрд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдкрджрд╛рд╡рдирдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢рд╛рдпрджUninit рдХреЛ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд╣ рдЬрдЧрд╣ "рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд" рд╣реИред FWIW рдХреЛ рд╣рдореЗрдВ std::ptr::read рдореЗрдВ рдПрдХ рд╣реА рддрд░рд╣ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

@bluss рд╣рдо рдХрднреА рднреА рдПрдХ "рдмреЗрд╣рддрд░" рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдХреБрдЫ рднреА рдирд╣реАрдВ
рд╕рдорд╛рдзрд╛рди "/" рдкреНрд░рд╡рд╛рд╕рди рдкрде "рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред

рдкрджрд╛рд╡рдирддрд┐ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рдпрд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: "X рдкрджрд╛рд╡рдирдд рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Y рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ"ред рд╣рдо рдЕрдЧрд░
рдПрдХ Y рдФрд░ X рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рддреЛ рд╣рдореЗрдВ рдкрдХрдбрд╝ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЬрдм рддрдХ рд╣рдо рдПрдХ рд╡рд╛рдИред

рдЕрдиреНрдпрдерд╛, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рд╕рдВрджреЗрд╢ рднреЗрдЬ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред

@cramertj "рдЕрдорд╛рдиреНрдп" рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА (рдЪрд╛рд╣рд┐рдП!) рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╕реБрд░рдХреНрд╖рд╛" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ UCG рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдерд╛, рддреЛ рд╢рд╛рдпрдж рдЙрд╕реЗ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ T "рд╡реИрдз" рдФрд░ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ "рд╡реИрдз" рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЗ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЕрднреА рддрдХ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВ ...

рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдбреА

@RalfJung рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп" рд╕рдмрд╕реЗ (рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕рдордп?) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛" рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдмреЛрд▓рдЪрд╛рд▓ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ ( ManuallyDrop<T> рдЕрдм рдЙрддрдирд╛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ рдПрдХ T )ред рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдирд┐рд░реВрдкрдг рдЕрднрд┐рдкреНрд░рд╛рдпреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдХрдо рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп" рдЕрдзрд┐рдХрд╛рдВрд╢ (рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА?) рдЬрдВрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓реЗрдХреНрд╕рд┐рдХреЙрди рдореЗрдВ рд╣реИ

рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ, рд╢рдмреНрдж рдЖрдзрд┐рдХрд╛рд░рд┐рдХ (рдЕрднреА рддрдХ) рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрдВрддрддрдГ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╢рдмреНрдж рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЭрдбрд╝рдкреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдорд╛рдиреНрдп" рдбреЗрдЯрд╛ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдореЗрдВ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдХрд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ "рдорд╛рдиреНрдп" рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рд╢рдмреНрдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

@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 рджреЛ рдирдП рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

    /// 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
    }

рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╣ рдкреАрдЖрд░ рджреЗрдЦреЗрдВред

zeroed рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ MaybeUninit::zeroed().into_inner() рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдЪреАрдЬрд╝ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рддрд░реАрдХрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИред рдПрдХрд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдмрдЬрд╛рдп рд╕рднреА MaybeUninit рдпрд╛ рд╕рдордХрдХреНрд╖ рдпреВрдирд┐рдпрди рдХреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕рднреА рдЕрдиреИрддрд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ std::mem::zeroed рдХреЛ рд░рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдлрдПрдлрдЖрдИ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп рд╣реИред рдкрджрд╛рд╡рдирддрд┐ рд╕реЗ рдпрд╣ рдЬреЛрд░рджрд╛рд░ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдЧреА, рдЬреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдХрдо рд╕реЗ рдХрдо рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ - рдЗрд╕рд╕реЗ #[allow(deprecated)] рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЛрдВ рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреА рд╣реИред

unsafe -рдорд╛рд░реНрдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рдХреЗ рдореЙрдбрд▓ рдФрд░ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдпрд╣ рдХрд╡рд╛рдпрдж рд╕реБрдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ zeroed рдЬреИрд╕реЗ рдмрджрд▓рд╛рд╡реЛрдВ рд╕реЗ рдмрдЪреЗрдВ, рдЬрд╣рд╛рдВ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ рдЙрд╕реА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред ред

@bluss рдореЗрд░реА рд╕рдордЭ (рдЬреЛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ std::mem:zeroed рдЙрддрдирд╛ рд╣реА рдЦрддрд░рдирд╛рдХ рд╣реИ рдЬрд┐рддрдирд╛ std::mem::uninitialized , рдФрд░ UB рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ vec![0; N] рдпрд╛ [0; N] рд╕рд╛рде рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╢рд╛рдпрдж rustfix рдирд┐рдпрдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдмрд╛рдЗрдЯ рдпрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╣рд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ std::mem::zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рд╣реИ рдЬреЛ рдпреВрдмреА рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред

@scottjmaddox std::mem:zeroed рд╕рд╛рде UB рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди std::mem::uninitialized рд╡рд┐рдкрд░реАрдд, рдХреБрдЫ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП std::mem:zeroed рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ (рдЬреИрд╕реЗ, рджреЗрд╢реА рдкреНрд░рдХрд╛рд░, рдХрдИ FFI рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд) struct s, рдЖрджрд┐)ред рдХрдИ unsafe рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣, zeroed() рдХреЛ рд╣рд▓реНрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдЧрднрдЧ uninitialized() рд░реВрдк рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реИред рдореИрдВ рдПрдХ рдХреЗ рд▓рд┐рдП MaybeUninit::zeroed().into_inner() рдмрдЬрд╛рдп std::mem:zeroed() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрдЦреА рд╣реЛрдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ MaybeUninit рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдмреЗрдорд╛рдиреА рд╣реИ рдФрд░ рдереЛрдбрд╝рд╛ рдХрдо рд╕реБрдкрд╛рдареНрдп (рдФрд░ рдЬрдм рдореБрдЭреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдореВрд▓реНрдп рдХреА рджреЗрдпрддрд╛)ред

@mjbshaw

std :: mem :: uninitialized рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреБрдЫ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП std :: mem: zeroed рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрд╢реА)

рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП mem::uninitialized рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ ( рдЬреИрд╕реЗ unit ), рдЬрдмрдХрд┐ рдХреБрдЫ "рджреЗрд╢реА" рдкреНрд░рдХрд╛рд░ рд╣реИрдВ (рдЬреИрд╕реЗ bool , &T , рдЖрджрд┐) ред) рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП mem::zeroed рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред


рдпрд╣рд╛рдБ рдПрдХ рдЧрд╝рд▓рддрдлрд╝рд╣рдореА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ MaybeUninit рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ (рдФрд░ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдХреНрдпреЛрдВ: "Uninitialized" рдЗрд╕рдХреЗ рдирд╛рдо рдкрд░ рд╣реИ)ред

рдЬрд┐рд╕ рдЦрддрд░реЗ рдХреЛ рд╣рдо рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдПрдХ _invalid_ рдореВрд▓реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпрд╛ _invalid_ рдорд╛рди рдореЗрдВ рд╕рднреА рд╢реВрдиреНрдп, рдпрд╛ рдЕрд╕рдорд╛рдирдХреГрдд рдмрд┐рдЯреНрд╕, рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд┐рдЯ рдкреИрдЯрд░реНрди рд╕реЗ bool true рдпрд╛ false ) рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ - mem::zeroed рдФрд░ mem::uninitialized рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ _invalid_ рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЦрддрд░рдирд╛рдХ рд╣реИред

OTOH MaybeUninit::zeroed() рдФрд░ MaybeUninit::uninitialized() _safe_ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ union ред MaybeUninit::into_inner unsafe , рдФрд░ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдХреЗрд╡рд▓ _safe_ рд╣реИ рдЕрдЧрд░ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдХрд┐ MaybeUninit<T> рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдмрд┐рдЯреНрд╕ T рд╕рдВрддреБрд╖реНрдЯ рд╣реИред рдпрджрд┐ рдмрд┐рдЯ-рдкреИрдЯрд░реНрди _invalid_ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рдЕрдорд╛рдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рд╢реВрдиреНрдп, рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб рдмрд┐рдЯреНрд╕ рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореИрдВ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ MaybeUninit рдирд╛рдо рдереЛрдбрд╝рд╛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ MaybeInvalid рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд░рдЦреЗрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЦрддрд░реЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд @Centril рдХреЗ рд╕реБрдЭрд╛рд╡ рдореИрдВ bikeshed рдореБрджреНрджреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рддрд░реАрдХреЗ (рдЬреИрд╕реЗ рдХрд┐ MaybeUninit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛) рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдореЗрдореЛрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди mem::zeroed рдпрд╣ рдирд╣реАрдВ рд╣реИред рд╣рдо Zeroed рд╡рд┐рд╢реЗрд╖рддрд╛ Default рд╕рдорд╛рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╕рднреА рд╢реВрдиреНрдп рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рдорд╛рдиреНрдп рд╣реИрдВ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ, рдЬреЛ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ mem::zeroed рдЕрдм рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рддрдм рддрдХ рдирд╣реАрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкрде рди рд╣реЛред MaybeUninit mem::zeroed рдореЗрд░реА рдирдЬрд╝рд░ рдореЗрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ (рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдореИрдВ mem::zeroed рд╕рд╛рде рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ MaybeUninit рднреВрдорд┐, рднрд▓реЗ рд╣реА рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдЧрд╣ рдореЗрдВ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рди рд╣реЛред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рд╢рд╛рдпрдж рдЗрдирд╡реИрд▓рд┐рдб рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЗрд╕рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЦрддрд░реЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

Https://github.com/rust-lang/rust/pull/56138 рдореЗрдВ рдмрд┐рдХреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ ред

@gnzlbg

рдХреБрдЫ "рджреЗрд╢реА" рдкреНрд░рдХрд╛рд░ рд╣реИрдВ (рдЬреИрд╕реЗ bool

рдЬрдм рддрдХ bool FFI- рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдЬрд┐рд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, RFC 954 рдЦрд╛рд░рд┐рдЬ рд╣реЛрдиреЗ рдФрд░ рдлрд┐рд░ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж), рдЗрд╕рдХреЗ рд▓рд┐рдП mem::zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

, &T , рдЖрджрд┐) рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП mem::zeroed рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди mem::zeroed рд▓рд┐рдП UB рд╡рд╛рд▓реЗ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рднреА MaybeUninit::zeroed().into_inner() рд▓рд┐рдП UB рд╣реИ (рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ .into_inner() рдХреЛ рдЕрдкрдиреА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рдерд╛)ред MaybeUninit рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд .into_inner() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдареАрдХ рд╣реИ рдХрд┐ рдореИрдВ рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧ рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ mem::zeroed рдкрджрд╛рд╡рдирдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ mem::zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдЬрдм рддрдХ рдмреВрд▓ рдПрдлрдПрдлрдЖрдИ-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдЬрд┐рд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрд░рдПрдлрд╕реА 954 рдЦрд╛рд░рд┐рдЬ рд╣реЛрдиреЗ рдФрд░ рдлрд┐рд░ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж), рдореЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :: рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдпред

рдореИрдВ рдЗрд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди bool FFI- рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ C рдХреЗ _Bool рдмрд░рд╛рдмрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, C true рдХреЗ false рдорд╛рди _Bool C рдорд╛рдирдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡реЗ рдХреБрдЫ рджрд┐рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж C20 рдореЗрдВ), рдЗрд╕рд▓рд┐рдП mem::zeroed рдПрдХ рдорд╛рдиреНрдп bool mem::zeroed рдмрдирд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдпреЗ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдореЗрдо рдХреЗ рд▓рд┐рдП рдпреВрдмреА рд╣реИрдВ :: рд╢реВрдиреНрдп рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпреВрдмреА рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдпреВрдиреБрдЗрдирд┐рдЯ :: рд╢реВрдиреНрдп () ред__рдиреЗрд░ () (рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╢рд╛рдорд┐рд▓ рдерд╛ред рдореЗрд░реА рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ .into_inner () рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рд░реНрдл рддреБрд░рдВрдд рдХреЙрд▓ .into_inner () (рдЬреЛ рдареАрдХ рд╣реИ рдХрд┐ рдореИрдВ рдФрд░ рдХрдИ рдЕрдиреНрдп рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ рдЕрдЧрд░ рдореЗрдо :: рд╢реВрдиреНрдп рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╢рд╛рдпрдж рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдореЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ :: рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдЬреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ) ред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдХреМрди рд╕рд╛ рдореБрджреНрджрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред MaybeUninit рдХреЙрд▓рд┐рдВрдЧ рдпрд╛ рдХреЙрд▓ рди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк into_inner , рдЬреЛ mem::zeroed рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореВрд▓реНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд╕рдХрддрд╛ рд╣реИ ( рд╕рдВрдШ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрд╕рд┐рдВрдЪрд┐рдд рдпрд╛ рд╢реВрдиреНрдп рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ)ред

рдХреЛрдИ рдХреНрдпреЛрдВ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ mem::zeroed рд╕реЗ MayeUninit + into_inner ? mem::zeroed рдХреЗ рдбрд┐рдкреНрд░реЗрд╢рди рдЪреЗрддрд╛рд╡рдиреА рдХреЛ "рдареАрдХ" рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдбрд┐рдкреНрд░реЗрд╢рди рдХреА рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдФрд░ рдмрд╣реБрдд рдХрдо рд▓рд╛рдЧрдд рд╣реИред

mem::zeroed рд╕реЗ MaybeUninit рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ into_inner рдХреЙрд▓ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдпрд╛ рдмрд╕ MaybeUninit union рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрдм рддрдХ into_inner рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ (рдПрдХ рдмрд╣реБрдд рдХреЛрдб рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛ, рдПрдкреАрдЖрдИ рдмреНрд░реЗрдХрд┐рдВрдЧ рдХрд░реЗрдВ T s, рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдп MaybeUninit рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди)ред

рдореИрдВ рдЗрд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди bool FFI- рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ C рдХреЗ _Bool рдмрд░рд╛рдмрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, true рдФрд░ false C's _Bool are not defined in the C standard (although they might be some day, maybe in C20), so whether рдореЗрдо :: рд╢реВрдиреНрдп creates a valid bool` рдпрд╛ рдирд╣реАрдВ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ ред

рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛рдпрд╛рдЪрдирд╛, рд▓реЗрдХрд┐рди C11 рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдСрд▓-рдмрд┐рдЯреНрд╕-рд╕реЗрдЯ-рдЯреВ-рд╢реВрдиреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди 0 рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ (рдЕрдиреБрднрд╛рдЧ 6.2.6.2 "рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░", рдкреИрд░рд╛рдЧреНрд░рд╛рдл 5 рджреЗрдЦреЗрдВ) (рдЬрд┐рд╕рдореЗрдВ _Bool ) ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, true рдФрд░ false рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдиреБрднрд╛рдЧ 7.18 "рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдФрд░ рдорд╛рди <stdbool.h> " рджреЗрдЦреЗрдВ)ред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдХреМрди рд╕рд╛ рдореБрджреНрджрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред MaybeUninit рдХреЙрд▓рд┐рдВрдЧ рдпрд╛ рдХреЙрд▓ рди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк into_inner , рдЬреЛ mem::zeroed рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореВрд▓реНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд╕рдХрддрд╛ рд╣реИ ( рд╕рдВрдШ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрд╕рд┐рдВрдЪрд┐рдд рдпрд╛ рд╢реВрдиреНрдп рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ)ред

MaybeUninit рдФрд░ MaybeUninit::zeroed ред рд╣рдо рджреЛрдиреЛрдВ рдЙрд╕ рдкрд░ рд╕рд╣рдордд рд╣реИрдВред рдореИрдВ MaybeUninit::zeroed рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ std::mem::zeroed рдореЗрдВ рднреА рдореВрд▓реНрдп рд╣реИред

рдХреБрдЫ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдореЗрдо :: рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓рд┐рдЬреНрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдЬреИрд╕реЗ рдпреВрдирд┐рдЯ), рдЬрдмрдХрд┐ рдХреБрдЫ "рджреЗрд╢реА" рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ рдмреВрд▓, рдФрд░ рдЯреА, рдЖрджрд┐) рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореЗрдо :: рд╢реВрдиреНрдп рдЗрдиреНрд╡реЗрдб рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рд▓рд╛рд▓ рд╣реЗрд░рд┐рдВрдЧ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рджреЛрдиреЛрдВ zeroed рдФрд░ uninitialized рдХреБрдЫ рдЙрдк-рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рддреБрд▓рдиреАрдп рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдЙрди рд╕рдмрд╕реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рдирдХреЗ рд▓рд┐рдП mem::uninitialized рдмрд╣реБрдд рдмрд╣реБрдд рдХрдо рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ?), рдФрд░ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦреЗрдЧрд╛ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ ZSTs рдХреЗ рд▓рд┐рдП рдЖрдк рдмрд╕ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ? рдкреНрд░рдХрд╛рд░)ред рджреВрд╕рд░реА рдУрд░, рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП mem::zeroed рдорд╛рдиреНрдп рд╣реИред mem::zeroed рдХрдо рд╕реЗ рдХрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ (рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдорд┐рд▓рд╛ рд╣реИ):

  • рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ ( bool , рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)
  • рд╕рднреА рдХрдЪреНрдЪреЗ рд╕реВрдЪрдХ рдкреНрд░рдХрд╛рд░
  • Option<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 рд╕реЗ рд╕рд╣рдордд рд╣реИ рдХрд┐ рдореИрдВ рдмрджрд▓ рдХрд░ рдХрд┐рд╕реА рднреА footgun рдХреА рд░реЛрдХрдерд╛рдо рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ mem::zeroed() рд╣рд░ рдЬрдЧрд╣ рд╕реЗ MaybeUninit::zeroed().into_inner() ред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, uninitialized рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред zeroed рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдкрд░ рдорд╛рдиреНрдп рд╣реИрдВред

рдПрдХ Zeroed рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рд╕рдорд╛рди (рдЬреИрд╕реЗ Pod , рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ T: Zeroed рдЕрд░реНрде T: Pod ) рдЬреИрд╕рд╛ рдХрд┐ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдареАрдХ рдмрд╛рдд рд╣реИ рднрд╡рд┐рд╖реНрдп, рд▓реЗрдХрд┐рди рд╣рдо fn zeroed<T>() -> T рдирд╣реАрдВ рдШрдЯрд╛рддреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ fn zeroed2<T: Zeroed>() -> T рд╕реНрдерд┐рд░ рди рд╣реЛрдВред

@mjbshaw

рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛, рд▓реЗрдХрд┐рди C11 рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ! рдпрд╣ рдХреЗрд╡рд▓ C ++ рдХрд╛ bool рдЬреЛ рдорд╛рдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ! рдореБрдЭреЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде UC рдХреЛ рдПрдХ PR рднреЗрдЬреЗрдВред

@jethrogb

рдЖрдкрдХреЛ рдЙрди рд╕рдмрд╕реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП mem::uninitialized рд╡реИрдз рд╣реИ рд╡рд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ?), рдФрд░ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ ZSTs рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд┐рд░реНрдл рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ? рдкреНрд░рдХрд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░)ред

рдпрд╣ рд╕рднреА ZSTs рдХреЗ рд▓рд┐рдП рднреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдЧреЛрдкрдиреАрдпрддрд╛ рдореЗрдВ рдХрд╛рд░рдХ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде ZSTs "рдХрд╛рд░реНрдп рдХрд╛ рдкреНрд░рдорд╛рдг" рдпрд╛ "рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди" рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл "рдкреНрд░рдорд╛рдг рдЧрд╡рд╛рд╣" рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдПрдХ рддреБрдЪреНрдЫ рдЙрджрд╛рд╣рд░рдг :

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);
}

@ рдХреЗрдВрджреНрд░ рдпрд╣ рдПрдХ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХрд╛ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП uninitialized рдХреЙрд▓ рдХрд░рдирд╛ рдПрдХ рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рдЖрдВрддрд░рд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ Id рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП transmute(()) , рдпрд╛ рдЯрд╛рдЗрдк-рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд░реЙ рдкреЙрдЗрдВрдЯрд░реНрд╕ред

@jethrogb рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХ) рдХреГрдкрдпрд╛ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдЦ) рдЧреЛрдкрдиреАрдпрддрд╛ рд╡реИрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЖрдВрддрд░рд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди" рдФрд░ "рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп" рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ; рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рдЗрдб-рдХрдВрдбреАрд╢рди рд╣реИ "рдЕрдЧрд░ A != B рддреЛ Id<A, B> рдирд┐рд░реНрдЬрди рд╣реИред"

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЖрдВрддрд░рд┐рдХ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди" рдФрд░ "рдЕрдорд╛рдиреНрдп рдореВрд▓реНрдп" рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ; рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рдЗрдб-рдХрдВрдбреАрд╢рди рд╣реИ "рдЕрдЧрд░ A != B рддреЛ Id<A, B> рдирд┐рд░реНрдЬрди рд╣реИред"

рдЕрдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛рдУрдВ "рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП" рдЕрдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛рдУрдВ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ "рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП" рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ @RalfJung рдХреЗ рдмреНрд▓реЙрдЧ рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреЛрд╕реНрдЯ ред рдЙрд╕ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ, рдЖрдкрдХреЗ Id рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдФрд░ mem::zeroed рдпрд╛ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ Id<A, B> рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рддрддреНрдХрд╛рд▓ рдмреАрдмреА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред mem::zeroed рдпрд╛ mem::uninitialized рд╕рд╛рде рдПрдХ рдЧрд▓рдд Id рдореВрд▓реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ Id рдХреА рдХреЛрдИ рд╡реИрдзрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдРрд╕реЗ рдХреБрдЫ рдХрд╛рд░рдг рд╣реИрдВ рдЬрд┐рдирдХреА рд╡рдЬрд╣ рд╕реЗ рдпрд╣ рдЪрд░реНрдЪрд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рд╡реИрдзрддрд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ:

  • рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ, рд╢рд╛рдпрдж рд╣реА рдХрднреА рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдФрд░ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рддрд░реНрдХ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕реБрд░рдХреНрд╖рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдкрд╛рдЗрд▓рд░ / рднрд╛рд╖рд╛ред
  • рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреЛ рддреЛрдбрд╝рдирд╛ рдХрднреА-рдХрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдзреНрд╡рдирд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рднреАрддрд░), рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рд╣рдо рдпрдВрддреНрд░рд╡рддреН рд░реВрдк рд╕реЗ mem::zeroed::<T>() T рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╢рд╛рд╕рди рдХрд░ рд╕рдХреЗрдВ , рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рд╕рдВрдмрдВрдзрд┐рдд рд░реВрдк рд╕реЗ, рдЯреВрдЯреА рд╡реИрдзрддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЯреВрдЯреЗ рд╣реБрдП рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рд╕реЗ рднреА рдмрджрддрд░ рд╣реИрдВ (рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрдо рдореМрдХрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдирд░рдХ рддреБрд░рдВрдд рдвреАрд▓реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рдпреВрдмреА рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдо рд╕рдордЭрджрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╕рдВрдХрд▓рдХ рдФрд░ рдЕрдиреБрдХреВрд▓рдХ рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рдпрд╣, рдЬрдмрдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ / рдЯреЛрдХрд░рд╛ рдореЗрдВ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рд╢реЛрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

@Jethrogb рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ mem::zeroed рдХреЛ MaybeUninit рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ рдЬреИрдереНрд░реЛрдЬ рд╕реНрдорд╛рд▓

рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдИ рднреА рд╕рд░рдгреА
рдХреЛрдИ рднреА рд╕рдВрд░рдЪрдирд╛ рдЬрд╣рд╛рдБ рдХреЛрдИ рднреА рдХреНрд╖реЗрддреНрд░ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред

рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдЯрд╛рдЗрдкреЛ рдпрд╛ рд╢рдмреНрджрд╛рд░реНрде рдЕрдВрддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрди рджреЛ рдЧреЛрд▓рд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ None рдЬреИрд╕реЗ Option<[&u8; 2]> рдХрд╛ рдПрдХ рд╡реИрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝-рдЬрд╝реАрд░реЛ рд╣реИ (рдпрд╣ [0, 24601] рдХрд╛ рдЙрдкрдпреЛрдЧ None рдХреЗрд╕ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рдЖрд▓рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкрд░ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП - cc @ eddyb рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЖрдЬ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗред

@jethrogb

рдореЗрдо рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рдЙрдкрдпреЛрдЧ :: рд╢реВрдиреНрдп рдЖрдЬ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрд░реЛрдд рд╣реИ?

рджреВрд╕рд░реА рдУрд░, рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдореЗрдо :: рд╢реВрдиреНрдпрд┐рдд рдорд╛рдиреНрдп рд╣реИред

рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ mem::zeroed рднрд╛рд░реА рдФрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдбрд┐рдкреНрд░реЗрд╢рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рддрдм рддрдХ рджреЗрд░реА рд╣реЛрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рди рд╣реЛред

рдореИрдВ mem::zeroed рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдпрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рд╡рд╣ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд▓рд╛рдЧрдд рд╣реЛред рдПрдХ рдЕрд╡рдореВрд▓реНрдпрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдХреЛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд╡рдирд┐ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЛ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВ MaybeUninit рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ mem::zeroed рдФрд░ mem::uninitialized рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдо рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рджрд░реНрджрдирд╛рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ MaybeUninit рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рджрд╛рд╡реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрджрдирд╛рдХ рд╣реИ, рддреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд mem::zeroed рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ / рдпрд╛ RFC рдХреБрдЫ рд╣реА рд╕рдордп рдореЗрдВ рдкреЙрдк рдЬрд╛рдПрдЧрд╛ (рдХреБрдЫ рднреА рдпрд╣рд╛рдВ AFAICT рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ)ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ mem::zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдирдХреЗ рдКрдкрд░ рд╣реИ, рд╣рдо рдХрднреА рднреА mem::zeroed рдХреЛ libcore рд╡реИрд╕реЗ рднреА рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗред

рд▓реЗрдХрд┐рди mem::zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЙрдирдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧ рд╕рд╣реА рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ mem::zeroed рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ, рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ, mem::uninitialized рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ" рдХрдо рдбрд░рд╛рд╡рдиреЗ "рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ, рдЗрддреНрдпрд╛рджрд┐ рдХреА рджреЗрд░реА рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред" рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@bluss

рд╢реВрдиреНрдп рд╣рдЯрд╛рддреЗ рд╕рдордп рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ IFUnit рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ :: zeroed ()ред In_inner () рдЬреЛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рддрд░реАрдХрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИред рдпреВрдирд┐рдирд┐рдЯ рд╡реИрд▓реНрдпреВрдЬ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдмрдЬрд╛рдп рд╕рднреА рдпреВрдиреАрд▓рд┐рдиреЗрдЯреЗрдб рдбреЗрдЯрд╛ рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЯрд╛рдЗрдк рдпреВ рдпреВрдиреАрдЯрд┐рдЯ рдпрд╛ рд╕рдорддреБрд▓реНрдп рдпреВрдирд┐рдпрди рдХреЗ рдорд╛рдиреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ рдЬрдм рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ mem::zeroed() рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ mem::zeroed::<&T>() рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рд╕реЗ рдХрд┐ mem::uninitialized::<bool>() рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рддреЛ рд╢рд╛рдпрдж рдпрд╣ mem::zeroed() рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЕрднреА рднреА рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ mem::uninitialized::<u32>() рдареАрдХ рд╣реИ - рдЕрдЧрд░ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдирдзрд┐рдХреГрдд рдмрд┐рдЯреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ mem::uninitialized() рд▓рдЧрднрдЧ рд╕рднреА "POD рдкреНрд░рдХрд╛рд░реЛрдВ" рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреА рд╣реИред

рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЗрдо рдХреЗ рд▓рд┐рдП :: рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓рд┐рдЬреНрдб рд╡реИрдз рд╣реИ рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп-рдЖрдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ?), рдФрд░ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ ZSTs рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд┐рд░реНрдл рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдирд┐рд░реНрдорд╛рддрд╛)ред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдХреБрдЫ рд╕реНрд▓рд╛рдЗрд╕ рдЗрдЯрд░реЗрдЯрд░ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ ZST рдмрдирд╛рдирд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдХреЗ рд▓рд┐рдП mem::zeroed() / MaybeUninit::zeroed().into_inner() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

mem::zeroed() рдХреБрдЫ рдПрдлрдПрдлрдЖрдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ C рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ memset(&x, 0, sizeof(x)) рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдо рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рд╣реИред

@Amanieu рдЬреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓рдЧрддрд╛ рд╣реИред Rust рдХрд╛ рдирд┐рд░реНрдорд╛рдг memset рдореЗрд▓ write_bytes ред

рдореЗрдо :: рд╢реВрдиреНрдп () рдХреБрдЫ рдПрдлрдПрдлрдЖрдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдереА, mem::zeroed рдирд┐рдЬреА рдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде libc рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХрд╛ рдерд╛ред

@RalfJung рдкреНрд░рд╢реНрди рдореЗрдВ рдкреВрд░реНрдг рдХреЛрдб рдЖрдорддреМрд░ рдкрд░ Type x; memset(&x, 0, sizeof(x)); рдФрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдПрдХ рдорд╣рд╛рди рдЬрдВрдЧ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП MaybeUninit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░ рд╣реИ (рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рдХреЛрдбреАрди) рдЬрдм memset рдмрд╛рдж рдореЗрдореЛрд░реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрднреА рднреА рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдореИрдВ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИ MaybeUninit : рд╡рд╣рд╛рдБ рдХреА рдПрдХ рдПрдХрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ T рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирд┐рд╣рд┐рдд MaybeUninit<T> рдРрд╕реА рд╣реИ рдХрд┐ рдЖрдк рдХреЗ рд▓рд┐рдП рдЦрддреНрдо рд╣реЛ рд╕рдордп рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рдорд╛рдиреНрдп / рдЖрд░рдВрднрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ?

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

// Let us suppose that Foo can in principle be any struct containing arbitrary types
struct Foo {bar: bool, baz: String}

рдХреНрдпрд╛ рдПрдХ & рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА 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(); }
}

рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдпреВрдмреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╕рд╣рдЬ рд░реВрдк рд╕реЗ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдореИрдВ рдПрдХрддрд░рдлрд╛ / рдЕрдорд╛рдиреНрдп рд╕реНрдореГрддрд┐ рдирд╣реАрдВ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВред

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрди-рдкреНрд▓реЗрд╕ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдФрд░ рдПрдХ рд╕рдордЭрджрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИ рдореВрд▓реНрдпред

рдХреНрдпрд╛ рдЯреА рдХреЗ рдХрд┐рд╕реА рдПрдХрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╢рд╛рдпрдж рдпреВрдлрд┐рдирд┐рдЯ рдХреЗ рдЕрдВрджрд░ рд╣реИрдЖрдк рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡реИрдз / рдЖрд░рдВрднрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рд╛рдБред рдЙрдкрдпреЛрдЧ

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() рдмрд┐рдЯ рдореБрдЭреЗ рдЪрд┐рдВрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╕реВрдЪрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдареАрдХ рд╣реИ? рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдХреЛ рдкрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ unaligned ptr::write MaybeUninit<T> рд╕реЗ рдЕрдзрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ?

write_unaligned рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдлреАрд▓реНрдб рдЕрд▓рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдФрд░ as *mut bool рдпрд╛ рддреЛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ &mut рдХреЛ *mut рд╕рдореЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рдЬрдмрд░рди рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд / рд╡реИрдз рдХреНрдпреЛрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ as *mut _ , рддреЛ рдпрд╣ рднреА рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

@scottjmaddox рдХреНрдпрд╛ ptr::write рдЕрднреА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рднрд▓реЗ рд╣реА #[repr(packed)] ? ptr::write рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ptr::write_unaligned рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреИрдХреНрдб рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдореИрдВ " MaybeUninit<T> " рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдареАрдХ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдерд╛ рдпрд╛ рдирд╣реАрдВ)ред

@nicoburns

рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рддреБрд░рдВрдд рдПрдХ рдкреЙрдЗрдВрдЯрд░ (рдФрд░ рдореНрдпреВрдЯ рдлреВ рдХреЗ рд░реВрдк рдореЗрдВ * рдореНрдпреВрдЯ рдЯреА) рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реБрдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ creting рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдЬреЛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЗрд╕ рд╕рдВрдХрд▓рди рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЖрдИрдЖрд░ рдореЗрдВ рдПрдХ рдиреЛ-рдСрдк рд╣реИ, рддреЛ рднреА рдпрд╣ рдПрдХ рдЕрд░реНрде рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ред @scottjmaddox рд╕рд╣реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдСрдкрд░реЗрд╢рди рдпрд╣рд╛рдВ рдЦреЗрд▓реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рд╢реНрди рдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬреЛ рд░реЗрдл-рдЯреВ- @mjbshaw рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ ptr::write_unaligned рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рд╣реИ рдЬрдм рддрд░реНрдХ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рд╣реИред

рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХрд╣рд╛рдБ рдкрдврд╝рддрд╛ рд╣реВрдБ (рдирд╛рдордХрд░рдг? @RalfJung рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ?) рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╛рдлреА рдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдбреЗрд░реЗрдлреЗрд░реЗрдВрд╕, рд░реЗрдлрд░реЗрдВрд╕ рдФрд░ рд░реЗрдлрд░реЗрдВрд╕ рдХреЗ рддрддреНрдХрд╛рд▓ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ (рдпрд╛ рддреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдЬрдмрд░рджрд╕реНрддреА рдпрд╛ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ) рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рд╣реИред

рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрд╕рд┐рдВрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрди рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг get_mut () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдХреЛрдб рдмрд┐рдВрджреБ рдкрд░ рдЬрд╣рд╛рдВ ptr :: write рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдб рдиреЗ рдЖрдВрддрд░рд┐рдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ & mut _ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдкреВрд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдиреНрдпрдерд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реИ?

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓! рдЗрди рдЪрд┐рдВрддрд╛рдУрдВ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ https://github.com/rust-lang/rfcs/pull/2582 рдХреЛ рдЦреЛрд▓рд╛ &mut рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ *mut рдмрдирд╛рддрд╛ рд╣реИред

@ рдордЬреНрдЬрдмрд╢реЛ рдЯрдЪреЗ ред рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреИрдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП ptr::write_unaligned рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрднреА рддрдХ рдЬрдВрдЧ рдореЗрдВ рдкреИрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдХреНрд▓реАрдкреА рд▓рд┐рдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреНрд▓рд┐рдкреА рд▓рд┐рдВрдЯ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдореБрджреНрджрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛: https://github.com/rust-lang/rust-clippy/issues/3659

рдореИрдВрдиреЗ рдПрдХ PR рдХреЛ un-deprecate mem::zeroed рдЦреЛрд▓рд╛: https://github.com/rust-lang/rust/pull/57825

рдореИрдВрдиреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рд╢реВрдиреНрдпрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдХрд╛рдВрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RFC рд░реЗрдкреЛ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рд╕рдордп mem::zeroed рдШрдЯрд╛ рд╕рдХреЗрдВ: https://github.com / рдЬрдВрдЧ-рд▓реИрдВрдЧ / RFCs / рдореБрджреНрджреЛрдВ / 2626

рдХреНрдпрд╛ const uninitialized , as_ptr рдФрд░ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛
рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ as_mut_ptr ? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпреЗ
рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрднреА рд╣реИрдВред рд╕рд╛рде рд╣реА, рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
as_ptr рдФрд░ as_mut_ptr , рдЗрд╕рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛
crates.io рдкрд░ MaybeUninitExt рдЧреБрдг рд╣реИ рдЬреЛ рд╕реНрдерд┐рд░, рдПрдкреАрдЖрдИ рдкрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ (рдЬреИрд╕реЗ рд╕реНрдерд┐рд░-рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ
рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВред

рд╡реИрд╢реНрд╡рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ (рдЕрд╕реНрдерд┐рд░) рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ,
рдмрд╣реБрдд рдХреБрдЫ ред MaybeUninit рдХреЗ рдмрд┐рдирд╛, рдЕрдиреИрддрд┐рдХ рд╕реНрдореГрддрд┐ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ
рд╕реНрдерд┐рд░ рдкрд░ рд╕реНрдерд┐рд░ рдЪрд░ред рдпрд╣ рд╣рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреНрд╖рдорддрд╛ рд░рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ
рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдХреНрд░рдо рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░
рд╢реВрдиреНрдп рд▓рд╛рдЧрддред рдПрдкреАрдЖрдИ рдХреЗ рдЗрд╕ рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдпреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЕрдирдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдореНрдмреЗрдбреЗрдб рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╣рдордиреЗ рдХрд┐рдпрд╛
[рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг] рд╕рдореБрджрд╛рдп рд╕реЗ рдЙрдирдХреЗ рджрд░реНрдж рдмрд┐рдВрджреБрдУрдВ рдФрд░ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реИред рд╕реНрдерд┐рд░
MaybeUninit рджреВрд╕рд░реА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдзрд┐рдд рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реБрдИ (рдкреАрдЫреЗ)
const fn рд╕реАрдорд╛ рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде) рдФрд░, рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рджрд░реНрдЬрдиреЛрдВ рдореЗрдВ рд╕реЗ 7 рд╡реЗрдВ рд╕реНрдерд╛рди рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ
рдЬрдВрдЧ-рд▓рдВрдЧ / * рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдзред рдбрдмреНрд▓реНрдпреВрдЬреА рдХреЗ рднреАрддрд░ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХреЗ рдмрд╛рдж рд╣рдо рдЯрдХрд░рд╛рдП
рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛, рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рддреАрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд╣реИред

(рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдиреЛрдЯ рдкрд░, рдореИрдВ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрдЧрд╛рдорд┐рддрд┐ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рд▓реЗрдЦрдХ рд╣реВрдВ
рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ MaybeUninit (рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛
рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рд╢реВрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде 10-50% рддрдХ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдореИрдВ
рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рдХрд╛рд░реНрдЧреЛ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди
рд░рд╛рдд-рд╣реА-рдПрдореНрдмреЗрдбреЗрдб рдФрд░ рдХреЗрд╡рд▓ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
рд░рд╛рдд рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЧрд▓рдд рд╕рдВрджреЗрд╢ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХрд╛ рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред)

@ рдЬрд╛рдкрд░рд┐рдХ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ into_inner рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдЪрд░реНрдЪрд╛ рд╕реЗ рдмрдЪреЗрдВрдЧреЗ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрднреА рднреА рд╢рдмреНрджрд╛рд░реНрде рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, let r = &mut *foo.as_mut_ptr(); рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реИрдз рд╕рдВрджрд░реНрдн рд╣реИ, рдЬрдмрдХрд┐ рд╣рдо рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╡реИрдзрддрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ - рдЕрд░реНрдерд╛рдд, рд╣рдо рд╣реИрдВ рдЕрднреА рддрдХ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд░реЗрдлрд░реА рдЗрдВрд╕реНрдЯрд╛-рдпреВрдмреА рд╣реИред рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

let x: MaybeUninit<!> = MaybeUninit::uninitialized();
let r: &! = &*x.as_ptr() // is this UB?

рдпрд╣ рдЪрд░реНрдЪрд╛ рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ UCG WG рдореЗрдВ

рдореЗрд░реА рдЖрд╢рд╛ рдереА рдХрд┐ рдПрдХ рдПрдХрд▓, рд╕реБрд╕рдВрдЧрдд "рдкреИрдХреЗрдЬ" рдореЗрдВ 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 рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред)

рдореЗрд░реА рдЖрд╢рд╛ рдереА рдХрд┐ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдХрд╣рд╛рдиреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрд╕рдВрдЧрдд "рдкреИрдХреЗрдЬ" рдореЗрдВ рд╢рд╛рдпрдж рдпреВрдЗрдирд┐рдирд┐рдЯ рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╕реАрдЦрдирд╛ рдкрдбрд╝реЗ, рдмрдЬрд╛рдп рдЗрд╕реЗ рдЯреБрдХрдбрд╝рд╛-рджрд░-рдЯреБрдХрдбрд╝рд╛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдФрд░ рд╢рд╛рдпрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреБрдЫ рдирд┐рдпрдо рдмрджрд▓реЗрдВред

рдореБрдЭреЗ рдпрд╣ рддрд░реНрдХ рдмрд╣реБрдд рд╕рдореНрдореЛрд╣рдХ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдмреА рдХреЗ рдмрд┐рдирд╛ рдЕрд╕рдВрдмрджреНрдз рд╕реНрдореГрддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╕рдВрджреЗрд╢ рд╣реИред рдпрджрд┐ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ ptr::read_unaligned рдФрд░ ptr::write_unaligned " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рдорд╛рдиреЛрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛ / рдХрдЫреБрдЖ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред ред рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 2582 (рдкреНрд▓рд╕ рдХреБрдЫ рдкреНрд░рд▓реЗрдЦрди) рддрддреНрдХрд╛рд▓ рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ MaybeUninit рдирд╣реАрдВ рд╣реИред

@scottjmaddox рдХреИрд╕реЗ рд╣реИ рдХрд┐ RFC рд▓реЗрдХрд┐рди MaybeUninit рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓рд┐рдиреЗрдЯреЗрдб (рд╕реНрдЯреИрдХ) рдореЗрдореЛрд░реА?

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрди рдпреВрдмреА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ:

let x: bool = mem::uninitialized();
ptr::write(&x as *mut bool, false);
assert_eq!(x, false);

рдореЗрд░реА рдирд┐рд╣рд┐рдд рдзрд╛рд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 2582 рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдорд╛рдиреНрдп рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ?

@scottjmaddox

let x: bool = mem::uninitialized();

рдпрд╣ рдпреВрдмреА рд╣реИред рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реА рдирд┐рд╣рд┐рдд рдзрд╛рд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 2582 рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдорд╛рдиреНрдп рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реИрд░рд╛рди рд╣реВрдВред рд╡рд╣ RFC рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЖрдк рдпрд╣ рдХреНрдпреЛрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмреВрд▓рд┐рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рддрд╛ рд╣реИ?

@RalfJung

рдпрд╣ рдпреВрдмреА рд╣реИред рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдореЗрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реБрдП рдЯрд╛рдЗрдк рдЯреА рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рдмрд╣рд╛рдиреЗ рд░рд╕реНрдЯ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдореЗрдореЛрд░реА-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рд▓реЗрдЦрди T* рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред

@kpp рдЖрдк рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣реЗ рд╣реИрдВ? рдЙрд╕ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреЛрдИ * рдФрд░ & :

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 рдХреЗ рдХреЗрд╡рд▓ рджреЛ _рд╡рд▓рд┐рдз_ рдорд╛рди рд╣реИрдВ, true (рдмрд┐рдЯ-рдкреИрдЯрд░реНрди: 0x1 ) рдФрд░ false (рдмрд┐рдЯ-рдкреИрдЯрд░реНрди: 0x0 )ред

mem::uninitialized , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХрд╛ рдореВрд▓реНрдп uninitialized ред рдпрд╣ рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рди рддреЛ 0x0 рдФрд░ рди рд╣реА 0x1 , рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк bool _invalid_ рд╣реИ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рддреАрди рдорд╛рдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП bool рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛: true , false , рдпрд╛ uninitialized ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЯреА-рд▓реИрдВрдЧ рдФрд░ рдЯреА-рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА RFC'ed рд╣реИ рдХрд┐ bool C рдХреЗ _Bool рд╕рдорд╛рди рд╣реИ рдФрд░ рд╣рдо рдЙрд╕ рдЧрд╛рд░рдВрдЯреА рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝ рд╕рдХрддреЗ (рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ) C FFI рдореЗрдВ bool рдХрд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ)ред

рддрд░реНрдХ, рд╕реА рдХреА рд╡реИрдзрддрд╛ рдХреА рд╡рд╣реА рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд░реБрд╕реНрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реА "рдЯреНрд░реИрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡" рдмрд╣реБрдд рдХрд░реАрдм рдЖрддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдмрд╣реБрдд рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ C рдореЗрдВ _Bool рд╕рд╛рде рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ true рдпрд╛ false рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ рддреЛ рдирд┐рдореНрди рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рднреА UB рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

let x: bool;
x = true;

рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рднреА рдпреВрдмреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

let x: bool; x рдХреЛ uninitialized рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ x рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред x = true; x (рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ рдЖрдк x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред

рдпрд╣ C рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬрд╣рд╛рдВ, рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░, _Bool x; x _

рдирд╣реАрдВрдВ, рд╡рд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ x рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред

mem::uninitialized рд╕рд╛рде рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓

let x: bool; рдЕрдкрдиреЗ рдЖрдк рдкрд░ рднреА x рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирд╛рдо рд░рдЦрддрд╛ рд╣реИред let x = foo; рдХреБрдЫ рд╕реНрдерд╛рди рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ foo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред let x: bool = mem::uninitialized(); 1 x рд▓рд┐рдП рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛ 1 рдмрд╛рдЗрдЯ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕рд┐рдВрдЪрд┐рдд рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдпрд╣ рдЖрдкрдХреЗ рдкреИрд░ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдХрд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдореЗрдВ рджреЛрдиреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :: uninitialized рдФрд░ intrinsics :: uninit for a specialis with mem :: uninitializedрд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЖрддрдВрдХрд┐рдд рд╣реЛрдирд╛ред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдпрд╣ рднреА рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрдо рдХреЗ рд╕рд╛рде рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдирд╛ :: рдЕрд╕рдВрдмрджреНрдз рдпреВрдмреА рднреА рд╣реИ?

@kpp

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдпрд╣ рднреА рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрдо рдХреЗ рд╕рд╛рде рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдирд╛ :: рдЕрд╕рдВрдмрджреНрдз рдпреВрдмреА рднреА рд╣реИ?

рд╣рд╛рдБ - рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ, mem::uninitialized рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкреИрд░ рдореЗрдВ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫ рдмрдирд╛рддрд╛ рд╣реИ, рдореИрдВ рдпрд╣ рдХрд╣рдХрд░ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдХрд┐ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ MaybeUninit рдкрдХреНрд╖ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдШ рд╣реИ, рдЖрдк рдореВрд▓реНрдпреЛрдВ рдХреЛ "рднрд╛рдЧреЛрдВ рджреНрд╡рд╛рд░рд╛" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ _invalid_ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд╛ рдорд╛рдиред рдореВрд▓реНрдп рдХреЗрд╡рд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ _valid_ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХреЛрдИ into_inner() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдЪреЗрдХ рдФрд░ рдЕрдирдЪреЗрдХ рдХрд┐рдП рдЧрдП (рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░) рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╛рдорд╛рдВрдХрд┐рдд рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ: https://doc.rust-lang.org/nomicon/checked-uninit.html рд╡реЗ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ let x: bool; рдЖрд░рдВрднреАрдХрд░рдгред рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрджреНрджреЛрдВ рдХреЛ рднрд░реЗрдВ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рднреА рд╣реЛ рдЬреЛ рдЖрдкрдХреЛ рд╕рдордЭ рдореЗрдВ рди рдЖрдПред рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг "рдЧреИрд░-рдорд╛рдирдХ" рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрднреА рддрдХ рдЖрд░рдПрдлрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░реЗ рд╣реИрдВред рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ WG рдЗрд╕ рд╡рд░реНрд╖ рдХрд┐рд╕реА рд╕рдордп RFC рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдЖрдкрдХреЗ рдкреИрд░ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдХрд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдореЗрдо рджреЛрдиреЛрдВ рдореЗрдВ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :: uninitialized рдФрд░ intrinsics :: uninit

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо MaybeUninit рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдореЗрдВ рдХрдард┐рди рд╣реИрдВ, рддрд╛рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╡рд╕рд╛ "рдбреВ рдиреЙрдЯ рдпреВрдПрд╕рдИ" рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред


рдЗрд╕ рддрд░рд╣ рдЪрд░реНрдЪрд╛рдПрдВ рдФрд░ рдЬреИрд╕реЗ рдореБрджреНрджреЛрдВ рдЗрд╕ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде @japaric рдХрд┐ рд╣рдо рджрд░рд╡рд╛рдЬрд╛ рдпрдерд╛рд╢реАрдШреНрд░ рдмрд╛рд╣рд░ рдХреБрдЫ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рд╣рдордд рд╣реИрдВред рдЕрд╕рд▓ рдореЗрдВ рд╣рдо рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЗрд╕ рдФрд░ рдЗрд╕ рдЪреЗрдХ рдмреЙрдХреНрд╕ рдХреА рд╕реВрдЪреА рдЯрд┐рдХ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдкреИрдЯрд░реНрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ, рдЕрд╕рдВрдЧрдд, as_ptr рдФрд░ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛
рдмрд╛рдХреА рдПрдкреАрдЖрдИ рд╕реЗ рдЖрдЧреЗ as_mut_ptr? рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпреЗ
рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрднреА рд╣реИрдВред

рдЗрд╕рдХреЗ рд▓рд┐рдП +1ред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрдерд┐рд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп (рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд) рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрд╕ рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдореНрди-рд╕реНрддрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛ред рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХрд╛ рдпрд╣ рдкрд╣рд▓реВ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ get_ref рдФрд░ get_mut рдХрднреА рд╕реНрдерд┐рд░ рди рд╣реЛрдВ, рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВред рдЖрдо рддреМрд░ рдкрд░, рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓реЛрдЧ рдЗрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП as_ptr рдФрд░ as_mut_ptr рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗ рдХрдЪреНрдЪреЗ рдкреНрд╡рд╛рдЗрдВрдЯрд░ рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдпреВрдмреА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдпрджрд┐ рдирд┐рдпрдо "рдЕрд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рдХрднреА рдирд╣реАрдВ рдмрдирд╛" рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдРрд╕рд╛ рд╕рдВрджрд░реНрдн рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред ред

Https://github.com/rust-lang/rfcs/pull/2582 рдХреА рдорд╛рдиреЗрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ (1) рднрд▓реЗ рд╣реА UB рдирд╣реАрдВ рд╣реИ (2) рд╣реИ, рдФрд░ (1) рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рдХреА derefencing рднреА рд╣реЛрддреА рд╣реИ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ?

(1) unsafe { ptr::write_unaligned(&mut ((*uninit_foo.as_mut_ptr()).bar) as *mut bool, true); }
(реи) let x: bool = mem::uninitialized();

рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рддрд░реНрдХ рд╣реИ (рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╢рд╛рдпрдж рдбреЙрдХреНрдпреВрдореЗрдВрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)? рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ (1) рдореЗрдВ рдбреАрд░рд┐рдлрд╝рд░реНрдб рд╡реИрд▓реНрдпреВ рд╣рдореЗрд╢рд╛ "рд░рд┐рд╡реЗрд▓реНрдпреВ" рд░рд╣рддреА рд╣реИ рдФрд░ рдХрднреА рдирд╣реАрдВ рдмрдирддреА рдФрд░ "рд▓реЗрд╡реЗрд▓реНрдпреВ" рдмрди рдЬрд╛рддреА рд╣реИ, рдЬрдмрдХрд┐ (2) рдореЗрдВ рдЕрдорд╛рдиреНрдп рдмреВрд▓ "рд▓реИрд╡рд▓реНрдпреВ" рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрдЯреЗрдЧрд░рд╛рдЗрдЬрд╝ рд╣реЛрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ (рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╢рдмреНрдж Rust рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ C ++ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ)ред

рдФрд░ рдХреНрдпрд╛ рджреВрд╕рд░реЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд░ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ RFC рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ рдЬреЛ рд╕реАрдзреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдЗрд╕ рднреНрд░рдо рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗ?

рдпрджрд┐ рдирд┐рдпрдо "рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдб рдореЗрдореЛрд░реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдмрдирд╛ рд╣реИ"

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдирд┐рдпрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреА рдЪрд░реНрдЪрд╛ рдЕрднреА рдпреВрд╕реАрдЬреА рдореЗрдВ рд╣реЛ рд░рд╣реА рд╣реИред

рдХреНрдпрд╛ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ (1) рднреА UB рдирд╣реАрдВ рд╣реИ (рднрд▓реЗ рд╣реА 2) рд╣реИ, рдФрд░ (1) рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рдХреА рдПрдХ derefencing рднреА рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ?

рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрди! рд▓реЗрдХрд┐рди рд╣рд╛рдВ, рд╣рдо рд╣реИрдВ - рдХрддрд░рдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ, рдореВрд▓ рд░реВрдк рд╕реЗред рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛ &mut foo as *mut bool рдХреЗ рд░реВрдк рдореЗрдВ &raw mut foo , рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкрд░рдорд╛рдгреБ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ *mut bool ред рдпрд╣рд╛рдБ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдХрдЪреНрдЪреА рдкреАрдЯреАрдЖрд░ рд╕реЗ рд▓реЗрдХрд░ рдЕрд╕рдВрдмрджреНрдз рд╕реНрдореГрддрд┐ рддрдХ - рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рд╣реИред

let x: bool = mem::uninitialized();

рдпрд╣ рдпреВрдмреА рд╣реИред рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

рдореЗрд░реА рдирд┐рд╣рд┐рдд рдзрд╛рд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 2582 рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдорд╛рдиреНрдп рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реИрд░рд╛рди рд╣реВрдВред рд╡рд╣ RFC рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЖрдк рдпрд╣ рдХреНрдпреЛрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмреВрд▓рд┐рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рддрд╛ рд╣реИ?

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдпреВрдмреА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдп

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдПрдХреНрд╕ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреНрд╕ рдбреНрд░реЙрдк рдореЗрдВ рдореВрд▓реНрдп, рдореВрд▓реНрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпреВрдмреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП 2582 rfc рдЖрд╡рд╢реНрдпрдХ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдпреВрдмреА рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдп рдЕрдкреНрд░рд╛рдкреНрдп рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рддреБрд░рдВрдд рдПрдХ рдорд╛рдиреНрдп рдмреВрд▓ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ?

рд╢рдмреНрджрд╛рд░реНрде рдХрдерди (MIR рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП) рдХрдерди рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рд╣рд░ рдПрдХ рдХрдерди рдХрд╛ рдЕрд░реНрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред let x: bool = mem::uninitialized(); рдПрдХ рдмреБрд░реЗ рдмреВрд▓рд┐рдпрди рдХреЛ рднреМрддрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдПрдХ рдмреБрд░рд╛ рдмреВрд▓рд┐рдпрди рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ x рдХрд╛ рдорд╛рди рдЕрдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдпреЗ рдХреЗрд╡рд▓ рддрднреА рдЖрдХреНрд░рдордг рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рд╣рдореЗрд╢рд╛ рдкрдХрдбрд╝ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЕрдкрд╡рд╛рдж рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдФрд░ рдлреЙрд░реНрдо рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реЛрдВ "рдорд╛рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ"ред рдпрд╣рд╛рдБ, "рдирд┐рд░реАрдХреНрд╖рдг" рдПрдХ bool рдПрдХ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЬрд╛рдПрдЧреА if ред рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдХрдо рдЙрдкрдпреЛрдЧреА рд╣реИ: рдЕрдм рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореВрд▓реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдирд┐рд░реАрдХреНрд╖рдг" рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рди рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рд╣рдо рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рднрд╛рд╖рд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╢рд╛рдпрдж рд╣реА рдХрднреА "рдЖрд╡рд╢реНрдпрдХ" рджрд░ рдЕрд╕рд▓ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рддреЛ рдпрд╣рд╛рдВ рдХрд▓рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдвреВрдВрдврдирд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдзреНрд╡рдирд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ^ ^) рдЬреЛ рджреЛрдиреЛрдВ рд╡рд╛рдВрдЫрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ (рдЕрд╕реБрд░рдХреНрд╖рд┐рдд) рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ "рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░" рдХрд╛ рдЕрд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рдерд╛ , рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЬрд╡рд╛рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдкрдХреЗ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ - рдФрд░ рдЕрдиреБрдмрдВрдз рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрдкрдХрд╛ рджрд╛рдпрд┐рддреНрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рдорд╛рдг рджрд╛рдпрд┐рддреНрд╡ рд╣реИред "рдПрдХ NULL рдкреЙрдЗрдВрдЯрд░ рдХреЛ dereferencing UB рд╣реИ" рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдХрд┐ "рд╣рд░ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рдкреЙрдЗрдВрдЯрд░ рдбреАрдлрд╝рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдкреЙрдЗрдВрдЯрд░ рд╕рдВрднрд╡рддрдГ NULL рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛"ред рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдбрд┐рдлрд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдм "aha" рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдпрд╣рд╛рдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдкреЙрдЗрдВрдЯрд░ NULL рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж , рдкреНрд░реЛрдЧреНрд░рд╛рдорд░! "

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рд╡рд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рддрдХ рд╣реИред рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрд▓рдПрд▓рд╡реАрдПрдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╡рд╢ рд╣реИрдВ)ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреВрд╕реАрдЬреА рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ (рднрд╛рд╖рд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рдЯреАрдореЛрдВ рд╕реЗ рдЬреЛ рд╣рдордиреЗ рд╕реБрдирд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЦрдВрдб рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ: "рд╣рд░ рдмрд╛рд░ рдЬрдм рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдЧреАред рд╡реИрдзрддрд╛ рдЕрдпреЛрдЧреНрдп рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗрдВред " рднреМрддрд┐рдХреА рдпрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдХреЛрдИ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЗрд╕ рдЦрдВрдб рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЙрдЪрд┐рдд рд╕рдордЭреМрддрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрдордЬреЛрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рд╕рд╛рде рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред рд╣рдо рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдмрддрд╛рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЪреБрдирд╛рд╡ "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХреЗ рдмреАрдЪ рд╣реЛрддрд╛ рд╣реИ рддреЛ MaybeUninit рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рднреА рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ" рдФрд░ " рд╕рднреА рдХреЛрдб рдХреЛ рдХрдо рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ", рдкреВрд░реНрд╡ рд▓рдЧрддрд╛ рд╣реИред рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ред

рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реБрдП:

let x: bool = mem::uninitialized();

рдпрд╣ рдХреЛрдб рдЖрдЬ рдЬрдВрдЧ рдореЗрдВ рдпреВрдмреА рд╣реИред рдпрджрд┐ рдЖрдк mem::uninitialized::<bool>() рд▓рд┐рдП (Unoptimized) 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 рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдЬреЛ LLVM рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдЗрдЯ 0 <= x <2 рдХреЗ рдмреАрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдпрд╣ рдХреЗрд╡рд▓ 0 рдпрд╛ 1. рд╣реЛ рд╕рдХрддреА рд╣реИред LLVM рдпрд╣ рдорд╛рди рд▓реЗрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рддреНрдп рд╣реИ, рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдпрджрд┐ рдЗрд╕ рдмрд╛рдзрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЗрддрдиреА рдЕрдзрд┐рдХ рдЧреИрд░-рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЪрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдврд╝рд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рджрд░реНрд╢рдиреА рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдЕрдм рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдореВрд▓ рд╣реИрдВрдЧрдЕрдк рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ "рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░" рдХрд╛ рдЕрд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред

рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯреЛрдВ рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░реА рдкреЛрд╕реНрдЯ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк / рдбрд░рд╛рд╡рдиреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ) рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know .html

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрд╣рд╛рдБ рдмрджрд▓рд╛рд╡ рд╢рд╛рдпрдж рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ рдФрд░ рд╢рд╛рдпрдж рдЕрдиреНрдп рдЬреЛ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд▓реЗрдХрд┐рди рдПрдХрддрд░рдлрд╛ рдореЗрдореЛрд░реА (рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ) рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдЙрдВрдЯрд░-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдиреЛрдорд┐рдХреЛрди рдХреЗ рдкрд╛рд╕ uninitialized рдкрд░ рдПрдХ рдЦрдВрдб рд╣реИ (рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рд▓реЗрдХрд┐рди рдпрд╣ рдореБрджреНрджреЗ рдХреА рдкреВрд░реА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

(рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реЗрдЪреНрдЫрд╛ рд╕реЗ рд╣реВрдВред рдореИрдВ рдирд╛рдорд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ ... рдЬреЛ рдХреЛрдИ рднреА рдореЗрд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирддрд╛ рд╣реИред)

Https://github.com/rust-lang/rust/issues/55422#issuecomment -433943803 рд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░: рд╣рдо 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 рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЛрдВ (рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ, as_ptr , as_mut_ptr рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред set , into_initialized )ред

MaybeUninit::zeroed() a const fn рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? ( MaybeUninit::uninitialized() рдПрдХ const fn )

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд╛рдд рдореЗрдВ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ const fn рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

MaybeUninit::zeroed() a const fn рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? ( MaybeUninit::uninitialized() рдПрдХ const fn )

@gnzlbg рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА , рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдЬрд▓реНрдж рд╣реА рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЪрд┐рдВрддрд┐рдд рдХрд░рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдХреБрд▓ рдХрдореА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡рд╣ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗред рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдПрдкреАрдЖрдИ рдореБрджреНрджреЛрдВ рдХреЛ рдмрд╣реБрдд рджреЗрд░ рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗред

@ рд░рд╕реНрдЯ-рд▓реИрдВрдЧ / рд▓рд┐рдмрд╛рд╕ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рддрд╣рдд рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ? рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХрд╛рд░реНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝реЗ, рдЬреИрд╕реЗ, MaybeUninit::as_ptr(...) ред рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреЛ рдЕрдкрдардиреАрдп рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдбрд╝рд╛ рджреЗрдЧрд╛ - рд▓реЗрдХрд┐рди рдУрдЯреАрдУрдПрдЪ, ManuallyDrop рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдиреЗ рдареАрдХ рдпрд╣реА рдХрд┐рдпрд╛ред

@RalfJung рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЫрд┐рдкрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рди рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВ, рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП ManuallyDrop::take ред

рдЪреВрдБрдХрд┐ MaybeUninit<T> рдХрднреА рднреА Deref<Target = T> , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐рдпрд╛рдБ рдпрд╣рд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ рдФрд░ рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ std рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MaybeUninit рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

  1. Sys / sgx / ext / arch.rs рдореЗрдВ рдореИрдВ рдЗрдирд▓рд╛рдЗрди рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ get_mut рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛, рд╕реЛрдЪ рд╕рдВрджрд░реНрдн рдФрд░ рдХрдЪреНрдЪреЗ рд╕рдВрдХреЗрдд рдмрд░рд╛рдмрд░ рд╣реЛрдВрдЧреЗ (928efca1 рдореЗрдВ рддрдп рдХрд┐рдП рдЧрдП)ред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдореЗрдВ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдВрддрд░ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рдерд╛ред
  2. Sys / sgx / rwlock.rs рдореЗрдВ , рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ const fn new() рдХрд╛ рдмрд┐рдЯ рдкреИрдЯрд░реНрди C рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдЗрдирд┐рд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рдореИрдВ zeroed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ set рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдкрд░рд╡рд╛рд╣ рдордд рдХрд░реЛ" рдмрд┐рдЯреНрд╕ рд╣реИрдВ 0. рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ ред
  1. рдЕрдЧрд░ out.get_mut() as *mut _ ! = out.as_mut_ptr() рд╣реЛ рддреЛ рдореИрдВ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА ++ ish рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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)
};

рдорд┐рд░реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЕрдм рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдХреНрд╕реЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЦреБрдж рд╣реА рдзреНрд╡рдирд┐ рд╣реИ)ред

@ рдирд┐рдореЛ 157 рдЖрдкрдХреЛ into_inner рд╣реЛрдиреЗ рдкрд░ рдЙрд╕реА рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

@Pixix рдкреНрд░рд╛рд░рдВрдн рдХреЗ рдмрд╛рдж рдорд╛рди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ 100 рдПрдордмреА рдмрдлрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рд▓рд┐рдЦрддреЗ рд╣реБрдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЛ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдмреЙрдХреНрд╕ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдкреАрдЖрдИ fn uninit_boxed<T>() -> Box<MaybeUninit<T>> рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

box рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрд╕рд┐рдВрдЪрд┐рдд рд╣реАрдк рд╕реНрдерд╛рди рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ into_initialized рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ: рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

@ рдирд┐рдореЛ 157 рд╢рд╛рдпрдж рдирдХрд▓ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИред

@ Nemo157

рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ MaybeUninit<T> рдХреЛ T рдХреЗ рд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ рдХреА рдЧрд╛рд░рдВрдЯреА рдереА рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдвреЗрд░ рдкрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджреЗрдВред рдЖрд░рдВрднрд┐рдХ рдореВрд▓реНрдп,

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдЖрдк рдорд╛рдиреНрдп рд╣реИрдВ, рдХреБрдЫ рджреЛрд╣реЛрдВ рдХреЗ рд╕рд╛рде:

  • рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкреНрд░рдХрд╛рд░ (рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдореЗрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЛ ptr::write_unaligned рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • рдпрджрд┐ рдЕрдзрд┐рдХ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рддрдм рддрдХ рдЯреА рддрдХ рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдлрд╝реАрд▓реНрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рди рд╣реЛ рдЬрд╛рдПрдВ ред

рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рднреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд-рдЗрди-рдмрд┐рд▓реНрдбрд░ рдмрд┐рд▓реНрдбрд░ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░реАрдж-рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@Pzixel рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рд╣реИ рддреЛ рдПрдХ рдмрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ рд╕рдВрдХрд▓рдХ рдХреЙрдкреА рдХреЛ рдЦрддреНрдо

@nicoburns рд╣рд╛рдБ, рдореИрдВ рдЗрд╕реЗ рдЕрдм рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ #[same_layout] рдпрд╛ #[elide_copying] , рдпрд╛ рд╡реЗ рджреЛрдиреЛрдВ, рдпрд╛ рдХреБрдЫ рдФрд░, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ transmute ред рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрддрд┐рд░рд┐рдХреНрдд рдирдХрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП into_constructed рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрджрд▓ рджреЗрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛, рди рдХрд┐ рдХреЗрд╡рд▓ рдЙрди рд╕реНрдорд╛рд░реНрдЯ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЙрдХреНрд╕ рдкрдврд╝рддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ рдЬреЛ into_constructed рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдкреА рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди @ Nemo157 рд╕рд┐рд░реНрдл transmute рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдареАрдХ рд╣реИред рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ into_constructed рдПрдХ рд╣реА рдХрд╛рдо рди рдХрд░ рд╕рдХреЗред

рдЕрдЧрд░ out.get_mut() as *mut _ ! = out.as_mut_ptr() рд╣реЛ рддреЛ рдореИрдВ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА ++ ish рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

get_mut() рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдореИрдВрдиреЗ рдКрдкрд░ рдПрдХ рд╕рдорд╛рди рдмрд┐рдВрджреБ рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ get_mut() рдФрд░ get_ref() рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ / рдЧрд▓рддреА рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ as_ptr() рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реЛрдиреЗ рдХрд╛ рднреНрд░рдо рджреЗрддреЗ рд╣реИрдВ) as_mut_ptr() , рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ)ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡реЗ API рдХреЗ рд╕рдмрд╕реЗрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ @RalfJung рдиреЗ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ (рджреЗрдЦреЗрдВ: 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 рдореЗрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рдЪрд░реНрдЪрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред)

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡реЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдмрд╕реЗрдЯ рдореЗрдВ _not_ рд╣реИрдВ рдЬреЛ @RalfJung рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ

рд╕рд╣реА рдмрд╛рддред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ MaybeUninit рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛? ( MaybeUninit::frozen() , MaybeUninit::abitrary() рдпрд╛ рд╕рдорд╛рди)ред

рд╣рд╛рдБ! рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдЬрдм рдПрдХ рдореВрд▓ MaybeUninit рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ ptr::freeze рдЙрддрд░рд╛ рд╣реИред

рдЙрд╕ рдиреЛрдЯ рдкрд░, рдРрд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреНрдпрд╛ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ "рдлреНрд░реЛрдЬрди" рдореЗрдореЛрд░реА рдХреЗ рдмрдЬрд╛рдп "рдЕрдирдЗрдВрд╕реНрдЯрд╛рд▓реНрдпреВрдЯреЗрдб" рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдзреНрдпрдпрди рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрдореНрдореАрдж рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреА рд▓рд╛рдЧрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ LLVM рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреЛ рдпрд╣ рдЕрдиреНрдпрдерд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

(рд╕рдордп рдорд┐рд▓рдиреЗ рдкрд░ рдореИрдВ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рднреА рдЖрдКрдВрдЧрд╛ред)

@Pixix рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдореЗрдВ рд╕реАрдзреЗ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИ, рд░рд╕реНрдЯ рдиреЗ рджреЛ RFC рдХреЛ рдРрд╕реА рдЪреАрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ (4 рд╕рд╛рд▓ рдкрд╣рд▓реЗ!), рд▓реЗрдХрд┐рди рд╡реЗ рддрдм рд╕реЗ рдЕрди-рд╕реНрд╡реАрдХреГрдд рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВ! (рд╕рд┐рд╡рд╛рдп box рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореИрдВрдиреЗ рдКрдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ)ред рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ i.rl.o рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реЛрдЧреАред

рдЬреИрд╕рд╛ рдХрд┐ @nicoburns рдореЗрдВ MaybeUninit рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдо-рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдПрдкреАрдЖрдИ рдХреА рдХрд┐рд╕ рддрд░рд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рд╕реЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ MaybeUninit рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ рдирд┐рдореЛ 157 рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡

@jethrogb рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдЕрднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

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 рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИ! рдореИрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВ рдХрд┐ ...)

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рд▓рд┐рдЦрддреЗ рд╣реБрдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЛ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдмреЙрдХреНрд╕ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдкреАрдЖрдИ fn uninit_boxed<T>() -> Box<MaybeUninit<T>> рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ , рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЙрд╕ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдФрд░ рдлрд┐рд░ рд╣рдо рд╢рд╛рдпрдж zeroed_box рдЬреИрд╕рд╛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реНрдЯреИрдХ рд╕реНрд▓реЙрдЯ рдХреЛ рдЬрд╝реАрд░реЛрдЗрдВрдЧ рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ ... рдореБрдЭреЗ рдпрд╣ рд╕рдм рджреЛрд╣рд░рд╛рд╡ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред : /

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ / рдмрд╛рдж рдореЗрдВ, рдХреБрдЫ рд▓реЛрдЧ рдЬреЛ рдвреЗрд░ рдкрд░ рдПрдХрддрд░рдлрд╛ рдореЗрдореЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП usecases рд╣реИрдВ (рдореВрд▓ рд░реВрдк рд╕реЗ, Box рдФрд░ MaybeUninit ) рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВ рдФрд░ рдиреНрдпреВрдирддрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ рдЙрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдПрдкреАрдЖрдИ рд╡рд┐рд╕реНрддрд╛рд░ред @ рд╣реЗрдбреНрдбреА рдиреЗ рднреА mem::uninitialized рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЬрдЧрд╣ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ (рдЬреИрд╕реЗ-рдмрд╣реБрдд рдмрдбрд╝рд╛-рдкрд╣рд▓реЗ рд╕реЗ рд╣реА) рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗред

рдореЗрд░реА рдЦреБрдж рдХреА рдмрд┐рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: рдореИрдВ рдЖрдорддреМрд░ рдкрд░ MaybeUninit<T> рдЦреБрд╢ рд╣реВрдВред рдореБрдЭреЗ рдХреЛрдИ рдмрдбрд╝реА рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ mem::uninitialized рддреБрд▓рдирд╛ рдореЗрдВ рдлреБрдЯрдЧрди рд╕реЗ рдХрдо рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИред const new рдФрд░ uninitialized рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдЪреНрдЫреА рд╣реИрдВред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдзрд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓ рдереАрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕рдордЭрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ const fn рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ const рд╣реЛрдиреЗ рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВ T рдФрд░ MaybeUninit<T> рд▓рд┐рдП "рд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ" рд╕реЗ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдЧрд╛рд░рдВрдЯреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ ABI- рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ, #[repr(transparent)] , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА) рдФрд░ FFI- рд╕реБрд░рдХреНрд╖рд┐рдд (рдпрд╛рдиреА, рдпрджрд┐ T FFI- рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ , рддреЛ MaybeUninit<T> FFI- рд╕реБрд░рдХреНрд╖рд┐рдд рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред (рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ #[repr(transparent)] рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЖрдХрд╛рд░ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ (рдЬреИрд╕реЗ рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ MaybeUninit<T> рдХрд╛ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ (рд▓реЗрдХрд┐рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдШрдмрд░рд╛рдПрдВ рдирд╣реАрдВ)ред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЦреБрд╢ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рдЦреВрдВрдЧрд╛ рдФрд░ рдЕрднреА рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

@mjbshaw рдзрдиреНрдпрд╡рд╛рдж!

рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпреВрдирд┐рдпрдиреЛрдВ рдкрд░ #[repr(transparent)] рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЖрдХрд╛рд░ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ (рдЬреИрд╕реЗ рд╣рдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореМрдЬреВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ MaybeUninit рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдмрд┐рдирд╛ рджрд┐рдорд╛рдЧ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА rustc рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ ( MaybeUninit<T> рдЬрд┐рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рде ABI-рд╕рдВрдЧрдд рд╣реИ T , рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред)

рд╕рднреА рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ RFC рд▓рд┐рдЦрдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдирд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЪреЗрдХ рдЬреЛрдбрд╝реЗ рд╣реИрдВ, рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ repr(transparent) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдЧреИрд░-ZST рдХреНрд╖реЗрддреНрд░ рд╣реЛред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? : рдбреА

рд╕рднреА рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ RFC рд▓рд┐рдЦрдирд╛ рдФрд░ рдЙрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдирд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдЪреЗрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдЬреЛ repr(transparent) рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЧреИрд░-ZST рдХреНрд╖реЗрддреНрд░ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? : рдбреА

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдкреВрдЫреЛ рдФрд░ рддреБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛!

Cc https://github.com/rust-lang/rust/pull/58468

рдпрд╣ рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ maybe_uninit рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реАрдЪрд░ рдЧреЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреАрдЖрд░ рд╕рднреА рдЙрддрд░реЗ, рдФрд░ 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 рдкрджреНрдзрддрд┐ рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИред рд╢рд╛рдпрдж рд╣рдо рдпрд╣рд╛рдВ рдирдХрд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

ЁЯШЙ

рд╡рд┐рдзрд┐ take Option рдХрд╛ рдЕрдиреНрдп рдЕрд░реНрде рд╣реИред 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 рд╡рд┐рдкрд░реАрдд, рдпрд╣ рджреЛ рдмрд╛рд░ рдЯреЗрдХ-рдЗрди рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, Copy рдкреНрд░рдХрд╛рд░ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Copy рдорд╛рди рдЬреИрд╕реЗ None as Option<Box<T>> ) рдХреЗ рд▓рд┐рдП, рджреЛ рдмрд╛рд░ рд▓реЗрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИ! рддреЛ, take рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдкрдХрдбрд╝ рдирд╣реАрдВ рд╣реИред

рд╣рдо рдЗрд╕реЗ read_initialized() рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдордп рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ as_ptr().read() рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╣реИред

x.as_ptr().read() MaybeUninit _semantically_ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рдЕрд╕рдВрд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЕрд╕рдорд╛рди рдореВрд▓реНрдп рдЙрд╕реА рдмрд┐рдЯ-рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

MaybeUninit рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рдХрдерди рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реВрдВред рдЯреАрдмреАрдПрдЪ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл MaybeUninit рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдЕрдиреНрдп рдкрд░рд┐рдЪрд╛рд▓рди рдкреНрд░рднрд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рд╣рдореНрдо, рд╢рд╛рдпрдж "рд╢рдмреНрджрд╛рд░реНрде" рдпрд╣рд╛рдБ рдЧрд▓рдд рд╢рдмреНрдж рд╣реИред рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓реНрдп рдлрд┐рд░ рд╕реЗ рдЕрдирдзрд┐рдХреГрдд рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╕рдордЭ рдирд╣реАрдВ рд▓реЗрддреЗ рдХрд┐ рдкреНрд░рдХрд╛рд░ Copy )ред

рдпрджрд┐ рдЖрдк рдХрднреА рднреА рдХрдЪреНрдЪреЗ рдкрд░рд┐рдЪрд╛рд▓рди рдкреНрд░рднрд╛рд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рдЗрдВрдЯрд░реИрдХреНрд╢рди рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рдкрдврд╝реА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреНрдп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдорд┐рд░реА рдЕрднреА рднреА рдЕрд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдХреА 0 рд▓рдВрдмрд╛рдИ рд░реАрдбреНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ)ред

@RalfJung рдореЗрд░реЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ static mut рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдореИрдВ рдПрдХ рд╕реНрдереИрддрд┐рдХ рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ into_uninitialized рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

@Amanieu рдореИрдВ рдХреНрдпрд╛ рдкреВрдЫ рд░рд╣рд╛ рдерд╛, рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ x.take_initialized() x.as_ptr().read() рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ?

@ Nemo157

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдорд┐рд░реА рдЕрднреА рднреА рдЕрд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдХреА 0 рд▓рдВрдмрд╛рдИ рд░реАрдбреНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдПрдХрддрд░рдлрд╛ рдореЗрдореЛрд░реА рдХреА рдПрдХ 0-рд▓рдВрдмрд╛рдИ рдкрдврд╝реА рдЧрдИ рдпреВрдмреА рдХрднреА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд┐рд░реА рдЙрдирдХреА рдкрд░рд╡рд╛рд╣ рдХреНрдпреЛрдВ рдХрд░реЗрдЧрд╛?

рдпрджрд┐ рдЖрдк рдХрднреА рднреА рдХрдЪреНрдЪреЗ рдкрд░рд┐рдЪрд╛рд▓рди рдкреНрд░рднрд╛рд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рдЗрдВрдЯрд░реИрдХреНрд╢рди рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рдкрдврд╝реА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреНрдп рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдирдзрд┐рдХреГрдд рдореЗрдореЛрд░реА рдХреЛ рдкрдврд╝реЗ, рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП MaybeUninit::zeroed().into_initialized() рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред
рдпрд╣рд╛рдВ "рдЕрдЬреАрдм рдЗрдВрдЯрд░реИрдХреНрд╢рди" рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдорд╛рди рдмрдирд╛рдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рдерд╛ред рдпрд╣ рд╕рдм Spartacus рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдФрд░ рд╡реИрдзрддрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ read_initialized() рдмреЗрд╣рддрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдареАрдХ рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рдпрд╣ рдорд╛рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ)ред рдпрд╣ рдЕрднреА рднреА MaybeUninit рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдмрд┐рдЯ рдкреИрдЯрд░реНрди рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИред

@RalfJung рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ MaybeUninit рдХреЛ Option рд░реВрдк рдореЗрдВ рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЯреИрдЧ рдХреЗ рдмрд┐рдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдкрд╣рд▓реЗ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрдЫреВрддрд╛-рд╡рд┐рдХрд▓реНрдк рдЯреЛрдХрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЗрд╕рдореЗрдВ рдпреВрдирд┐рдпрди рд╕реЗ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП take рд╡рд┐рдзрд┐ рд╣реИред

@Amanieu @shepmaster рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/58660 рдореЗрдВ read_initialized рдЬреЛрдбрд╝рд╛ ред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ take_initialized рд╕реЗ рдмреЗрд╣рддрд░ рдирд╛рдо рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ?

рдкреАрдЖрд░ рдХреБрдЫ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реИ!

рдореИрдВ 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 рдЬреЛрдбрд╝рд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рд╕реЗ рджреВрд░ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдо рдкрд╣рд▓реЗ "рдХреЛрд░ рдПрдкреАрдЖрдИ" рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде (рдФрд░ Box ) рдмрд╛рддрдЪреАрдд рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ set рд╕реЗ write рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, ptr::write рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдПрдХ рд╣реА рдирд╕ рдореЗрдВ, read_initialized рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл read рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ? рдпрджрд┐ рдЪрд┐рдВрддрд╛ рдЖрдХрд╕реНрдорд┐рдХ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рдЫрд┐рдкреА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд MaybeUninit::read(&mut v) ? рдПрдХ рд╣реА write , рдпрд╛рдиреА MaybeUninit::write(&mut v) рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рдпреЛрдЬреНрдп рдФрд░ рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреЗ рдмреАрдЪ рд╣реИ, рдФрд░ рдпрджрд┐ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЗ рдореЗрдВ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЬрдм рддрдХ рдХрд┐ рдЗрди рдПрдкреАрдЖрдИ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдПрдХ рдирдВрдЧреЗ рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рдд 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 рдХреЛ рд╣рд▓ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ ...

рдПрдХ рдиреНрдпреВрдирддрдо рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░, рдпрд╛рдиреА new , uninitialized , zeroed , as_ptr , as_mut_ptr

рдореЗрд░реА рдпреЛрдЬрдирд╛ into_initialized , set / write , рдФрд░ read_initialized рдЙрд╕ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдереАред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? set / write рдФрд░ read_initialized рдмрд╛рдХреА рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдм рдкрд╣рд▓реЗ рдмреИрдЪ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдУрд░ рднреА рдЭреБрдХрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╢реБрд░реВ рд╕реЗ into_initialized рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдЖрдИрдПрдордУред

рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╣реИ, MaybeUninit::read(&mut v) ? рд╡рд╣реА write рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА MaybeUninit::write(&mut v) рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдПред

рдкрд╣рд▓реЗ рдпрд╣рд╛рдВ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рдЙрд╕рдореЗрдВ рд╕реЗ рд╣рдо Deref рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░рдг рд╕реЗ рдкреВрд░реНрд╡рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ read_initialized рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл read рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ?

рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрди! рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдпрд╣ into_initialized рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рдерд╛ред рд▓реЗрдХрд┐рди into_inner рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдпрд╣ рдЕрд╡рд▓реЛрдХрди рдЦреЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, read рдмрд╣реБрдд рдХрдо рдЖрдо рд╣реИред рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП initialized рдХреЗ рдмрдЬрд╛рдп into_initialized ? рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк ...

рдкрд╣рд▓реЗ рдпрд╣рд╛рдВ рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рдЙрд╕рд╕реЗ рд╣рдо Deref рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░рдг рд╕реЗ рдкреВрд░реНрд╡рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

ptr::read рдФрд░ ptr::write рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВред рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА MaybeUninit::read рдФрд░ MaybeUninit::write MaybeUninit::read рдкрдХреНрд╖ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдЯ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдареАрдХ рд╣реИ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рд╡рд╣рд╛рдБ 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 рдХреНрдпрд╛ Cell рдХреА рддрд░рд╣ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ &mut MaybeUninit<[T]> рд▓рд┐рдП рдФрд░ &mut [MaybeUninit<T>] рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╣реИрдВ?

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ:

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 рдХрд╣реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд╛рдо рд╕реБрдЭрд╛рдП рдЧрдП рд╣реИрдВ:

  1. set -> write ред .as_ptr().read() рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд░реВрдкрдХ "рдкрдврд╝рд╛" рд▓рдЧрддрд╛ рд╣реИ, "рдирд╣реАрдВ" рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреВрд░рдХ ( .as_ptr_mut().write() ) "рд▓рд┐рдЦрдирд╛" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, "рд╕реЗрдЯ" рдирд╣реАрдВред
  2. read_initialized -> read ред рдиреАрд▓реА write рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдХреНрдпрд╛ рдпрд╣ (рдкреНрд▓рд╕ рдкреНрд░рд▓реЗрдЦрди) рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдВрднрд┐рдХ рд╣реИ? рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдордЭреМрддреЗ рд╣реБрдП рдХрд┐ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд into_inner рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ into_initialized ред
  3. into_initialized -> initialized ред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ read_initialized рдФрд░ into_initialized , рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рд░рддрд╛ IMO рд╣реИ - рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ read , рддреЛ into_initialized рдереЛрдбрд╝рд╛ рдмрд╛рд╣рд░ рдЪрд┐рдкрдХ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦрдкрдд рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ into_* рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИред

(1) рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдкрддреНрддрд┐? рдФрд░ рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ (3) рдХреЗ рдЦрд┐рд▓рд╛рдл рдЭреБрдХ рд░рд╣рд╛ рд╣реВрдВред рдХреЗ рд▓рд┐рдП (2) рдореИрдВ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реВрдВ: read рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди read_initialized IMO рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдФрд░ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕ рдЬрдЧрд╣ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рдЪрд╛рд░, рд░рд╛рдп?

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рднреА рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ RFC рдХреЛ

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ offset_of! рд▓рд┐рдП рдкреНрд▓рдЧ рд▓рдЧрд╛рдпрд╛ рд╣реИ? :)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ read_initialized рдХреА рдПрдХ рд╕рдЦреНрдд superset рд╣реИ into_initialized (рд▓реЗрддрд╛ рд╣реИ &self рдХреЗ рдмрдЬрд╛рдп self )ред рдХреНрдпрд╛ рдпрд╣ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ?

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ offset_of! рд▓рд┐рдП рдкреНрд▓рдЧ рд▓рдЧрд╛рдпрд╛ рд╣реИ? :)

рдпрджрд┐ рдЖрдк рдореЗрд░реЗ RFC рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред ;)

рдХреНрдпрд╛ рдпрд╣ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ?

IMO рд╣рд╛рдБред into_initialized рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЛ рдмрд╛рд░ рд╕рдорд╛рди рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рдЗрд╕реЗ 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 рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдФрд░ рд╡рд┐рдзрд┐ рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рджрд░реНрджрдирд╛рдХ рдЕрд╕рдВрдЧрддрд┐ рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рдмрд╕ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ "рдЬрдВрдЧ рдПрдкреАрдЖрдИ рд╕рдВрдХреНрд╖рд┐рдкреНрдд / рд▓рдВрдмреЗ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ" рдФрд░ рдпрд╣реА рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрддреАрдХрд░рдг рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рд╣рд░ рдЬрдЧрд╣ рд▓рдВрдмреЗ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рджрд┐рди рдХрд╣рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдПрдХ рдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ IMO рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╣реИред рдЬрдВрдЧ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░реВрдкреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ Uninit<T> рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ .into_init() рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ into_initialized() рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд░рд╣рд╛ рд╣реИред рдореИрдВ take_initialized() рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдЕрдиреНрдп take рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдЫреВрдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ, рд╢рдмреНрджрд╛рд░реНрде рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдЙрдзрд╛рд░ / рдЪрд╛рд▓ рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЙрдзрд╛рд░ рд╣реЛрдиреЗ рдХреА рдХреЛрдИ рдкреВрд░реНрд╡рддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ move_initialized рдпрд╛ consume_initialized ред

set() write() , рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ write() рдХрд╛ рдкрдХреНрд╖ рд▓реЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ as_ptr().write() рдХреЛ рд╕рдорд╛рдирддрд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЙрдкрдирд╛рдо рд╣реЛрдЧрд╛ред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдЧрд░ рдХреЛрдИ take_initialized() рдпрд╛ рд╕рдорд╛рди рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореИрдВ read_initialized() read() рдкрдХреНрд╖ рдкреВрд░реНрд╡ рдХреЗ рдЧрд╡рд╛рд╣ рдХреЗ рдХрд╛рд░рдг рджреЗрддрд╛ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ as_ptr().write() рдФрд░ as_ptr().read() рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд░рд╣рдирд╛ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ DANGER DANGER рдорд╛рдирд╕рд┐рдХ рд╕рд░реНрдХрд┐рдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

@gnzlbg рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдерд╛ FCP рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ "init" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ MaybeUninit::uninit() рдФрд░ x.into_init() ред

рдореБрдЭреЗ into_initialized() рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд░рд╣рд╛ рд╣реИред

into рд╡рд┐рдзрд┐рдпрд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕рдорд╛рди (рд╕реНрд╡рд╛рдорд┐рддреНрд╡) рдбреЗрдЯрд╛ рджреЗрдЦрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди into_vec рд╡рд┐рдзрд┐рдпрд╛рдБ рджреЗрдЦреЗрдВред

рдореИрдВ take_initialized(&mut self) (in_init рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд) рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ 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 ред

рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рджреЛ рдХрд╛рд░реНрдп рдПрдХ рд╣реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ undef рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдкреИрд░ рдореЗрдВ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рддрд░реАрдХреЗ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред @jethrogb рдЖрдкрдиреЗ рдХреЛрдИ рдкреНрд░реЗрд░рдгрд╛ рдирд╣реАрдВ рджреА рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

рдореИрдВ take_initialized(&mut self) (in_init рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд) рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ undef рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рдерд╛ take_initialized(self) рдХреЗ рдмрдЬрд╛рдп into_initialized(self) , рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡ рдирд╛рдо рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рдлрд┐рд░ рд╕реЗ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ take рдЖрдорддреМрд░ рдкрд░ &mut self рдФрд░ into рдЖрдо рддреМрд░ рдкрд░ self рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рд╕рдЯреАрдХ рдирд╛рдордХрд░рдг, рд▓рдЧрд╛рддрд╛рд░ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдирд╛рдордХрд░рдгред рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕реЗ move_initialized рдпрд╛ transmute_initialized ред

рдФрд░, рдлрд┐рд░ рд╕реЗ, v.write() рдФрд░ v.read_initialized() , рдореБрдЭреЗ v.as_ptr().write() рдФрд░ v.as_ptr().read() рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдИ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдмрд╛рдж рдХреЗ рджреЛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд▓рдЧрддреА рд╣реИред

рдФрд░, рдлрд┐рд░ рд╕реЗ, v.write() рдФрд░ v.read_initialized() , рдореБрдЭреЗ v.as_ptr().write() рдФрд░ v.as_ptr().read() рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдИ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдмрд╛рдж рдХреЗ рджреЛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд▓рдЧрддреА рд╣реИред

v.write() (рдпрд╛ v.set() рдпрд╛ рдЬреЛ рднреА рд╣рдо рдЗрд╕реЗ рдЗрди рджрд┐рдиреЛрдВ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ) рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред v.as_ptr().write() рдХреЛ unsafe рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ v.read_init() vs v.as_ptr().read() рд╕рд╣рдордд рд╣реВрдБред v.read_init() рд╕рддрд╣реА рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ in_initialized (рд╕реНрд╡) рдХреЗ рдмрдЬрд╛рдп take_initialized (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 рдХреЗ _safety рдХреЗ Invantant_ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ , рдФрд░ рднреЗрдж рд╕реВрдХреНрд╖реНрдо рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ 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 рдмрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рдХрд┐ AlwaysTrue рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд╕рдкрд╛рд╕ "рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ" рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдХреЗред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рджрд░реНрджрдирд╛рдХ рдХрд╖реНрдЯрджрд╛рдпреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреАрдЫрд╛ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред MaybeUninit рд▓рдХреНрд╖реНрдп рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рдФрд░ рдЕрдорд╛рдиреНрдп рдореЗрдореЛрд░реА рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЪреЗрд╣рд░реЗ рдореЗрдВ рдЗрди рднреЗрджреЛрдВ рдХреЛ рдбрд╛рд▓реЗ рдмрд┐рдирд╛ред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЗрди рдЕрдВрддрд░реЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдЪреЗрд╣рд░реЗ рдкрд░ рдирд╣реАрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рднреЗрдж рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ MaybeUninit рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдЕрдиреНрдпрдерд╛ рд▓реЛрдЧ fn improperly_uninitialized() -> AlwaysTrue рдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд fn fn improperly_uninitialized() -> AlwaysTrue рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╕ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд AlwaysTrue рдХреНрдпреЛрдВрдХрд┐ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝" рдХрд┐рдпрд╛ рд╣реИред

рдПрдХ рдмрд╛рдд Invalid<T> рдФрд░ Unsafe<T> рджреЛ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, ValidityCheckeable рдФрд░ UnsafeCheckeable , рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, ValidityCheckeable::is_valid(Invalid<Self>) UnsafeCheckeable::is_safe(Unsafe<Self>) , рдФрд░ рдЙрди рдкрд░ Invalid::into_valid рдФрд░ Unsafe::into_safe рд╡рд┐рдзрд┐рдпрд╛рдБ assert_validity! рдФрд░ assert_safety! ред

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕рд┐рд░реНрдл рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ in_init рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдорд╛рди T рдХреА рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЯреА рдХреЛ рд╢рдмреНрдж рдХреЗ рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрде рдореЗрдВ "рдЖрд░рдВрднреАрдХреГрдд" рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рд╣реИред

рдпрд╣ рд╕рд╣реА рд╣реИред OTOH, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб" рдкрд╣рд▓реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░реЙрдХреНрд╕реА рд╣реИред

рдЕрдиреНрдпрдерд╛ рд▓реЛрдЧ fn рдХреЛ рдЕрдиреБрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ_рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд () -> AlwaysTrue рдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд fn рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдмрд╕ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд OneTrue рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдареАрдХ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝" рдХрд┐рдпрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдареАрдХ рд╕реЗ "рдЖрд░рдВрднреАрдХреГрдд" рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЗрди рджреЛрдиреЛрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрдЪрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХреНрдпрд╛ рд╣реЛрдЧреА), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдпрд╣ рдХрд╣реЗрдЧрд╛ рдХрд┐ improperly_uninitialized рдареАрдХ рдирд╣реАрдВ рд╣реИ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред "рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝рдирд╛" рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рддрдм рдЙрдарддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ "рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╕рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдп рдРрд╕реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдЙрдиреНрд╣реЗрдВ рдХрд╣рд░ рдврд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рди рдХрд░ рд╕рдХреЗ"ред

рдПрдХ рдмрд╛рдд рдЕрдорд╛рдиреНрдп рдХреЗ рд╕рд╛рде рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рддрд╣реИ) рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ :: is_safe (рдЕрд╕реБрд░рдХреНрд╖рд┐рдд)), рдФрд░ рдЕрдорд╛рдиреНрдп :: in_valid рдФрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд :: in_safe рд╡рд┐рдзрд┐рдпрд╛рдБ assert_validity! рдФрд░ assert_safety! рдЙрди рдкрд░ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реБрд░рдХреНрд╖рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЬрд╛рдБрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реИрдзрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред (рдЦреИрд░, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдереЛрдбрд╝рд╛ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред)

@scottjmaddox

рдПрдХ рдирдП рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЪрд╛рд▓ ..., рдЙрдкрднреЛрдЧ ..., рдпрд╛ рдкреНрд░рд╕рд╛рд░рдг ... рдпрд╛ рдХреБрдЫ рдФрд░? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ in_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() рдпрд╛ whatnot рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реИрд╕реЗ рднреА рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИред рдмреЗрд╢рдХ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдореЙрдбрд▓ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рдордЭреМрддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред Should рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдореЙрдбрд▓ рдХреА рдХреБрдЫ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

assert_init(italized) рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ @eternaleye (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рдХрд╛рд░рдг assume_initialized рднреА рд╣реИред Https://github.com/rust-lang/rust/issues/53491#issuecomment -440730699 рдФрдЪрд┐рддреНрдп рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВ рдЬреЛ рдмрд╣реБрдд рд╕рдореНрдореЛрд╣рдХ рд╣реИрдВред

рдЯреАрдмреАрдПрдЪ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛ рддрд░рд╣ рд╕реЗ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдХреНрдпрд╛ рд╣рдо

рд╣рдореНрдо ... рдпрджрд┐ рд╣рдо рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ

uninit.into_inner(uninit.assert_initialized());

рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдПрдХ рдЯреЛрдХрди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рджрд╛рд╡реЗ рдХреЛ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИред

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдореВрд░реНрддрддрд╛ рд╕рд┐рд░реНрдл рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЧрд▓рддрд┐рдпрд╛рдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рд╣рдордиреЗ @eternaleye (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рдХрд╛рд░рдг

рдореЗрд▓рд╛ред assume_initialized рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╛ рд╢рд╛рдпрдж рдпрд╣ assume_init ? рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, MaybeUninit::uninit() рдмрдирд╛рдо MaybeUninit::uninitialized() - рдФрд░ рд╡рд╣ рдкрд╣рд▓реЗ рдмреИрдЪ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд▓реЗрдЯреЗрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдЙрд╕ рдХреЙрд▓ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@nicoburns рдореБрдЭреЗ рдпрд╣рд╛рдВ рдПрдХ рдЯреЛрдХрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред

рдХреНрдпрд╛ рд╣рдо рдЙрд╕рдореЗрдВ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдВрднрд╡рдд: рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдХреБрдЫ рддреБрд▓рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рд╣реИ?

рдареАрдХ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ "рд╕рд┐рд░реНрдл" MaybeUninit рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ, рд╣реИ рдирд╛? рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рдирд╕рд┐рдХ рдмреЛрдЭ рд╣реИ (рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП), рд╡рд╣рд╛рдБ рдбрдмрд▓-рдЕрд▓рд┐рдЦрд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдЪреБрдирдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рддреЛ рдпрд╣рд╛рдБ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Unsafe рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИред рд╕рдВрдХрд▓рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдПрдирдУрдкреА рд╣реЛрдЧрд╛; рд╕рдВрдХрд▓рдХ рдХрднреА рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ Vec рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛, рдЬрдм рднреА рд╣рдо рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ Unsafe<Vec<T>> рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рд╢рд┐рдХреНрд╖рдг рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЬрдм Vec<T> рдорд┐рд▓реЗрдВрдЧреЗ рддреЛ рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд MaybeUninit рдЬреЛ рдПрдХ рд╕рдВрдХрд▓рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ "рдЦрд╝рд░рд╛рдм" bool рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдЬреА рдХреЛрдб рдореЗрдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ ред

рдЗрд╕рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЧрдд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Unsafe рдХреЛ рдордЬрдмреВрдд рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдпрд╛ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдореИрдВ MaybeUninit рд╕реЗ MaybeInvalid рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, "рдЕрдорд╛рдиреНрдп" рдмреЗрд╣рдж рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ ( рдХрд┐рд╕ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рд╣реИ?), рдореИрдВрдиреЗ "рд╡реИрдз" рдФрд░ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрдХрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рд╣реИ - рдХреЛрдИ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "рдорд╛рдиреНрдп Vec " рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧред рдХрдо рд╕реЗ рдХрдо рдореВрд▓ рд░реВрдк рд╕реЗ "uninitialized" рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕рдВрдШ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ "рд╡реИрджреНрдпрддрд╛ рдЕрдХреНрд░рд┐рдпрд╛рд╢реАрд▓" рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЗрдирд╡реЗрд░рд┐рдпрдВрдЯ" рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП?

рд╕рд╛рде рд╣реА, рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдорд╛рддреНрд░ Unsafe<T> рдЬрдм рддрдХ рд╣рдо рдЗрд╕ рдЖрд╡рд░рдг рдХреЗ рдмрд╛рд╣рд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рди рд╣реЛрдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдордЬрдмреВрдд рд╡реНрдпрд╛рдкрдХ рд╕рдореНрдореЗрд▓рди рдХреЛ рдЕрдкрдирд╛рдиреЗ (рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдирд╣реАрдВ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ рджреНрд╡рд╛рд░рд╛) рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдФрд░ RFC рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЖрдо рд╕рд╣рдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛрдЧрд╛ ( @RalfJung рдиреЗ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рджрд┐рдП), рдФрд░ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХрдордЬреЛрд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде MaybeUninit рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдпреВрдмреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдЯрд╛рдЗрд▓ рд╕рд╡рд╛рд▓ рд╣реИред рдЬреИрд╕реЗ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдореНрдореЗрд▓рди рдХрднреА Rust рд╕рдореБрджрд╛рдп рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдПрдХ RFC рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдбреЙрдХреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рд╣реЛрдВред

рддреЛ IMO рдЬреЛ рдХреЛрдИ рднреА рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рдореНрдореЗрд▓рди рдореЗрдВ MaybeUninit API рдХреЛ рдХрд╛рдЯрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝реА рдордЫрд▓реА рд╣реИ, рдФрд░ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рдФрд░ рджреЗрд░реА рди рдХрд░реЗрдВ рдФрд░ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдпрджрд┐ рд╣рдо MaybeUninit<T> -> T рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдХреА рд░рд╕реНрдЯ рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА MaybeUninit<Unsafe<T>> рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкрд╣рд▓реЗ рдЧреИрд░-рдкрдВрдЬреАрдХреГрдд рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдВрднрд╡рддрдГ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

@RalfJung

рдпрд╛ рд╢рд╛рдпрдж рдпрд╣ assume_init ? рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, MaybeUninit::uninit() рдмрдирд╛рдо MaybeUninit::uninitialized() - рдФрд░ _that_ рдХреЛ рдкрд╣рд▓реЗ рдмреИрдЪ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдЙрд╕ рдХреЙрд▓ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдк, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ -> T рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде 3-рддрд░рд┐рдХреЗ рд╕рдВрдЧрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛрдЧреАред рдЬреИрд╕рд╛ рдХрд┐ -ialized рдкреНрд░рддреНрдпрдп рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ::uninit() рдФрд░ .assume_init() рд╢рд╛рдпрдж рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ "рд╕рд┐рд░реНрдл" MaybeUninit , рд╕рд╣реА рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рд╣реИ?

рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ... рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ foo.assume_init().assume_safe() (рдпрд╛ foo.init().safe() рдЕрдЧрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрдиреЗ рдХреА рдЗрдЪреНрдЫреБрдХ рд╣реИ) рд╕рдм рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд┐ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣рдо рд╕рдВрдпреЛрдЬрди рдХреЛ foo.assume_init_safe() рд░реВрдк рдореЗрдВ рднреА рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЕрднреА рднреА рд▓рд╛рдн рд╣реИ рдХрд┐ рдпрд╣ рджреЛ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рдордВрддреНрд░ рджреЗрддрд╛ рд╣реИред

рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рдирд╕рд┐рдХ рдмреЛрдЭ рд╣реИ (рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП), рд╡рд╣рд╛рдБ рдбрдмрд▓-рдЕрд▓рд┐рдЦрд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдЪреБрдирдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рддреЛ рдпрд╣рд╛рдБ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЬрдЯрд┐рд▓рддрд╛ рд╡реИрдзрддрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдкреАрдЫреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рд╕реЗ рдЖрддреА рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдРрд╕рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдирд╕рд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдереЛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Unsafe рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИред рд╕рдВрдХрд▓рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдПрдирдУрдкреА рд╣реЛрдЧрд╛; рд╕рдВрдХрд▓рдХ рдХрднреА рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдЬрд╝рд░реВрд░; рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ рдХрд┐ рдПрдХ рд╕рдВрдХрд▓рдХ POV рд╕реЗ рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИред рднреЗрдж рд╕реЗ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ "рд╕рддреНрд░ рдкреНрд░рдХрд╛рд░" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред

рдЗрд╕рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЧрдд рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Unsafe рдХреЛ рдордЬрдмреВрдд рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдпрд╛ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдЬрд┐рд╕ рдкрд╣рд▓реВ рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рд╛, рд╡рд╣ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдерд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рддрд┐рдпрд╛рдБ рддрдм рд╣реЛрддреА рд╣реИрдВ рдЬрдм рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ .assume_init() рдорддрд▓рдм рд╣реИ рдХрд┐ "рдареАрдХ рд╣реИ; рдореИрдВрдиреЗ рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдФрд░ рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ T "ред MaybeUninit<T> рдХреА рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ Unsafe<T> рдФрд░ Invalid<T> рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рджреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧрд╛рд╡, рдЙрдирдХреЗ рдирд╛рдо, рдЬреЛ рд╢реИрдХреНрд╖рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдРрд╕реЗ рдФрд░ рднреА рддрд░реАрдХреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЧреЛрдорд╛рдВрд╕ рдбрд╛рд▓рдирд╛ рдЬреЛ рдореМрдЬреВрджрд╛ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдЗрд╕рдХреА рднрд░рдкрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

I _can_ MaybeUninit рд╕реЗ MaybeInvalid рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, "рдЕрдорд╛рдиреНрдп" рдмреЗрд╣рдж рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ (_what_? рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп), рдореИрдВрдиреЗ "рд╡реИрдз" рдФрд░ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрдХрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рд╣реИ - рдХреЛрдИ рдпрд╣ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "рдорд╛рдиреНрдп Vec " рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧред рдХрдо рд╕реЗ рдХрдо рдореВрд▓ рд░реВрдк рд╕реЗ "uninitialized" рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕рдВрдШ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ "рд╡реИрджреНрдпрддрд╛ рдЕрдХреНрд░рд┐рдпрд╛рд╢реАрд▓" рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ "рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЗрдирд╡реЗрд░рд┐рдпрдВрдЯ" рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП?

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ "рд╡реИрдзрддрд╛" рдФрд░ "рд╕реБрд░рдХреНрд╖рд╛" рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реВрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ "рд╡реИрдз" рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рднреНрд░рдорд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рдореИрдВ "рд╕реБрд░рдХреНрд╖рд╛" рдХреЗ рд▓рд┐рдП "рд╡реИрдзрддрд╛" рдФрд░ "рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп" рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ "рдорд╢реАрди рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ" рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рд░рд╣рд╛ рд╣реВрдВред

@rkruppe

рддреЛ IMO рдЬреЛ рдХреЛрдИ рднреА рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рдореНрдореЗрд▓рди рдореЗрдВ MaybeUninit API рдХреЛ рдХрд╛рдЯрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝реА рдордЫрд▓реА рд╣реИ, рдФрд░ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рдФрд░ рджреЗрд░реА рди рдХрд░реЗрдВ рдФрд░ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдпрджрд┐ рд╣рдо MaybeUninit<T> -> T рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдХреА рд░рд╕реНрдЯ рдкреАрдврд╝реА рдЕрднреА рднреА 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 () рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ "рдареАрдХ рд╣реИ; рдореИрдВрдиреЗ рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИ рдФрд░ рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЯреА рд╣реИ"ред

рдореИрдВ рдЗрд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рдХрд┐рд╕реА рддрд░рд╣ "рдореИрдВ рдкреНрд░рд╛рд░рдВрдн рд╣реИ рдпрд╣ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд▓рдЧрддрд╛ рд╣реИ Vec<i32> рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рднрд░рд╛ рджреНрд╡рд╛рд░рд╛ 0xFF , рдЕрдм рдпрд╣ рдЖрд░рдВрдн рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рдХрд┐ рд╕рд╛рдзрди рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдХреНрдХрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"ред рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рдВрдХреЗрдд, рдмреЗрд╣рддрд░ рдареЛрд╕ рдбреЗрдЯрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЧрд▓рддреА рд╣реИ рдЬреЛ рд▓реЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдареЛрд╕ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╣реИ рдХрд┐ рдЬрдм рд╡реЗ рдЕрдЬреНрдЮрд╛рдд рдХреЛрдб рдХреЛ рдбреЗрдЯрд╛ рд╕реМрдВрдкрддреЗ рд╣реИрдВ, рдпрд╛ рдХреБрдЫ рдбреЗрдЯрд╛ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдЪрд╛рд▓рди рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣рд╛рдВ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рд╢рд╛рдВрдд рд╣реЛ рдЧрдИ рд╣реИрдВред рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛:

  • рдореИрдВ MaybeUninit::uninitialized рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП PR рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ MaybeUninit::uninit рдирд╛рдо рджреЗрддрд╛ рд╣реВрдВред
  • рдПрдХ рдмрд╛рд░ рдЬреЛ рдЙрддрд░рд╛ рд╣реИ (рд╕реНрдЯрдбрд╕рд┐рдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдордп рд╣реИ рдЕрдЧрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ), рдореИрдВ MaybeUninit::{new, uninit, zeroed, as_ptr, as_mut_ptr} рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред

рдпрд╣ рдкрддреНрддреЗ set / write , into_init[ialized] / assume_init[ialized] рдФрд░ read[_init[italized]] рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╢реНрди рдЦреЛрд▓рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ assume_init , write рдФрд░ read рдУрд░ рдЭреБрдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдирд┐рд░реНрдгрдп рдХреИрд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПред

  • рдПрдХ рдмрд╛рд░ рдЬреЛ рдЙрддрд░рд╛ рд╣реИ

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реА рдЕрд╡рдзрд┐ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рддреЛ (рдП) рдПрдХ рдбрд┐рдкреНрд░реЗрд╕реЗрд╢рди рдЪреЗрддрд╛рд╡рдиреА рдпрд╛ (рдмреА) рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрд╕рдорд╛рди рдореВрд▓реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдп

рдЬрдм рд╣рдо рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЬрдм рднреА рдбрд┐рдкреНрд░реЗрд╢рди рдХреА рдЪреЗрддрд╛рд╡рдиреА рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рдПрдХ рд╕реНрдерд┐рд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдиреНрдпрдерд╛, рд▓реЛрдЧ рдХреЗрд╡рд▓ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВрдЧреЗред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реА рдЕрд╡рдзрд┐ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рддреЛ (рдП) рдПрдХ рдбрд┐рдкреНрд░реЗрд╕реЗрд╢рди рдЪреЗрддрд╛рд╡рдиреА рдпрд╛ (рдмреА) рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрд╕рдорд╛рди рдореВрд▓реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрдп рдирд╣реАрдВ рд╣реИ?

рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВред рдореИрдВ рдПрдХ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрджрд╕реНрде рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдФрд░ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд░рд╣рд╛ рд╣реВрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ MaybeUninit::uninitialized рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛, mem::uninitialized ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдирд┐рд░реНрдгрдп рдХреИрд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПред

@RalfJung рдмрд╕ рдЗрд╕реЗ (рдФрд░ рдЖрд░? рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рддреЛ рдЖрдк) рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЕрдиреНрдп рдирд╛рдо рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рднреА рд╡рд╕реНрддреБ рдЬреЛ рд╣рдо рдЙрд╕ рдореЗрдВ рд╕реМрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ FCPред :)

рдмрд╕ рдпрд╣ рдХрд░реЛ (рдФрд░ рдЖрд░? рдореБрдЭреЗ рдЕрдЧрд░ рддреБрдо рдкрд╕рдВрдж рд╣реЛ) рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЕрдиреНрдп рдирд╛рдо рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЕрдЧрд░ рдХреЛрдИ рд╡рд╕реНрддреБ рдЬреЛ рд╣рдо рдЙрд╕ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ FCPред :)

рдЦреИрд░, рдореИрдВ рдереЛрдбрд╝рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рд░реАрдХрд░рдг рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдмрдирдирд╛ рд╣реИред

рдПрдХ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдФрд░ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ

рдЖрд╣, рдЧрдЪреНрдЪрд╛ред рддрдм рддрдХ рд▓реЗ рдЬрд╛рдирд╛ред

рд╕рднреА рдЕрдзрд┐рдХрд╛рд░, https://github.com/rust-lang/rust/pull/59284 рдореЗрдВ рдирд╛рдо рдмрджрд▓рдХрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

uninitialized -> рдПрдХрддрд░рдлрд╛
in_initialized -> рдорд╛рди_рдЕрдиреБрдХреВрд▓
read_initialized -> рдкрдврд╝рд╛
рд╕реЗрдЯ -> рд▓рд┐рдЦрдирд╛

рдореБрдЭреЗ рдирдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╛рдо рдкрд╕рдВрдж рд╣реИрдВред рдореИрдВ read рджреБрд░реБрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ into_initialized рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдХрдо рд╣реИ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ ptr::read рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдХреЗ рдХрд╛рд░рдгред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ рдирд╛рдордХрд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

рдореИрдВ IFUninit рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ PR рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ :: {рдирдпрд╛, uninit, zeroed, as_ptr, as_mut_ptr}ред

рдХреЛрдИ рднреА рдореМрдХрд╛ рдЗрд╕реЗ 1.35-рдмреАрдЯрд╛ (~ 2 рд╕рдкреНрддрд╛рд╣ рдореЗрдВ) рдХреЗ рдХрд╛рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП рдереЛрдбрд╝рд╛ рд╡рд┐рд╡рд╛рджрд┐рдд рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╡рд╛ рдореЗрдВ рдХреИрд╕реЗ рд╣реИ https://github.com/rust-lang/rfcs/pull/2582 рдЕрднреА рднреА рд╣реИред : / RFC рдХреЗ рдмрд┐рдирд╛, рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдХреНрд░рдорд┐рдХ рдЖрд░рдВрдн рдЕрднреА рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд░реЗрдВрдЧреЗред
OTOH, MaybeUninit рдиреЗ рдХрд╛рдлреА рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХреНрд░рдорд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд▓реЛрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ MaybeUninit рд╕рд╛рде рдЬреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, https://github.com/rust-lang/rust/pull/59284 рдЕрднреА рднреА рдирд╣реАрдВ рдЙрддрд░рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ 1.35 рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЯреАрдмреАрдПрдЪ рдореИрдВ рдПрдХ рдФрд░ рдЪрдХреНрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдордп рдирдИ рдкрджреНрдзрддрд┐ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓реЗ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╣рд╛рдБ рдХрд┐рд╕реА рднреА рдореМрдХрд╛ рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдпреЛрдВ рдХрд┐ рд╣реИ MaybeInit рд╣реЛ рд╕рдХрддрд╛ рд╣реИ const ?

init рдФрд░ new const ред zeroed рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдХреБрдЫ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ const рд╣реЛ рдЬрд╛рдП, рдХрд╛рдВрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ MaybeUninit рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ https://github.com/Thomasdezeeuw/mio-st/pull/71ред рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдореЗрд░рд╛ (рд╕реАрдорд┐рдд) рдЕрдиреБрднрд╡ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдерд╛ред

рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореБрджреНрджрд╛ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╡рд╣ рдпрд╣ рдерд╛ рдХрд┐ &mut T MaybeUninit::set рд░рд┐рдЯрд░реНрди let _ = ... (https://github.com/Thomasdezeeuw/mio-st-pull/) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред 71 / рдлрд╝рд╛рдЗрд▓реЗрдВ # diff-1b9651542d08c6eca04e6025b1c6fd53R116), рдЬреЛ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдПрдкреАрдЖрдИ рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрдм рдореИрдВ рд╕реА рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЕрдХреНрд╕рд░ рдЗрдХрд╛рдИрдмрджреНрдз рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

  1. &mut [MaybeUninit<T>] рд╕реЗ &mut [T] рдЬрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЕрдЪреНрдЫреА рд╣реЛрдЧреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рд╕рднреА рдорд╛рди рдПрдХ рдареАрдХ рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрдВ
  2. рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд░рдгреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдореИрдХреНрд░реЛ, uninitialized_array , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рднреА рд╣реЛрдЧрд╛ред

рдореИрдВ рд╢рд╛рдпрдж рдпреВрдлрд┐рдирд┐рдЯ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛

рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реМрдЯрдиреЗ рдФрд░ mutUninit рдореЗрдВ рдореНрдпреВрдЯ рдЯреА :: рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ _ = ...

рдпрд╣ рдХреНрдпреЛрдВ? рдЖрдк рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЛ "рдлреЗрдВрдХ" рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЙрдХреНрд╕ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг let _ = ... рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред ( write / set рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ ... рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ read рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред)

foo.write(bar); let рдмрд┐рдирд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрдХрд╛рдИрдмрджреНрдз рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рд╣рд╛рдБ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╣рд┐рдд рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИред

@RalfJung

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓реМрдЯрдиреЗ рдФрд░ mutUninit рдореЗрдВ рдореНрдпреВрдЯ рдЯреА :: рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ _ = ...

рдпрд╣ рдХреНрдпреЛрдВ? рдЖрдк рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреЛ "рдлреЗрдВрдХ" рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЙрдХреНрд╕ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг let _ = ... рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред ( write / set рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ ... рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ read рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред)

рдореИрдВрдиреЗ unused_results рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП let _ = ... рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИред

рдЖрд╣, рдореИрдВ рдЙрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛ред рджрд┐рд▓рдЪрд╕реНрдкред

рдпрд╣ рдПрдХ write рдПрдХ рд╕рдВрджрд░реНрдн рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЕрдзрд┐рдХ рдорд╛рдВрдЧ рд╣реИ рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд░рдгреА рдЖрд░рдВрднреАрдХрд░рдг рд╕рдорд╛рд░реЛрд╣ рдпрд╛ рдореИрдХреНрд░реЛ, uninitialized_array , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рд╕рд┐рд░реНрдл [MaybeUninit::uninit(); EVENTS_CAP] ред Https://github.com/rust-lang/rust/issues/49147 рджреЗрдЦреЗрдВ

рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдПрдХ write рдПрдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЕрдзрд┐рдХ рдорд╛рдВрдЧ рд╣реИ рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдЖрд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ? рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдорд╛рдВрдЧ рд╣реИ рддреЛ рд╣рдо рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рдВрджрд░реНрдн рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ ред

рдЖрд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ?

рд╣рд╛рдБ, рд╡рд╣рд╛рдБ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдПрдХ рдкрд░рд╕реНрдкрд░ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВред

@ рд╕реЗрдВрдЯреНрд░реАрд▓ рд╣реЗрд╣, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдпрд╣рд╛рдВ рджреЗрдЦреА рдереА рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рд▓рд┐рдЦрд╛ рдерд╛: https://github.com/rust-lang/rust/issues/54542#issuecomment -478261027

Https://github.com/rust-lang/rust/pull/59912 рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛

рдЙрд╕рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ ...: рдЯрд╛рдбрд╛:

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреЛ рд▓реЗрдХрд░ рдереЛрдбрд╝рд╛ рд╡рд┐рд╡рд╛рджрд┐рдд рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╡рд╛ рдореЗрдВ рдЬрдВрдЧ-рд▓рдВрдЧ / rfcs # 2582 рдЕрднреА рднреА рд╣реИред : / RFC рдХреЗ рдмрд┐рдирд╛, рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдХреНрд░рдорд┐рдХ рдЖрд░рдВрдн рдЕрднреА рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд░реЗрдВрдЧреЗред
OTOH, MaybeUninit рдиреЗ рдХрд╛рдлреА рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХреНрд░рдорд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд▓реЛрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ MaybeUninit рд╕рд╛рде рдЬреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЙрд╕рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ ... the

@RalfJung рдпрд╣рд╛рдБ рдкреНрд░рд▓реЗрдЦрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреИрд╕реА рд╣реИ? рдпрджрд┐ рд╣рдо рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдбреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде "рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА" рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдиреАрдВрдж рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ ... :)

MaybeUninit рдХреЗ рдбреЙрдХреНрд╕ рдкрд░ рдкрдврд╝рдирд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ assume_init , рдпрд╣ "рд╕реБрд░рдХреНрд╖рд╛" рдЦрдВрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк mu.assume_init() рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд fn , рддреЛ рдЖрдкрдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рднреА рдмрдЪрд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЙрди рдбреЙрдХреНрд╕ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдмрд╢рд░реНрддреЗ рдХрд┐ MaybeUninit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рднреА рдмрд░рдХрд░рд╛рд░ рд░рдЦрд╛ рдЬрд╛рдПред

рдпрд╣рд╛рдБ рдкреНрд░рд▓реЗрдЦрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреИрд╕реА рд╣реИ? рдпрджрд┐ рд╣рдо рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдбреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде "рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА" рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдмреЗрд╣рддрд░ рдиреАрдВрдж рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ ... :)

рдореИрдВ рд╢рд╛рдпрдж рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдЦрдВрдб рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ "рдбрдмреНрд▓реНрдпреВрдЯреАрдПрдл, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ?" рдЬреИрд╕реЗ рд╣реЛрдВрдЧреЗред

рдЯреАрдмреАрдПрдЪ рдореБрдЭреЗ рдпрд╣ рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА рд╣реИред :( рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдм рддрдХ рдХреБрдЫ рд╕рд▓рд╛рд╣ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдмрд╣реБрдд рд╕рдВрднрд╡ рдерд╛ рдФрд░ рдореБрдЭреЗ рджреБрдЦ рд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПред

рдпрд╣ "рд╕реБрд░рдХреНрд╖рд╛" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк mu.assume_init () рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд fn рдореЗрдВ рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рднреА рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЙрди рдбреЙрдХреНрд╕ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдмрд╢рд░реНрддреЗ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╡рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╢рд╛рдпрдж рдпреВрдлрд┐рдирд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рднреА рдмрд░рдХрд░рд╛рд░ рд░рдЦрд╛ рдЬрд╛рдПред

рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛-рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдХреЗ рдкреВрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рдХреИрд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ MaybeUninit рдЙрд╕рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдЬрдЧрд╣ рд╣реИ; рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд┐рдВрддрд╛ MaybeUninit рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЬреЛ рдЪреАрдЬреЗрдВ рдЖрдк рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдФрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЬрдЧрд╣ рдореЗрдВ рдирд╛рдорд┐рдХ рдХреА рддрд░рд╣ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реА рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓ рдореБрджреНрджреЗ рдкрд░ MaybeUninit рдХреЗ рдбреЙрдХреНрд╕ рдХреЛ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред :)

рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛-рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдХреЗ рдкреВрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рдХреИрд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рдпрд╣ рдереЛрдбрд╝рд╛ рдордЬрдмреВрдд рд╣реИ ... рдореИрдВ рдХреЗрд╡рд▓ MaybeUninit<T> рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреБрдЫ рд░рдгрдиреАрддрд┐рдХ рдЬрдЧрд╣ рдореЗрдВ "рдУрд╣, __by way__, рд╕реБрд░рдХреНрд╖рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рднреА MaybeUninit<T> рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд░реЗрдВрдЧреЗред

рд╕рдм рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рд╕рднреА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдкреАрдЖрд░: https://github.com/rust-lang/rust/pull/60445

рдореИрдВ рд╕рд┐рд░реНрдл рдорд╛рдирдХреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ mem::uninitialized рдЙрдкрдпреЛрдЧ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдХрд╣рд╛рдБ рдФрд░ рдХрд╣рд╛рдБ core::ptr::drop_in_place рдХреЗ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рднреА рд╡рд┐рдбрдВрдмрдирд╛ рдХреА рддрд░рд╣) рдпрд╣ рдпреВрдмреА рдХреЗ рджреВрд╕рд░реЗ рд░реВрдк рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ https://github.com/rust-lang/rfcs/pull/2582 рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдореЛрджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕реЗ рд╣рдЯрд╛ рджреВрдВрдЧрд╛)ред

@HeroicKatora рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдХреЛ https://github.com/rust-lang/rust/pull/60445 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛

рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░реЗрдл-рдЯреВ-рдЕрдирд▓рдЧреНрдб-рдлреАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреЙрдХреНрдЯрд░ рдХреЛ рд╣рдЯрд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ 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 рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореИрдВ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдПрдлрдПрдлрдЖрдИ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд╛рдо, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░ self (рдХреЗрд╡рд▓ Self рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдирд┐рд░рдВрддрд░), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЖрдХрд╛рд░ Self ред

@kgv рдореБрдЭреЗ рдпрд╣рд╛рдБ @RalfJung рд╕реЗ рд╕рд╣рдордд

рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдЙрддрд░рд╛, рдмрд╕ рдмреАрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рдордп рдореЗрдВред :) рдпрд╣ рд▓рдЧрднрдЧ 8 рдорд╣реАрдиреЗ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ рдЕрд╕рдВрдмрджреНрдз рд╕реНрдореГрддрд┐ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ) 6 рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреИрд╕реА рдпрд╛рддреНрд░рд╛ рд╣реИ! рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрди рдзрдиреНрдпрд╡рд╛рджред : рдбреА

рдмреЗрд╢рдХ, рд╣рдо рдХрд╛рдо рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rfcs/pull/2582 рд╣реИред libstd рдореЗрдВ рдЕрднреА рднреА mem::uninitialized (рдЕрдзрд┐рдХрддрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб) рдХрд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рдХрдо рд╣реИ: рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ read рдФрд░ write рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдореЗрдВ API рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ MaybeUninit рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдмрдХреНрд╕реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред mem::uninitialized рд╕реЗ рдкреВрд░реЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭрд╛рдиреЗ рдХреА рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ, ans рдпрд╣ рдкрд╣рд▓рд╛ рдХрджрдо рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ред :)

рдФрд░ рд╣рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ MaybeUninit рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдмрдХреНрд╕реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

@RalfJung рдЙрд╕ рдЕрдВрдд рддрдХ; рд╢рд╛рдпрдж рдЕрдм https://github.com/rust-lang/rust/issues/49147 рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдХреЛ рд╢реЗрд╖ рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрд╕ рдЕрдВрдд рддрдХ; рд╢рд╛рдпрдж рдЕрдм # 49147 рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ? = P

рдХреНрдпрд╛ рдЖрдк рд╕рд┐рд░реНрдл рд╕реНрд╡рдпрдВрд╕реЗрд╡рдХ рдереЗ? ;) (рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред)

рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рд╢реЗрд╖ рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдХреНрдпрд╛ рдЖрдк рд╕рд┐рд░реНрдл рд╕реНрд╡рдпрдВрд╕реЗрд╡рдХ рдереЗ? ;) (рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред)

рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ ... = рдбреА - рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдФрд░ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ? (рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдореЗрдВ рдЖрд╢рд╛ рд░рдЦреЗрдВ)

рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдпрд╣ рдореИрдВ рд╣реЛрдЧрд╛ ...;) рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдИрд╢ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

@RalfJung рдЖрдкрдХреЗ рдХрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ let x: bool = mem::uninitialized(); UB рд╣реИ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдорд╛рдиреНрдп рдЖрджрд┐рдорддрд╛ рдХреЛ рдРрд╕рд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рдПрдХ рдмреБрд░реА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдРрд╕реЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЬрдВрдЧ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХреНрдпреЛрдВ рди рдЦрддреНрдо рдХрд░ рджреЗрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рд╢реБрд░реБрдЖрддреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рд╣реИ?

рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдпрд╣ рдЗрди рдорд╛рдиреНрдпрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо foo(x: bool) LLVM рдХреЛ рдмрддрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ x рдПрдХ рдорд╛рдиреНрдп рдмреВрд▓рд┐рдпрди рд╣реИред рдпрд╣ UB рдХреЛ bool рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ true рдпрд╛ false рднрд▓реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореВрд▓ рд░реВрдк рд╕реЗ x рди рджрд┐рдЦрддрд╛ рд╣реЛред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рд▓реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдУрд░ рдмрдпрд╛рди рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рд▓реВрдк рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

AFAIK рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд╕реАрдорд╛рдУрдВ рдкрд░ рдирд╣реАрдВред рдФрд░ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдФрд░ рднреА рд╕реНрдерд╛рди рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдо рдЗрд╕реЗ "рдПрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП" (рдЖрдк рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд╢рдмреНрдж, рдФрд░ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ) рдХреА рдПрдХ рдЪрддреБрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рдпреВрдмреА рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдпрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рднреА, рдХреЛрдб рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрд░реНрде рдХреБрдЫ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реНрдореГрддрд┐ рдХрд╛ рдЗрд▓рд╛рдЬ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ, рдПрдХ рдЪрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдЭреВрда рдмреЛрд▓рдиреЗ рдХреЗ рддрджрд░реНрде "рдпреЛрд▓реЛ" рдХреЗ рдмрдЬрд╛рдп ("рдореЗрд░рд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ bool , рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ ")ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо foo (x: bool) рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ LLVM рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ x рдПрдХ рдорд╛рдиреНрдп рдмреВрд▓рд┐рдпрди рд╣реИред рдпрд╣ UB рдХреЛ рдПрдХ рдмреВрд▓ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ рднрд▓реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореВрд▓ рд░реВрдк рд╕реЗ x рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реЛред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рд▓реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдУрд░ рдмрдпрд╛рди рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рд▓реВрдк рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдорд╛рдиреНрдп рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдкрдврд╝рдирд╛ / рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ред
рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рддрд░реАрдХреЗ рд╕реЗ рдЗрдирд╛рдЗрдЯрд┐рдВрдЧ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЖрд╢реНрдЪрд░реНрдп рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рдпреВрдмреА (рдбреЙрдХреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рдпрд╣ рд╣реИ), рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрджрд┐ рдореИрдВ рдРрд╕рд╛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИ?

let _: bool = unsafe { mem::unitialized };

рд╡рд┐рд╖рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓: рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ box рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реАрдзреЗ рд╣реАрдк рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ Box::new() рд╡рд┐рдкрд░реАрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрднреА-рдХрднреА рд╕реНрдЯреИрдХрд▓реЙрдХ рдореЗрдореЛрд░реАред рддреЛ рдЕрдЧрд░ рдореИрдВ box MaybeUninit::new() рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рднрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ Box<MaybeUninit<T>> рдХреЛ Box<T> рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреНрдпрд╛ рдореБрдЭреЗ рдХреЛрдИ рдкреНрд░рд╕рд╛рд░рдг рдпрд╛ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ред

@Pixix рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ Box рдФрд░ MaybeUninit рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ : рдореБрд╕реНрдХрд╛рди:

@ рдХреЗрдВрджреНрд░ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдк-рдореБрджреНрджрд╛ рд╣реИ рдЬреЛ рддрдм рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╣рд╛рдВ, рдореБрдЭреЗ рд╡рд╣ рдЪрд░реНрдЪрд╛ рдпрд╛рдж рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдПрдкреА рдпрд╛рдж рдирд╣реАрдВ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

fn into_inner<A,T>(value: A<MaybeUninit<T>>) -> A<T> { unsafe { std::mem::transmute() } }

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдРрд╕реА рдХреЛрдИ рдПрдкреАрдЖрдИ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рдВрдХрд▓рдХ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ Vec<Result<Option<MaybeUninit<u8>>>> рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП into_inner рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд░рд┐рдЯрд░реНрди Vec<Result<Option<u8>>>

рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ get_ref рдФрд░ get_mut рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ)ред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ? рд╡реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рд╡реЗ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ (рдЬреЛ рдЗрдореЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ 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();

рдХреНрдпрд╛ рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕реА рдПрдХ рдЙрдкрдпреЛрдЧ рд╣реИ?

рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рдЙрддреНрддрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдХреЙрдкреА, рдЬреИрд╕рд╛ рдХрд┐, рдПрдордЖрдИрдЖрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рдПрдХ рдЙрдкрдпреЛрдЧ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ let x: bool = mem::uninitialized() рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИред


рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ get_ref рдФрд░ get_mut рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ)ред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ? рд╡реЗ рдЕрдЪреНрдЫреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рд╡реЗ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ (рдЬреЛ imo рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдпрд╣ https://github.com/rust-lang/unsafe-code-guidelines/issues/77 рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдХреНрдпрд╛ &mut bool рдЬреЛ рдПрдХрддрд░рдлрд╛ рд╕реНрдореГрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ "рд╣рд╛рдВ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рдЕрд╕рд╣рдордд рд╣реИрдВред

рдпрд╣ рдЬрдВрдЧ-рд▓рдВрдЧ / рдЕрд╕реБрд░рдХреНрд╖рд┐рдд-рдХреЛрдб-рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ # 77 рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рдпреВрдмреА рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдореГрддрд┐рд╣реАрди рд╣реИ" рддреЛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдирд░рдо рдХрд░реЗрдВ рдпрджрд┐ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯ-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдирд░рдо рдХрд░реЗрдВ

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдореЗрд░реЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг (рдПрдкреАрдЖрдИ рд╕рдВрдЧрдд!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдм рдпреВрдмреА рд╣реИ?

@Gankro

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдпрд╣ рдпреВрдмреА рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдореГрддрд┐рд╣реАрди рд╣реИ" рддреЛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдирд░рдо рдХрд░реЗрдВ рдпрджрд┐ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯ-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдлреБрдЯрдЧрди-рд╡рд╛рдИ рд▓рдЧрддрд╛ рд╣реИред рд╕рд┐рд░реНрдл &mut *foo.as_mut_ptr() рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ? рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? IOW, рдореИрдВ рдЕрдм рдЖрдкрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ

рдПрдХрдорд╛рддреНрд░ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рд╡реЗ рдЬреЛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдпрджрд┐ рд╣рдо рдПрдХ рдмрд╛рд░ рдореВрд▓реНрдп рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рд╡рд╣ рд╕рдм рдХреБрдЫ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА рд╣реЛрдЧреАред ^ ^

@shepmaster

рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдореЗрд░реЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг (рдПрдкреАрдЖрдИ рд╕рдВрдЧрдд!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдм рдпреВрдмреА рд╣реИ?

рдпрд╣ рдЖрдЬ рд╕рдЪ рд╣реИ рдЕрдЧрд░ рд▓реЛрдЧ &mut *foo.as_mut_ptr() ред рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣рд╛рдБ рдХреЗрд╡рд▓ рдпреВрдмреА рд╣реИ рдЕрдЧрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рднреА рдмрджрд▓рдирд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд╣рд╛рдБ рдпреВрдмреА рд╡рд╣рд╛рдБ рд╣реЛ рдЧрдпрд╛ рд╣реЛрддрд╛ рдЕрдЧрд░ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдХреЛрдб рдПрдХ рд╣реА рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдорд╛рд░ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдПрдХ рдЧрд╛рд░рдВрдЯреА рдмрдирд╛рдпрд╛ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣реИ рдХрд┐ рд╣рдо рдЧрд╛рд░рдВрдЯреА рдХрд░ рдХреЛрдИ рдпреВрдмреА рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рд╣реИред рдпреВрдмреА рдПрдХ рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рдХреА рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд▓реНрдкрдирд╛ рдХреА рднреА рд╣реИ, рдФрд░ рдпреБрдХреНрддрд┐ рд░реЗрдЯреНрд░реЛ рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреА рд╣реИред ;)

рдареАрдХ рд╣реИ, рдореИрдВ рдорд╛рди рд░рд╣рд╛ рдерд╛ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдереА

  • рдЗрд╕реЗ рд╕рдЦреНрдд рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░рд░реНрдердХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд░реЗрдВ
  • рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ
  • рдПрдХ рдмрд╛рд░ рдореЙрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

    • рдЕрдЧрд░ рдпрд╣ рдпреВрдмреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╢рд╛рдВрдд рд░рд╣реЗрдВ, рдбреЙрдХреНрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рдпрджрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рддреЛ рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝реЗрдВ

    • рдЕрдЧрд░ рдЙрд╕реЗ UB рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрд╕реЗ рдХреВрд▓ рдХрд░реЗрдВ, рдбреЙрдХреНрд╕ рд╕реЗ рд╣рдЯрд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдПрдХ рджрд┐рди рдХреЙрд▓ рдХрд░реЗрдВ

@RalfJung

рдХреНрдпрд╛ рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕реА рдПрдХ рдЙрдкрдпреЛрдЧ рд╣реИ?

рд╣рд╛рдВ, рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдпрд╛ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдПрдХ рдЙрдкрдпреЛрдЧ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреЛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдХреЙрдкреА, рдЬреИрд╕рд╛ рдХрд┐, рдПрдордЖрдИрдЖрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ) рдПрдХ рдЙрдкрдпреЛрдЧ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ let x: bool = mem :: uninitialized () рд╢рд╛рдорд┐рд▓ рд╣реИред

рдорд╛рдиреНрдп рджрд┐рдЦрддрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдордзреНрдпрд╕реНрдерддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ NUUnit рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░? рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд░реИрдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@Pixixel рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрди рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЪрд░реНрдЪрд╛ https://github.com/rust-lang/rust/issues/61011 рдкрд░ рд╣реЛ рд░рд╣реА рд╣реИ

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ MaybeUninit::write() рд╡рд┐рдзрд┐ unsafe рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж T рдкрд░ рдХреЙрд▓рд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирдиреЗ рдХреА рдорд┐рд╕рд╛рд▓ рд╣реИ?

https://doc.rust-lang.org/nomicon/leaking.html#leaking
https://doc.rust-lang.org/nightly/std/mem/fn.forget.html

forget рдХреЛ unsafe рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЧрд╛рд░рдВрдЯреА рдореЗрдВ рдПрдХ рдЧрд╛рд░рдВрдЯреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣рдореЗрд╢рд╛ рдЪрд▓реЗрдЧрд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, https://github.com/rust-lang-nursery/nomicon/issues/135 рднреА рджреЗрдЦреЗрдВ

рд╣рдо рдПрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХреЗ MaybeUninit<T> -> NonNull<T> рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ MaybeUninit ? AFAICT рд╕реВрдЪрдХ MaybeUninit::as_mut_ptr() -> *mut T рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрднреА рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рдиреЗ рдХреЗ рдордВрдерди рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ рдЬреЛ NonNull<T> , рдЗрд╕рд╕реЗ:

let mut x = MaybeUninit<T>::uninit();
foo(unsafe { NonNull::new_unchecked(x.as_mut_ptr() });

рд╕реЗрд╡рд╛:

let mut x = MaybeUninit<T>::uninit();
foo(x.ptr());

рдкреЙрдЗрдВрдЯрд░ рд╢рд╛рдпрдж рдпреВрдиреАрдирд┐рдЯ :: as_mut_ptr () -> * рдореНрдпреВрдЯ рдЯреА рд╕реЗ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рд╣реА рд╣реИред

рдЖрдо рддреМрд░ рдкрд░ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ @Gankro рдХреЛ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рджреЗрдЦрд╛ рд╣реИ), NonNull рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ "рдЖрд░рд╛рдо рд╕реЗ" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░ ASAP рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ NonNull рдареАрдХ рд▓рдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдкреВрд░реНрд╡рддрд╛ рд╣реИ?

Https://github.com/rust-lang/rust/issues/47336 рдХреЗ рд╕рд╛рде рдорд┐рд╕рд╛рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдирд╛рдо рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ https://github.com/rust-lang/rust/pull/60445#issuecomment -488818677 рдореЗрдВ рдЧрдбреНрдврд╛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

3 рдорд╣реАрдиреЗ рдХреЗ рдЙрдкрд▓рдмреНрдз рд╕рдордп рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ @centril рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдмреАрдЯрд╛, рд╕реНрдерд┐рд░ рдФрд░ рд░рд╛рдд рдХреЗ рд╕рднреА рдкрд░ рдЪреЗрддрд╛рд╡рдиреА-рдореБрдХреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред 1.36.0 рдПрдХ рд╣рдлреНрддреЗ рд╕реЗ рднреА рдХрдо рд╕рдордп рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд░рд╛рдд рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрджрд╛рд╡рдирддрд┐ рдХреЛ 1.40.0 рдкрд░ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП?

рдкрджрд╛рд╡рдирддрд┐ рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рд╣рдореЗрд╢рд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЯреЛрдХрд░реЗ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЬрдм рдПрдХ рдЯреЛрдХрд░рд╛ рдПрдХ рдореИрдХреНрд░реЛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ std::mem::uninitialized рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдмрдХреНрд╕реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рднреА рдЕрдкрд╡рд┐рддреНрд░ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЖрдЬ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд░рд╛рдд рдХреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ред рднрд▓реЗ рд╣реА рдХреЛрдб рдореЗрдВ 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 рдпреЗ рдЕрдЪреНрдЫреЗ рдЕрдВрдХ рд╣реИрдВред рдореИрдВ рдПрдХ рд░рд┐рд▓реАрдЬ рдпрд╛ рджреЛ рд╕реЗ рд╡рд╛рдкрд╕ deprecation рдзрдХреНрдХрд╛ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдХреЛрдИ рдПрддрд░рд╛рдЬ?

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА 1.36.0 рд░рд┐рд▓реАрдЬ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд╣рд╛ рд╣реИ:

рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдпрджрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬрдВрдЧ 1.38 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╕рдорд╛рд░реЛрд╣ рдореЗрдо :: uninitialized рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬреИрд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдлреНрд▓рд┐рдк-рдлреНрд▓реЙрдкреА рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднреНрд░рд╛рдордХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрджрд╛рд╡рдирддрд┐ рддрд┐рдерд┐ рднреА рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╢рд╛рдпрдж uninitialized рдХреЗ рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрд░ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдмрд▓ рдЪреИрдирд▓ рдкрд░ рд░рд┐рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рдмрд╛рдж рдирд╛рдЗрдЯрд▓реА рдореЗрдВ рдХреЗрд╡рд▓ рдбреЗрдкреНрд░рд┐рд╕рд┐рдПрд╢рди рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреА рдиреАрддрд┐ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд░ рд╕рдХреЗрдВ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдиреЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рджреЛ рд╣рдлреНрддреЗ рдмрд╛рдж рдПрдХ рдирдпрд╛ рд░рд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ред

рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА 1.36.0 рд░рд┐рд▓реАрдЬ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд╣рд╛ рд╣реИ:

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рддрд╛рд░реАрдЦ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЛрд╣реЗ рдХреА рдбрд┐рдЧреНрд░реА рд╣реИред рдпрд╣ рдПрдХ рд░реЗрдкреЛ рдореЗрдВ рд╣реИ рдФрд░ рд╣рдо рдПрдХ рдПрдбрд┐рдЯ рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреИрд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдлреНрд▓рд┐рдк-рдлреНрд▓реЙрдкреА рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рднреНрд░рд╛рдордХ рд╣реИред

"рдлреНрд▓рд┐рдк-рдлреНрд▓реЙрдкреА" рдПрдХ рдмреБрд░реА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рдмрджрд▓рдирд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрдгрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рджреВрд╕рд░реЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛрдВрдЧреЗред рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреЗрдЦреА рд╣реИ рдпрд╛ рдлрд┐рд░ рдбреЗрдкреНрд░рд┐рд╕рд┐рдПрд╢рди рдХреА рдЪреЗрддрд╛рд╡рдиреА рдирдИ рдЪреАрдЬрд╝ рдкрд░ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЬреЛ рд▓реЛрдЧ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдХреБрдЫ рд░рд┐рд▓реАрдЬ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

"рдлреНрд▓рд┐рдк-рдлреНрд▓реЙрдкреА" рдПрдХ рдмреБрд░реА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рдмрджрд▓рдирд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдорддред рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдмреБрд░рд╛ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ "рдЕрд░реЗ, рд╣рдорд╛рд░рд╛ рдкрджрд╛рд╡рдирддрд┐ рд╢реЗрдбреНрдпреВрд▓ рдХреБрдЫ рдЬреНрдпрд╛рджрд╛ рд╣реА рдЖрдХреНрд░рд╛рдордХ рдерд╛, рд╣рдордиреЗ рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рд░рд┐рд▓реАрдЬ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛"ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ IIRC рдореИрдВрдиреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рд▓реИрдВрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдорд┐рд╕рд╛рд▓ рднрд╡рд┐рд╖реНрдп рдореЗрдВ 3 рд░рд┐рд▓реАрдЬ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ 2 рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо 2 рдХреЗ рд╕рд╛рде рдЧрдПред рддреАрди рд░рд┐рд▓реАрдЬ рдХрд╛ рдорддрд▓рдм рд╣реИ, рд╕реНрдерд┐рд░-рдЬрд╛рд░реА-рдХреЗ-рд╕рд╛рде-рд╕рд╛рде 1 рдкреВрд░реА рд░рд┐рд▓реАрдЬред -рдбрд┐рдкреНрд░реЗрд╕рди-рдШреЛрд╖рдгрд╛ рдФрд░ рдкрджрд╛рд╡рдирдд-рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди, рдЬреЛ рд░рд╛рддреНрд░рд┐ рдореЗрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред 6 рд╕рдкреНрддрд╛рд╣ рдПрдХ рдИрдУрди рд╣реИ, рд╣реИ рдирд╛? ;)

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд▓ рдПрдХ рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдбреЗрдкреНрд░рд┐рд╕рд┐рдПрд╢рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 1.39.0 рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЙрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рднреА рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд▓ рдПрдХ рдкреАрдЖрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдбреЗрдкреНрд░рд┐рд╕рд┐рдПрд╢рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 1.39.0 рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЙрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рднреА рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдореИрдВ рез.рей реп рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдирд╣реАрдВред рдЖрдкрдХреЛ рдмреНрд▓реЙрдЧ-рдкреЛрд╕реНрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдмрджрд▓реЗ рд╣реБрдП рдЕрдкрдЧреНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдкреАрдЖрд░: https://github.com/rust-lang/rust/pull/62599ред

@SimonSapin

рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рд░реЛрдХрдиреЗ рд╡рд╛рд▓реА рд╢реЗрд╖ рдЪрд┐рдВрддрд╛рдПрдБ рдХреНрдпрд╛ рд╣реИрдВ? * Foo.as_mut_ptr () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рдмрд╣реБрдд рдердХрд╛рдК рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА (рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред

as_ref / as_mut , рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЖрд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдиреНрдпрдерд╛ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИред

read / write , рдЕрдЧрд░ рд╕рднреА рдХреЗ рдирд╛рдо рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ ManuallyDrop::take/read рд╕рд╛рде рд╕рдордиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╢рд╛рдпрдж ManuallyDrop::write рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЖрд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП Unsafe Code Guidelines WG рдФрд░ Language Team рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдлреНрддреЛрдВ, рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдпрд╛ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

рдЗрд╕ рдмреАрдЪ, as_mut рдЕрд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ &mut *manually_drop.as_mut_ptr() рд▓рд┐рдЦрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП Unsafe Code Guidelines WG рдФрд░ Language Team рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдлреНрддреЛрдВ, рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдпрд╛ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

рдорд╣реАрдиреЗ, рд╢рд╛рдпрдж рд╕рд╛рд▓ред

рдЗрд╕ рдмреАрдЪ, as_mut рдЕрд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдореНрдпреВрдЯ * рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред тАЬ__mut_ptr () рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рд╛рдБ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдБред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЛ &mut рднрд╛рдЧ рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ, рдФрд░ рдХрдЪреНрдЪреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдУрд░ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдмреЗрд╢рдХ рдмрд┐рдирд╛ https://github.com/rust-lang/rfcs/pull/2582 рдЬреЛ рдЕрдХреНрд╕рд░ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдпреВрдиреБрдЗрдирд┐рдЯ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХрдо рд╕реЗ рдХрдо рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдореБрдЦ рд╕реНрдерд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдареАрдХ рдирд╣реАрдВ рд╣реИред

рд╕рдЪ рд╣реИ, рдпрд╣ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред

рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рднреА, рдореВрд▓реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж as_mut рд╡реИрдз рд╣реИред

рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ MaybeUninit<[MaybeUninit<Foo>; N]> ред рдмрд╛рд╣рд░реА рд░реИрдкрд░ рдПрдХрд▓ uninit() рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ [expr; N] рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП Copy рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ?) рдЖрдВрддрд░рд┐рдХ рдЖрд╡рд░рдг рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдкреАрдЫреЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП slice::IterMut рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдврд╝рд┐рд╡рд╛рджреА рдзрд╛рд░рдгрд╛ рдореЗрдВ рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рдПрдХ-рдПрдХ рдХрд░рдХреЗ Foo рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рд╢рд╛рдпрдж uninit_array! рдПрдХ рдмреЗрд╣рддрд░ рдирд╛рдо рд╣реЛрдЧрд╛ред

@ рд╕реНрдЯрд╛рд░реНрдЧреЗрдЯрд░ рдмрд┐рд▓реНрдХреБрд▓, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/49147 рд╕реВрди (рдЯреАрдПрдо) рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдХрднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдЙрдШ , рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рд╣реИ, рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рдкреАрдЖрд░ рдХреЛ рд░реЛрдХ рд░рд╣рд╛ рдерд╛: https://github.com/rust-lang/rust/pull/61749#issuecomment -512867703

@eddyb рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП libcore, yay! рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдЬрдм рдореИрдВ liballoc рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред Https://github.com/rust-lang/rust/commit/4c2c7e0cc9b2b2b589fe2bab44173acc2170b20c09 рджреЗрдЦреЗрдВ

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 рдкреНрд░рдЪрд╛рд░ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рд╢рд╛рдпрдж рдПрдХ рдкреАрдЖрд░ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдореИрдХреНрд░реЛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ?

@eddyb рдореИрдВрдиреЗ https://github.com/rust-lang/rust/pull/62799 рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдпрд╛

maybe_uninit_ref

As_ref / as_mut рдХреЗ рд▓рд┐рдП, рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдпрд╣ рди рдЬрд╛рди рд▓реЗрдВ рдХрд┐ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЖрд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдиреНрдпрдерд╛ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИред

рдЕрд╕реНрдерд┐рд░ get_ref / get_mut рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рд╡рдЬрд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИрдВ; рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ get_ref / get_mut рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм MaybeUninit init рд╣реЛ рдЧрдпрд╛ рд╣реЛ: рдХрд┐рд╕реА рднреА рдкрд░рд╣реЗрдЬ рдХрд░рддреЗ рд╣реБрдП (рдЕрдм рдЬреНрдЮрд╛рдд рдкреНрд░рд╛рд░рдВрднрд┐рдХ) рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП memcpy ( assume_init рдмрдЬрд╛рдп, рдЬреЛ memcpy рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ )ред

  • рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд╕реНрддреА рдмрдЪрдд рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░рдг рд▓реЛрдЧ (рдмрд┐рдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ assume_init_by_ref / assume_init_by_mut рдХрд╛ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ into_inner рдХреЛ assume_init рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ref / ref mut рдЧреЗрдЯрд░реНрд╕ рдХреЛ рднреА рдпрд╣ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ)ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ / рддреАрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, Drop рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд:

  1. get_ref API get_mut рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА API рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЬреЛ рдбреНрд░реЙрдк рдбреНрд░реЙрдк рд╣реЛрдиреЗ рдкрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;

    • (рд╡реЗрд░рд┐рдПрдВрдЯ): рд╕рдорд╛рди рдПрдкреАрдЖрдИ get_ref / get_mut , рд▓реЗрдХрд┐рди Copy рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде;
  2. рдбреНрд░реЙрдк рдХреА рдЧрд╛рд░рдВрдЯреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╢реИрд▓реА рдПрдкреАрдЖрдИ,

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 рдХреЗ рддрд░реНрдХ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)


рдЗрдиреНрд╣реЗрдВ get_ref / get_mut рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬрд╝реА рд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ assume_init рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред

рдХрдорд┐рдпрд╛рдВ

рдпрджрд┐ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг .1 рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ get_ref / get_mut assume_init рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрди рдЧрдП рдереЗ, рддреЛ рдпрд╣ рдПрдкреАрдЖрдИ рд▓рдЧрднрдЧ рд╕рдЦреНрддреА рд╕реЗ рд╣реАрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде, рд╕рдВрджрд░реНрдн рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рд▓рдЧрднрдЧ рдареАрдХ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ get_ref рдФрд░ get_mut рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)

@Danielhenrymantilla рдиреЗ get_{ref,mut} рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рдорд╛рди, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ read рдирд╛рдо рд╢рд╛рдпрдж read_init рдпрд╛ read_assume_init рдпрд╛ рддреЛ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдРрд╕рд╛ рдХреБрдЫ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдХреЗрд╡рд▓ рдЖрд░рдВрднреАрдХрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ:

fn foo<T>() -> T {
    let newt = unsafe { MaybeUninit::<T>::zeroed().assume_init() };
    newt
}

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо foo<NonZeroU32> ред рдХреНрдпрд╛ рдпрд╣ UB рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╣рдо foo рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рднреА T s рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЬрдм рд╣рдо рдЗрд╕реЗ UB рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рддреЛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдПрдХ рдЧрд▓рдд рдЬрдЧрд╣ рд╣реИ? рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВред

@Pixixel рдХреЛрдб рдХреЗрд╡рд▓ рдпреВрдмреА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдЪрд▓рддрд╛ рд╣реИред

рддреЛ, foo::<i32>() рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди foo::<NonZeroU32>() UB рд╣реИред

рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдз рд╣реЛрдиреЗ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ "рдзреНрд╡рдирд┐" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрджрд░реНрдн рднреА рджреЗрдЦреЗрдВред рдЬрдВрдЧ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдмрдВрдз рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреАрдЖрдИ рд╕рддрд╣ рдзреНрд╡рдирд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рддрд╛рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпреВрдмреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░рдиреА рдкрдбрд╝реЗред рд░рд╕реНрдЯ рдХреА рдкреВрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдХрд╣рд╛рдиреА рдзреНрд╡рдирд┐ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред

@ рд░рд╛рд▓реНрдлрдЬрдВрдЧ рдзрдиреНрдпрд╡рд╛рдж

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдирд╕реБрдирд╛ рд╣реИ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдорд╛рдиреНрдп рд╣реИ), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ unsafe рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢рд░реАрд░ рдорд╛рдиреНрдп рдФрд░ рдзреНрд╡рдирд┐ рдмрди рдЬрд╛рддрд╛ рд╣реИ

@Pzixel рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ

рд╣рд╛рдВ, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди unsafe рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЗрдирдкреБрдЯ UB рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рд╡реЗ рдЗрдирдкреБрдЯ рдпреВрдмреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрднреА рднреА рдЙрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреВрдмреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдХрднреА рднреА рдареАрдХ рдирд╣реАрдВ рд╣реИ, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдореЗрдВ рднреА рдирд╣реАрдВред

рд╣рд╛рдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдлрдВрдХреНрд╢рдирд▓ рдХреЛ unsafe рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ред

рдЪреВрдБрдХрд┐ рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдЗрддрдиреА рд▓рдВрдмреА рд╣реИ, рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ MaybeUninit рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдлреАрдЪрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╣реИ?

  • maybe_uninit_extra
  • maybe_uninit_ref
  • maybe_uninit_slice

рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рднреА https://github.com/rust-lang/rust/issues/63291 рд╣реИред

рдЗрд╕реЗ рдПрдХ рдореЗрдЯрд╛-рдЗрд╢реНрдпреВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЬреЛ MaybeUninit<T> рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ: # 63566

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nikomatsakis picture nikomatsakis  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dnsl48 picture dnsl48  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cuviper picture cuviper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmegaffin picture jmegaffin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

drewcrawford picture drewcrawford  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ