Rust: RFC 1892์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ, "์ƒˆ๋กœ์šด MaybeUninit ์œ ํ˜•์„ ์œ„ํ•ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ"

์— ๋งŒ๋“  2018๋…„ 08์›” 19์ผ  ยท  382์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ƒˆ๋กœ์šด ์ถ”์  ๋ฌธ์ œ = https://github.com/rust-lang/rust/issues/63566

์ด๊ฒƒ์€ RFC "์ƒˆ๋กœ์šด MaybeUninit ์œ ํ˜•์„ ์œ„ํ•ด uninitialized ์ค‘๋‹จ"(rust-lang / rfcs # 1892)์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‹จ๊ณ„ :

  • [x] RFC ๊ตฌํ˜„ (cc @ rust-lang / libs)
  • [x] ๋ฌธ์„œ ์กฐ์ • (https://github.com/rust-lang/rust/pull/60445)
  • [x] ์•ˆ์ •ํ™” PR (https://github.com/rust-lang/rust/pull/60445)

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ :

  • &mut T ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•ˆ์ „ํ•œ setter๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?
  • MaybeUninit ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผํ•ฉ๋‹ˆ๊นŒ?
  • into_inner ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผํ•ฉ๋‹ˆ๊นŒ?
  • ํ•ด์•ผ MaybeUninit<T> ์ˆ˜ Copy ์— ๋Œ€ํ•ด T: Copy ?
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „์— get_ref ๋ฐ get_mut (๋ฐ˜ํ™˜ ๋œ ์ฐธ์กฐ์—์„œ ์ฝ์ง€ ์•Š์Œ) ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? (์ผ๋ช… : "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ insta-UB์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ฝ์„ ๋•Œ๋งŒ UB์ž…๋‹ˆ๊นŒ?") into_inner ์™€ ๋น„์Šทํ•˜๊ฒŒ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผํ•ฉ๋‹ˆ๊นŒ?
  • T mem::uninitialized ๊ฐ€ ํ˜„์žฌ into_inner (๋˜๋Š” ๊ทธ ์ด๋ฆ„์ด ๋ฌด์—‡์ด๋“ ๊ฐ„์—) ๋‹นํ™ฉํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (๋๋‚œ)
  • mem::zeroed ํ๊ธฐํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
B-RFC-approved C-tracking-issue E-mentor T-lang T-libs

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

mem::zeroed() ๋Š” C ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— memset(&x, 0, sizeof(x)) ๋กœ ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ํŠน์ • FFI ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  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/intrinsic.rs#L184 -L198

fn_ty.ret.layout.abi ๊ฐ€ Abi::Uninhabited ํ•˜๊ณ  ์ตœ์†Œํ•œ ํŠธ๋žฉ์„ ๋‚ด ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ : https://github.com/rust-lang/rust/blob/8928de74394f320d1109da6731b12638a2167945/src/librustc_codegen_llvm/mir/ ํ”ผ์—ฐ์‚ฐ์ž .rs # L400 -L403

์ž‘๋™์ค‘์ธ ํ•จ์ • (์˜ˆ : intrinsics::abort )์„ ๋ณธ ํ›„์—๋Š” ํŒจ๋‹‰์„ ์œ ๋ฐœํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ’€๊ธฐ ๋•Œ๋ฌธ์— ๊นŒ๋‹ค๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/blob/8928de74394f320d1109da6731b12638a2167945/src/librustc_codegen_llvm/mir/block.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 ์ด๋ฉฐ ์Šค ๋‹ˆํŽซ์€ ์ด๋“ค์„์œ„ํ•œ insta-UB ์šฉ์ž…๋‹ˆ๋‹ค. "๋ชจ๋“  ๋น„ํŠธ ํŒจํ„ด์ด ๊ดœ์ฐฎ์€ ์œ ํ˜•"(์ •์ˆ˜ ์œ ํ˜•, ๋ณธ์งˆ์ ์œผ๋กœ)์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ undef ๋Š” ์ •์ƒ์ ์ธ ๋น„ํŠธ ํŒจํ„ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด RFC์—์„œ into_inner ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ get_mut ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ RFC ๋…ผ์˜๋Š” ์—ฌ๊ธฐ์—์„œ ์ œํ•œ์„ ์™„ํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ํ•จ๊ป˜ ์‚ด ์ˆ˜์žˆ๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ into_inner ์•„๋‹™๋‹ˆ๋‹ค.

uninitialized ์˜ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์— ๋Œ€ํ•ด๋ณด๋‹ค ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒ€ํ† ํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด๊ฒƒ์€ RFC์˜ ์˜๋„ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ฆ‰์‹œ into_inner ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด RFC๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ฆ‰์‹œ into_inner ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด RFC๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์•„์ด๋””์–ด๋ฅผ ์ค€๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฐํŠธ (๊ทธ๋ฃน : "์ •ํ™•์„ฑ")ํ•ด์•ผ ํ• ๊นŒ? cc @ oli-obk

์ด์ œ (์—ฌ๋Ÿฌ) ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ต์ฒดํ’ˆ์ด ์ ์–ด๋„ Stable์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ Nightly๋ฅผ ๋ฐฐ์†กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/pull/52994#issuecomment -411413493์—์„œ ์œ ์‚ฌํ•œ ํ† ๋ก ์„

๋ฟก๋ฟก

"๋ชจ๋“  ๋น„ํŠธ ํŒจํ„ด์ด ๊ดœ์ฐฎ์€ ์œ ํ˜•"(๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์ˆ˜ ์œ ํ˜•)์— ๋Œ€ํ•œ ์˜ˆ์™ธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ด์ „์— ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ† ๋ก ์— ์ฐธ์—ฌํ–ˆ์ง€๋งŒ ๋” ๋„๋ฆฌ ํผ ๋œจ๋ฆฌ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ฒŒ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ Fuchsia์—์„œ ๋งŽ์€ ๊ธฐ์กด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค ( FromBytes ) ๋ฐ ์ด๋Ÿฌํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ํŒŒ์ƒ ๋งคํฌ๋กœ. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (cc @gnzlbg @joshlf)์— ์ถ”๊ฐ€ํ•˜๊ธฐ์œ„ํ•œ ๋‚ด๋ถ€ Pre-RFC ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

undef๋Š” ์ •์ƒ์ ์ธ ๋น„ํŠธ ํŒจํ„ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์€ mem::zeroed() ๊ฐ€ mem::uninitialized() ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ธก๋ฉด์ž…๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ

๋‹น์‹ ์€ ์ด์ „์— ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ† ๋ก ์— ์ฐธ์—ฌํ–ˆ์ง€๋งŒ ๋” ๋„๋ฆฌ ํผ์ง€๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ฒŒ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ์šฐ๋ฆฌ๊ฐ€ Fuchsia์—์„œ ๋งŽ์€ ๊ธฐ์กด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ํŠน์„ฑ (FromBytes)๊ณผ ํŒŒ์ƒ ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์— ๋Œ€ํ•ด. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (cc @gnzlbg @joshlf)์— ์ถ”๊ฐ€ํ•˜๊ธฐ์œ„ํ•œ ๋‚ด๋ถ€ Pre-RFC๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋…ผ์˜๋Š” ์œ ํ˜•๊ฐ„์— ์•ˆ์ „ํ•œ memcpy ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ˆ์ง€๋งŒ ๋ณต์‚ฌ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ฑฐ์˜ ์ง๊ตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ฃ์œผ๋ฉด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋น ์ ธ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

๋˜ํ•œ, ์•ˆ์ „ํ•œ Rust์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ ํ˜•ํƒœ ์ธ ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋…ผ์˜ํ•œ ๋ชจ๋“  ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ถˆ๊ฑด์ „ํ•˜๋‹ค๋Š” ์˜๊ฒฌ๋„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ดˆ๊ธฐํ™” ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ฃ์œผ๋ฉด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

IIRC, ๊ฑฐ๊ธฐ์—์„œ ์•„๋ฌด๋„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ฃ๊ณ  ์ดˆ๊ธฐํ™” ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ ๋…ผ์˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ํ† ๋ก ์ด์ด ํ† ๋ก ๊ณผ ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๋“ค์€ ์™„์ „ํžˆ ์ง๊ฐ์ž…๋‹ˆ๋‹ค.

ํฌ์ธํŠธ ํ™ˆ์„ ์กฐ๊ธˆ ๋” ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•ด LLVM์€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ "์ผ๋ถ€ ์ž„์˜์ ์ด์ง€๋งŒ ์œ ํšจํ•œ ๋น„ํŠธ ํŒจํ„ด"๊ณผ ๊ตฌ๋ณ„๋˜๋Š” Poison์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Poison ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„๊ธฐํ•˜๊ฑฐ๋‚˜์ด๋ฅผ ์—ญ ์ฐธ์กฐ ๋œ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ UB์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ˆํƒ€๊น๊ฒŒ๋„ "๋ชจ๋“  ๋น„ํŠธ ํŒจํ„ด์ด ๊ดœ์ฐฎ์€ ์œ ํ˜•"์€ ๋ณ„๋„๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด UB๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊ตฌ์„ฑํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งž์•„, ๋ฏธ์•ˆํ•ด, ๋‚ด๊ฐ€ ๋ฌด์Šจ ๋œป์ธ์ง€ ๋ช…ํ™•ํžˆ ํ–ˆ์–ด์•ผ ํ–ˆ์–ด. "๋ชจ๋“  ๋น„ํŠธ ํŒจํ„ด์ด ๊ดœ์ฐฎ์€ ์œ ํ˜•"์€ ์ด๋ฏธ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ •์˜ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @RalfJung์ด ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด,

undef๋Š” ์ •์ƒ์ ์ธ ๋น„ํŠธ ํŒจํ„ด์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์„ ์ฝ์„ ์ˆ˜์žˆ๋Š” ๋ถ„๋“ค์ด ๊ณ„์‹œ ๋‹ˆ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค, ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๋งํ•˜๊ณ ์žํ•˜๋Š” ๊ฒƒ์€ : ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ๋ชจ๋“  ์ดˆ๊ธฐํ™” ๋œ ๋น„ํŠธ ํŒจํ„ด์ด ๊ดœ์ฐฎ์€ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค-๋ชจ๋“  i* ๋ฐ u* ์œ ํ˜•, ์›์‹œ ํฌ์ธํ„ฐ, ์ œ ์ƒ๊ฐ์—๋Š” f* ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ๋Ÿฐ ์œ ํ˜•์œผ๋กœ ๋งŒ ๊ตฌ์„ฑ๋œ ํŠœํ”Œ / ๊ตฌ์กฐ์ฒด.

๊ณต๊ฐœ ๋œ ์งˆ๋ฌธ์€ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋„๋ก ํ—ˆ์šฉ๋˜๋Š”์ง€, ์ฆ‰ ๋…์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋Œ€๋‹ต์€ "์ ˆ๋Œ€"์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, ์•ˆ์ „ํ•œ Rust์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ ํ˜•ํƒœ ์ธ ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋…ผ์˜ํ•œ ๋ชจ๋“  ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ถˆ๊ฑด์ „ํ•˜๋‹ค๋Š” ์˜๊ฒฌ๋„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ดˆ๊ธฐํ™” ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ฃ์œผ๋ฉด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋ฅผ MaybeUninit<u8> ๋กœ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์•ˆ์ „ํ•œ Rust์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ ํ˜•ํƒœ ์ธ ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋…ผ์˜ํ•œ ๋ชจ๋“  ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ถˆ๊ฑด์ „ํ•˜๋‹ค๋Š” ์˜๊ฒฌ๋„์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ดˆ๊ธฐํ™” ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ฃ์œผ๋ฉด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋ฅผ MaybeUninit๋กœ ์ฝ๊ธฐ๊ดœ์ฐฎ์„๊ฑฐ์•ผ.

์š”์ปจ๋Œ€ ๋…ผ์˜๋Š” ํŠน์„ฑ์„ ์ œ๊ณต์— ์žˆ์—ˆ๋‹ค Compatible<T> ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, fn safe_transmute(self) -> T ํ•˜๋Š” "์žฌ ํ•ด์„"/ "memcpys"์˜ ๋น„ํŠธ self ๋กœ T . ์ด ๋ฉ”์„œ๋“œ์˜ ๋ณด์žฅ์€ self ์ด ์ œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๊ฒฐ๊ณผ T ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ „์ด ๊ตฌํ˜„์„ ์ž๋™์œผ๋กœ ์ฑ„์šฐ๋„๋ก ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด impl Compatible<V> for U ๋ฐ impl Compatible<W> for V ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ impl Compatible<W> for U (์ œ๊ณต ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์™„์ „ํžˆ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด unsafe ์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Self ์— ํ•„๋“œ๊ฐ€์žˆ๋Š” ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๊ฐ€์žˆ๋Š” T ๋Œ€ํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. T ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋๋‚ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด MaybeUninit<u8> ๊ณผ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ƒ์ƒํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๋ธ”๋žญํ‚ท impl : unsafe impl<T> Compatible<[MaybeUninit<u8>; size_of::<T>()]> for T { ... } ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜•์„ [MaybeUninit<u8>; N] ํฌ๊ธฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ์œ ํ˜•์— ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. MaybeUninit ๊ฐ€ ๊ณต์šฉ์ฒด์ด๊ณ  [MaybeUninit<u8>; N] ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ฐฐ์—ด์˜ ํŠน์ • ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ impl์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค

@gnzlbg ๊ทธ๋•Œ ๋‹น์‹ ์€ FromBits<T> for [u8] ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•˜๊ณ  [MaybeUninit<u8>] ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

RustConf ์˜ @nikomatsakis์™€์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ๊ณ  ๊ทธ๋Š” RFC๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ๊ถŒ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ์ฃผ ์•ˆ์—ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉด ์ด๋ฒˆ ์ฃผ๋ง์—ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์— ์œ ์šฉํ• ๊นŒ์š”?

@joshlf ์–ด๋–ค ์ œ์•ˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฟก๋ฟก

@gnzlbg ๊ทธ๋•Œ๋Š” FromBits์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.[u8]. ์—ฌ๊ธฐ์„œ [MaybeUninit] ๋Œ€์‹ .

Gotcha, ์—ฌ๊ธฐ์— ์™„์ „ํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋„ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์™„์ „ํžˆ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜†

@joshlf ์–ด๋–ค ์ œ์•ˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

FromBits / IntoBits ์ œ์•ˆ. TLDR : T: FromBits<U> ์ˆ˜๋‹จ ์œ ํšจํ•œ ์ž„์˜์˜ ๋น„ํŠธ ํŒจํ„ด U ์œ ํšจํ•œ์— ๋Œ€์‘ T . U: IntoBits<T> ๋Š” ๊ฐ™์€ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŠน์ • ๊ทœ์น™์ด ์ฃผ์–ด์ง€๋ฉด ๋ชจ๋“  ์œ ํ˜• ์Œ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ๋ชจ๋‘ ์ถ”๋ก ํ•˜๋ฏ€๋กœ ํ˜„์žฌ unsafe ํ•„์š”๋กœํ•˜๋Š” ๋งŽ์€ ์žฌ๋ฏธ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด RFC์˜ ์ดˆ์•ˆ์ด ์—ฌ๊ธฐ ์— ์žˆ๋Š”๋ฐ ์–ผ๋งˆ ์ „์— ์ž‘์„ฑํ•œ ๊ฒƒ์ด์ง€๋งŒ, ๊ทธ ๋‚ด์šฉ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํ…์ŠคํŠธ๋ฅผ ๋Œ€๋žต์ ์ธ ๊ฐ€์ด๋“œ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@joshlf ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ํ•œ ์Œ์˜ ํŠน์„ฑ์ด ํ† ๋ก ์˜ ์ผ๋ถ€๊ฐ€๋˜๊ธฐ

  • ์ฐธ์กฐ ์•„๋ž˜์—์„œ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ๋ณผ ๋•Œ ๋‚˜๋Š” ์ ์  ๋” ๊ฐ•ํ•˜๊ฒŒ ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ์— ๋”ฐ๋ผ MaybeUninit::get_mut ๋ฌธ์„œ๋ฅผ ์กฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ UB๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์ „์— ์—ญ ์ฐธ์กฐ ํ•˜๋Š” ๊ฒƒ์€ UB์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋จผ์ € ๊ทธ ๊ฒฐ์ •์„ ํƒ€๋‹น์„ฑ์„ ์œ„ํ•ด ๋‚ด๋ ค์•ผํ•˜๋Š”๋ฐ, ๊ทธ ์žฅ์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ „์šฉ RFC์ผ๊นŒ์š”?
  • u8 (๋ฐ ๊ธฐํƒ€ ์ •์ˆ˜ ์œ ํ˜•, ๋ถ€๋™ ์†Œ์ˆ˜์ , ์›์‹œ ํฌ์ธํ„ฐ)๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰, MaybeUinit<u8>::uninitialized().into_inner() insta-UB์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ์šฐ๋ฆฌ๊ฐ€ poison / undef ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์žฅ์†Œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ง๊ฐ์— ๊ทผ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„ค๋“ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฏธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค).

์ฐธ์กฐ ์•„๋ž˜์—์„œ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๊นŒ?

@RalfJung "์ฐธ์กฐ ์•„๋ž˜

u8 (๋ฐ ๊ธฐํƒ€ ์ •์ˆ˜ ์œ ํ˜•, ๋ถ€๋™ ์†Œ์ˆ˜์ , ์›์‹œ ํฌ์ธํ„ฐ)์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰, MaybeUinit์ž…๋‹ˆ๋‹ค.:: uninitialized (). into_inner () insta-UB?

์ธ์Šคํ„ดํŠธ UB๊ฐ€ ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? ๊ทธ ๊ฐ€์น˜๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์ด ๊ฒฐ์ •์ ์ž…๋‹ˆ๊นŒ?

UB๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ ๋Š” ๊ฐ€์น˜๋ฅผ ๋งž์ถœ ์ˆ˜ ์—†๋‹ค๋ฉด mem::uninitialized ๋‹ค์‹œ ๋ฐœ๋ช… ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ๋™์ผํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜, ์˜ตํŠธ ๋ ˆ๋ฒจ ๋“ฑ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” mem::zeroed ๋‹ค์‹œ ๋ฐœ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  MaybeUninit ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

u8 (๋ฐ ๊ธฐํƒ€ ์ •์ˆ˜ ์œ ํ˜•, ๋ถ€๋™ ์†Œ์ˆ˜์ , ์›์‹œ ํฌ์ธํ„ฐ)๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰, MaybeUinit<u8>::uninitialized().into_inner() insta-UB์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ์šฐ๋ฆฌ๊ฐ€ poison / undef ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์žฅ์†Œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ง๊ฐ์— ๊ทผ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„ค๋“ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ฏธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค).

FWIW, ์ด๊ฒƒ์ด UB๊ฐ€ ์•„๋‹Œ ๊ฒƒ์˜ ๋‘ ๊ฐ€์ง€ ์ด์ ์€ a) LLVM์ดํ•˜๋Š” ์ผ๊ณผ ์ผ์น˜ํ•˜๊ณ , b) ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ wrt ์ตœ์ ํ™”๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฑด์„ค ์‹œ๊ฐ„์ด ์•„๋‹Œ ์‚ฌ์šฉ ์‹œ๊ฐ„์— ์•ˆ์ „์„ ์ •์˜ํ•˜๊ธฐ์œ„ํ•œ ์ตœ๊ทผ ์ œ์•ˆ๊ณผ ๋” ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ธ์Šคํ„ดํŠธ UB๊ฐ€ ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? ๊ทธ ๊ฐ€์น˜๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์ด ๊ฒฐ์ •์ ์ž…๋‹ˆ๊นŒ?

UB๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ ๋Š” ๊ฐ€์น˜๋ฅผ ๋งž์ถœ ์ˆ˜ ์—†๋‹ค๋ฉด mem::uninitialized ๋‹ค์‹œ ๋ฐœ๋ช… ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ๋™์ผํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ญ์ƒ ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜, ์˜ตํŠธ ๋ ˆ๋ฒจ ๋“ฑ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด mem::zeroed ๋‹ค์‹œ ๋ฐœ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  MaybeUninit ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ธŒ๋žœ์น˜ ๋˜๋Š” ์ธ๋ฑ์‹ฑ ํ•  UB๋กœ ์ •์˜ํ•˜๋ฉด LLVM์„ ์ตœ์ ํ™” ํ•  ์—ฌ์ง€๊ฐ€ ๋” ๋งŽ์œผ๋ฏ€๋กœ ํŠนํžˆ ๊ฐ•๋ ฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€์—†๋Š” ๊ฒฝ์šฐ ์†์„ ๋” ๋ฌถ๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‚ด๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์•˜๊ณ , ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด MaybeUinit<u8>::uninitialized().into_inner() ์™€ ๋‹จ์ง€ mem::uninitialized() ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

@RalfJung "์ฐธ์กฐ ์•„๋ž˜

๋ณธ์งˆ์ ์œผ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์Œ์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

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

์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ (์ฆ‰, "์ฐธ์กฐ ์•„๋ž˜ ๋ฐ˜๋ณต"์ด๋ผ๋Š” ์˜๋ฏธ)์ด ์ฝ”๋“œ๋Š” UB์ž…๋‹ˆ๋‹ค.

์ธ์Šคํ„ดํŠธ UB๊ฐ€ ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? ๊ทธ ๊ฐ€์น˜๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์ด ๊ฒฐ์ •์ ์ž…๋‹ˆ๊นŒ?

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ u8 ๋Š” ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๊ฒ€์‚ฌ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. match ๋Š” ์ด๋ฆ„์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์‹ค์ œ๋กœ ๋™๋“ฑ์„ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋“ฑ ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ž๋Š” ๊ดœ์ฐฎ์ง€ ๋งŒ ํ›„์ž๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์‹œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

๋ณธ์งˆ์ ์œผ๋กœ ์ด๊ฒƒ์€ miri๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

UB๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ ๋Š” ๊ฐ€์น˜๋ฅผ ๋งž์ถœ ์ˆ˜ ์—†๋‹ค๋ฉด mem :: uninitialized๋ฅผ ๋‹ค์‹œ ๋ฐœ๋ช… ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์™œ ๊ทธ๋Ÿด๊นŒ์š”? mem::uninitialized ์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์œ ํšจํ•œ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ œํ•œ์ด์žˆ๋Š” ์œ ํ˜•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. u8 ์— ๊ทธ๋Ÿฌํ•œ ์ œํ•œ์ด ์—†๋‹ค๊ณ  ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ mem::uninitialized() ๋Š” u8 ๋Œ€ํ•ด ๊ดœ์ฐฎ ์•˜์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์ฝ”๋“œ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์–ด๋Š ์ชฝ์ด๋“  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ u8 ๋ฅผ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ณ์ง€ ์•Š์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” &mut "์ผ์น˜"ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. IOW, ์œ„์—์„œ ์„ค๋ช…ํ•œ bool ์˜ˆ์ œ๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค์Œ์€ ํ™•์‹คํžˆ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

let mut b = MaybeUninit::<bool>::uninitialized();
let bref = b.get_mut();
match bref {
  &b => // insta-UB! We have a bad bool in scope.
}

์ด๊ฒƒ์€ match ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ํฌ์ธํ„ฐ ์—ญ ์ฐธ์กฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

FWIW, ์ด๊ฒƒ์ด UB๊ฐ€ ์•„๋‹Œ ๊ฒƒ์˜ ๋‘ ๊ฐ€์ง€ ์ด์ ์€ a) LLVM์ดํ•˜๋Š” ์ผ๊ณผ ์ผ์น˜ํ•˜๊ณ , b) ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ wrt ์ตœ์ ํ™”๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฑด์„ค ์‹œ๊ฐ„์ด ์•„๋‹Œ ์‚ฌ์šฉ ์‹œ๊ฐ„์— ์•ˆ์ „์„ ์ •์˜ํ•˜๊ธฐ์œ„ํ•œ ์ตœ๊ทผ ์ œ์•ˆ๊ณผ ๋” ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?
LLVM์€ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” MIR ์ตœ์ ํ™”์— ๋Œ€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ๊ฒŒ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ด€์ ์„ ํ˜•์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ž˜ u* ๋ฐ i* ๋Œ€ํ•ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ (์ฆ‰, "์ฐธ์กฐ ์•„๋ž˜ ๋ฐ˜๋ณต"์ด๋ผ๋Š” ์˜๋ฏธ)์ด ์ฝ”๋“œ๋Š” UB์ž…๋‹ˆ๋‹ค.

์•Œ์•˜์–ด.

mem :: uninitialized์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์œ ํšจํ•œ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ œํ•œ์ด์žˆ๋Š” ์œ ํ˜•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

mem::uninitialized ์—๋Š” ์œ„์—์„œ ์ง€์ ํ•œ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์Œ UB๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

MaybeUninit ๋ฅผ ๋„์ž… ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ํ•ญ์ƒ ์œ ๋‹ˆ์˜จ์„ ์ดˆ๊ธฐํ™” (์˜ˆ : ๋‹จ์œ„๋กœ)ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ํ•„๋“œ๋ฅผ u8 ํ•˜๊ณ  UB๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ptr::write ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์•ฝ๊ฐ„ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. into_inner ๊ฐ€ ๋‹ค์Œ๋ณด๋‹ค ๋” ๋‚˜์€์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋‘˜ ๋‹ค ๋‚˜์—๊ฒŒ ์ •์˜๋˜์ง€ ์•Š์€ ํ–‰๋™ ์‹œํ•œ ํญํƒ„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?
LLVM์€ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” MIR ์ตœ์ ํ™”์— ๋Œ€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์˜๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ค ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ๋”ฐ๋ผ์„œ Rust ์˜๋ฏธ๋ก ์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด LLVM์˜ undefined ๋ฒ„์ „์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ๊ฒŒ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ด€์ ์„ ํ˜•์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณต์ • ํ•ด.

์ฆ‰, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ž˜ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค์˜ ์ข‹์€ ์‚ฌ์šฉ์ด ์ตœ๊ทผ์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ตœ์†Œํ•œ u* ๋ฐ i* ๋Œ€ํ•ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ธ์ˆ˜ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ณด์œ ํ•˜๋Š” ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ?

๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ -ํ•˜์ง€๋งŒ -ํ•˜์ง€ - ๋… ๊ฒƒ์„ ํ•œ ๊ณณ์—์„œ &mut [u8] ์œ„ํ•œ ๋„์›€์ด ๋  ์ˆ˜ Read::read - ์šฐ๋ฆฌ๋Š” ๋ฒ„ํผ๋ฅผ ์ œ๋กœ๋กœ ํ•„์š” ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ์ข€ ์ด์ƒํ•œ ๋•Œ๋ฌธ์— Read impl์€ ๊ทธ๋ƒฅ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ -ํ•˜์ง€๋งŒ -ํ•˜์ง€ - ๋… ๊ฒƒ์„ ํ•œ ๊ณณ์—์„œ &mut [u8] ์œ„ํ•œ ๋„์›€์ด ๋  ์ˆ˜ Read::read - ์šฐ๋ฆฌ๋Š” ๋ฒ„ํผ๋ฅผ ์ œ๋กœ๋กœ ํ•„์š” ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ์ข€ ์ด์ƒํ•œ ๋•Œ๋ฌธ์— Read impl์€ ๊ทธ๋ƒฅ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„์ด๋””์–ด๋Š” MaybeUninit ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด์ง€ ๋งŒ ์ •์˜๋˜์ง€ ์•Š์€ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ฉด, ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ (์˜ˆ : ํŒจ๋”ฉ ํ•„๋“œ)๋Š” LLVM ํฌ์ด์ฆŒ ๊ฐ๊ฐ์—์„œ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์œผ๋กœ MaybeUninit์— ์ ์šฉ ํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ๋Š” ๋‚ด์šฉ์„ ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ •์˜๋˜์—ˆ์ง€๋งŒ ์ž„์˜์  ์ธ ๊ฒƒ์œผ๋กœ "๊ณ ์ •"ํ•˜๋Š” API๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์˜๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ค ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ๋”ฐ๋ผ์„œ Rust ์˜๋ฏธ๋ก ์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด LLVM์˜ undefined ๋ฒ„์ „์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ œ์•ˆ์ด ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. poison ์— ๋ธŒ๋žœ์น˜ ํ•˜๊ธฐ ์œ„ํ•ด UB ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋กœ์ปฌ u8 poison ๋ฅผ ๋‹จ์ˆœํžˆ "๊ฐ–๋Š”"๊ฒƒ์ด UB์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ณด์œ ํ•˜๋Š” ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ?

์Šฌ๋ผ์ด์Šค๋Š” ์ฐธ์กฐ์™€ ๊ฐ™์œผ๋ฏ€๋กœ &mut [u8] ์˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ก ๋งŒํ•˜๋Š” ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค (์ฐธ์กฐ ์œ ํšจ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ๊ฐ€์ •).

๋ฟก๋ฟก

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋…์ด ์•„๋‹Œ & mut [u8]์ด ์œ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ณณ์€ Read :: read์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ƒํ•œ Read impl์ด ๊ทธ๊ฒƒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํผ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋„๋กํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ๋ณด๋‹ค๋Š”

์Œ, &out ์—†์ด๋Š” ๋‹น์‹ ์ด impl์„ ์•Œ๊ณ ์žˆ์„ ๋•Œ๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์•ˆ์ „ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋ถ€๋ฅผ 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 ํ˜ผ๋ž€ ์Šค๋Ÿฌ์›€์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ด๊ฒƒ์€ 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 impls Deref ๋ฐ DerefMut ์ด๋ฏ€๋กœ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—์„œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ์ฐธ์กฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ดˆ๊ธฐํ™” ๋œ ์›๋ณธ์ด ์ „๋‹ฌ ๋œ ์ฐธ์กฐ์ด๋ฉฐ ์ž„์˜์˜ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ณด์žฅ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ์ด๋‹ˆ์…œ ๋ผ์ด์ €๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

struct Foo {
    a: i32,
    b: u8,
}

fn init_foo<'a>(dest: Uninitialized<'a, Foo>,
                init_a: impl for<'x> FnOnce(Uninitialized<'x, i32>) -> DidInit<'x, i32>,
                init_b: impl for<'x> FnOnce(Uninitialized<'x, u8>) -> DidInit<'x, u8>)
                -> &'a mut DidInit<'a, Foo> {
    let ptr: *mut Foo = dest.ptr;
    unsafe {
        init_a(Uninitialized::new(&mut (*ptr).a));
        init_b(Uninitialized::new(&mut (*ptr).b));
        dest.did_init()
    }
}

์ด ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณต ํ•œ ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ•„๋“œ๋ฅผ ์ฐจ๋ก€๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ Foo ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์ด DidInit ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜์ง€๋งŒ ๊ทธ ๊ฐ’์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ํ›„์—๋Š” ์ „์ฒด ๊ฒƒ์„ ์•Œ๊ณ  Foo ์œ ํšจํ•ฉ๋‹ˆ๋‹ค - ๊ทธ๊ฒƒ์€ ํ˜ธ์ถœ ๋•Œ๋ฌธ์— did_init() ์—์„œ Uninitialized<'a, Foo> ๋‹จ์ง€์— ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค, ํ•ด๋‹น DidInit ์œ ํ˜•, init_foo ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋Š” ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์‹ค์ œ ๋ฒ„์ „์€ ์†Œ๋ฉธ์ž์™€ ํŒจ๋‹‰์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋”์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค (๊ฐœ์„ ์ด ํ•„์š”ํ•˜์ง€๋งŒ).

์–ด์จŒ๋“ , ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋†€์ดํ„ฐ ๋งํฌ

(์ฐธ๊ณ  : DidInit<'a, T> ์‚ฌ์‹ค์— ๋Œ€ํ•œ ํ˜•์˜ ๋ณ„๋ช…์ž…๋‹ˆ๋‹ค &'a mut _DidInitMarker<'a, T> ์™€ ํ”ผํ•  ์ˆ˜๋ช… ๋ฌธ์ œ๋กœ DerefMut .)

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์œ„์˜ ์—ฐ๊ฒฐ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์†Œ๋ฉธ์ž๋ฅผ ๋ฌด์‹œํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ T ์˜ ์†Œ๋ฉธ์ž๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ DidInit<โ€˜a, T> ์ฑ…์ž„์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ณ„์นญ์ด ์•„๋‹Œ ๊ตฌ์กฐ์ฒด ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹จ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋ฐฐ๋ถ€ ์ˆ˜ T ์‚ด์•„์žˆ๋Š”๋งŒํผ ๊ฐ™์€ ๊ฒƒ์„ DidInit ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋ชจ๋‘๋ฅผ ์œ„ํ•ด โ€™a (๊ทธ๋ ‡์ง€ ๋‹น์‹ ์ด ํŒŒ๊ดด ์ดํ›„์— ๊ณ„์† ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์ด์ „์— set ์—์„œ ์š”์ฒญํ•œ ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•˜๋Š” +1์ด์ง€๋งŒ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด๋ฆ„์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? 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 ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ UB์ž…๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ?

@Pzixel ์ด๊ฒƒ์€ ๋ชจ๋‘ MaybeUninit ์— ๋Œ€ํ•œ API ๋ฌธ์„œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

some_native_function ์ด NOP์ด๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ foo_ref.value (๋˜๋Š” ์˜คํžˆ๋ ค ํ•  foo_ref.as_mut() ๋‹น์‹ ์€ ๋‹จ์ง€ ๊ณต์šฉ API ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”) ๋ชจ๋“  ๊ฒƒ์ด ์ดˆ๊ธฐํ™”๋˜๋ฉด ํ•จ์ˆ˜ ๋งŒ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— UB์ž…๋‹ˆ๋‹ค.

MaybeUninit ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์•ˆ์ „ํ•˜์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ชจ๋‘ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ •๋ณด๊ฐ€ ์œ ํ˜•์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ’‹ ๊ฑด์ด ์ ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์— ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์ƒ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด @sfackler ์™€

์ฃผ์š” ์งˆ๋ฌธ์€ mem::zeroed ์ด MaybeUninit<NonZeroU8> ์˜ ํ˜„์žฌ ๊ตฌํ˜„ ์ œ์•ˆ์— ๋Œ€ํ•ด ์œ ํšจํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ํ‘œํ˜„์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— "uninit"์ƒํƒœ์—์„œ ๊ฐ’์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ค ์šฉ๋„๋กœ๋“  ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํŒจ๋”ฉ ์ผ ๋ฟ์ด๋ฉฐ "๊ฐ’"์ƒํƒœ์—์„œ๋Š” mem::zeroed ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค ( NonZero ๋•Œ๋ฌธ์—

๋” ์ง„๋ณด ๋œ ์—ด๊ฑฐ ํ˜• ํŒ๋ณ„ ํŒจํ‚น (์ง€๊ธˆ๋ณด๋‹ค)์„ ๊ฐ€์ง„ ๋ฏธ๋ž˜ํ˜• ๋ ˆ์ด์•„์›ƒ ์‹œ์Šคํ…œ์€ ํŒ๋ณ„์ž๋ฅผ "๊ฐ’"์ƒํƒœ์˜ "uninit"์ƒํƒœ / ์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํŒจ๋”ฉ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ƒ ์‹œ์Šคํ…œ์—์„œ Option<MaybeUninit<NonZeroU8>> ์˜ ํฌ๊ธฐ๋Š” 1์ด์ง€๋งŒ ํ˜„์žฌ๋Š” 2์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๊ฐ€์ƒ ์‹œ์Šคํ…œ์—์„œ Some(MaybeUninit::uninitialized()) ๋Š” None ๊ตฌ๋ณ„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ์ด๋™ํ•˜๋ฉด MaybeUninit (๊ณต์šฉ API๋Š” ์•„๋‹˜)์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ์—์„œ NonZeroU8 ์™€ &'static i32 ์‚ฌ์ด์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค "0"์ด ์œ ํšจ ํ•˜์ง€ MaybeUninit<T>::zeroed().into_inner() ๋Š” insta-UB์ž…๋‹ˆ๋‹ค.

Option<Union> ๊ฐ€ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๊ณต์šฉ์ฒด์˜ ์œ ํšจ์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜์ง€๋งŒ () ์œ ํ˜•์˜ ๋ณ€ํ˜•์ด์žˆ๋Š” ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋น„ํŠธ ํŒจํ„ด์ด ์œ ํšจํ•˜๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅ ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” MaybeUninit ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Option<MaybeUninit<NonZeroU8>> ํฌ๊ธฐ๋Š” 1์ด ์•„๋‹™๋‹ˆ๋‹ค.

() ์œ ํ˜•์˜ ๋ณ€ํ˜•์ด์žˆ๋Š” ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋น„ํŠธ ํŒจํ„ด์ด ์œ ํšจํ•˜๋ฏ€๋กœ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

"() ์œ ํ˜•์˜ ๋ณ€ํ˜•์ด์žˆ๋Š” ์กฐํ•ฉ"์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์˜ ์•ˆ์ •ํ™”๋Š” Rust ABI์˜ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์•”์‹œ ์ ์œผ๋กœ ์•ˆ์ •ํ™”ํ•ฉ๋‹ˆ๊นŒ? struct UnitType; ๋˜๋Š” struct NewType(()); ํฌํ•จ ๋œ union struct NewType(()); ์–ด๋–ป์Šต๋‹ˆ๊นŒ? struct Padded (์•„๋ž˜)๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? union ํฌํ•จ ๋œ struct Padded ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

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

๋‚ด ๋ง์€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์˜ํ•˜๋Š” ์œ ์ผํ•œ ๋‚ด์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ตฌ์ฒด์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. :) ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํฌ๊ธฐ์—๋งŒ ์˜์กดํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ๋ชจ๋“  ZST๊ฐ€ ์ด๊ฒƒ์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š”์ด ๋ณ€ํ˜•์ด ํ•„์š”ํ•˜์ง€๋„ ์•Š๊ณ  ๊ณต์šฉ์ฒด๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ์˜ ํ•ฉ์˜๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ํ† ๋ก ์„ ํ•  ๊ฒƒ์ด๋ฉฐ UCG repo์˜ ๋‹ค์Œ ํ† ๋ก 

์ด ๊ธฐ๋Šฅ์˜ ์•ˆ์ •ํ™”๋Š” Rust ABI์˜ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์•”์‹œ ์ ์œผ๋กœ ์•ˆ์ •ํ™”ํ•ฉ๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹Œ ์œ ํšจ์„ฑ ๋ถˆ๋ณ€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (ABI๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์ฐธ์กฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ์ด ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ABI๋ฅผ ์•ˆ์ •ํ™” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ ๊ตฌ๋ณ„๋˜๋ฉฐ ์‹ค์ œ๋กœ ํ˜„์žฌ ๋…ธ์กฐ์˜ ABI์— ๋Œ€ํ•œ ๋…ผ์˜ ๊ฐ€

์ด๋“ค์€ ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ ๊ตฌ๋ณ„๋˜๋ฉฐ ์‹ค์ œ๋กœ ํ˜„์žฌ ๋…ธ์กฐ์˜ ABI์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

AFAICT ๋…ผ์˜๋Š” ๊ณต์šฉ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ, ๊ณต์šฉ์ฒด๊ฐ€ ํ•จ์ˆ˜ ๊ฒฝ๊ณ„๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ABI์™€ ๊ด€๋ จ์ด์žˆ์„ ์ˆ˜์žˆ๋Š” ๊ธฐํƒ€ ์‚ฌํ•ญ์€ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UCG ์ €์žฅ์†Œ์˜ ๋ชฉ์ ์ด Rust ์šฉ ABI๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Œ, ๋ชฉํ‘œ๋Š” C์™€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•ด ์ถฉ๋ถ„ํ•œ ๊ฒƒ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "Rust bool ๋ฐ C bool ๋Š” ABI์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค."

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ repr(Rust) ๊ฒฝ์šฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ABI๋ฅผ ์ •์˜ ํ•  ๊ณ„ํš์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋‹จ์ˆœํžˆ ๋ˆ„๋ฝ์ด ์•„๋‹Œ ๊ฒฐ๊ณผ ๋ฌธ์„œ๊ฐ€ ์ทจํ•˜๋Š” ํ˜•์‹์— ๊ด€๊ณ„์—†์ด ๋ช…์‹œ์ ์ธ ์ง„์ˆ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Foo ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ ๋œ Option<Foo> ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋…ผ์Ÿ์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

union Foo {
   bar: NonZeroUsize,
   baz: &'static str,
}

@Kixunil ์€ https://github.com/rust-rfcs/unsafe-code-guidelines/issues/13 ์—์„œ ์ œ๊ธฐ ํ•  ์ˆ˜ MaybeUninit ์™€ (๊ณผ) ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ์ •์  ๋ณ€์ˆ˜๋ฅผ ํฌํ•จ ํ•  ์„น์…˜์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
"C"์—์„œ๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ํŒŒ์ผ์— uint8_t a[100]; ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐํ˜ธ๊ฐ€ .bss ์„น์…˜์— ๋ฐฐ์น˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. uint8_t a[100] = {}; ์“ฐ๋ฉด a ๊ธฐํ˜ธ๊ฐ€ .data ์„น์…˜์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค (์ด๋Š” main ์ด์ „์— FLASH์—์„œ RAM์œผ๋กœ ๋ณต์‚ฌ ๋จ).

MaybeUninit๋ฅผ ์‚ฌ์šฉํ•œ Rust์˜ ์ž‘์€ ์˜ˆ์ž…๋‹ˆ๋‹ค :

struct A {
    data: MaybeUninit<[u8; 100]>,
    len: usize,
}

impl A {
    pub const fn new() -> Self {
        Self {
            data: MaybeUninit::uninitialized(),
            len: 0,
        }
    }
}

static mut a: MaybeUninit<[u8; 100]> = MaybeUninit::uninitialized();
static mut b: A = A::new();

์–ด๋–ค ์„น์…˜์— a ๋ฐ b ๊ธฐํ˜ธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๊นŒ?

์ถ”์‹  : ๊ธฐํ˜ธ ๋งน ๊ธ€๋ง์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์ง€๋งŒ์ด ์งˆ๋ฌธ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ qwerty19106 ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ a ๋ฐ b ๋ชจ๋‘ .bss ๋ฉ๋‹ˆ๋‹ค. LLVM์€ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ์„น์…˜์„ ์„ ํƒํ•  ๋•Œ MaybeUninit::uninitialized() ์™€ ๊ฐ™์€ undef ๊ฐ’์„ 0์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

A::new() len ๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค๋ฉด b ๋Š” .data ์—์„œ ๋๋‚ฌ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. static ์— 0์ด ์•„๋‹Œ ๊ฐ’์ด ํฌํ•จ ๋œ ๊ฒฝ์šฐ ๋ณ€์ˆ˜๋Š” .data ํ•ฉ๋‹ˆ๋‹ค. ํŒจ๋”ฉ์€ 0 ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด LLVM์ดํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. Rust๋Š” static ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ ๋ง์ปค ์„น์…˜์— ๋Œ€ํ•ด ~ ๋ณด์žฅ ~ ์•ฝ์† (*)ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ LLVM์˜ ๋™์ž‘์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.

(*) #[link_section] ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค : ๊ณ ๋ ค ๋ช‡ ๊ฐ€์ง€ ํฌ์ธํŠธ LLVM์—์„œ undef ์•„๋‹Œ ๊ฐ’ ์ •๋„๋กœ ๋ณ€์ˆ˜ a ์—์„œ ๋๋‚œ ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ .data . # 41315๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ท€ํ•˜์˜ ๋‹ต๋ณ€์— ๋Œ€ํ•ด @japaric ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ ๋งค์šฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
.init_array ์„น์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ main ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ •์  mut ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐœ๋… ์ฆ๋ช…์ž…๋‹ˆ๋‹ค.

#[macro_export]
macro_rules! static_singleton {
    ($name_var: ident, $ty:ty, $name_init_fn: ident, $name_init_var: ident, $init_block: block) => {
        static mut $name_var: MaybeUninit<$ty> = unsafe {MaybeUninit::uninitialized()};

        extern "C" fn $name_init_fn() {
            unsafe {
                $init_block
            }
        }

        #[link_section = ".init_array"]
        #[used]
        static $name_init_var: [extern "C" fn(); 1] = [$name_init_fn];
    };
}

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ :

static_singleton!(A, u8, a_init_fn, A_INIT_VAR, {
    let ptr = A.get_mut();
    *ptr = 5;
});

fn main() {
    println!("A inited to {}", unsafe {&A.get_ref()});
}

๊ฒฐ๊ณผ : 5๋กœ ์ดˆ๊ธฐํ™” ๋จ

์ „์ฒด ์˜ˆ : ๋†€์ดํ„ฐ

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ :
concat_idents ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a_init_fn ๋ฐ A_INIT_VAR ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. # 1628 ์€ ์•„์ง ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํ…Œ์ŠคํŠธ๋Š”๋ณ„๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ๊ตฌ์กฐ์ฒด ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž„๋ฒ ๋””๋“œ์— ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( .bss์— ๋ฐฐ์น˜๋˜๋ฏ€๋กœ ๊ฒฝ์ œ์  ์ธ FLASH๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ).

rustc ๊ฐ€ .init_array ์„น์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ELF ํ˜•์‹์˜ ํ‘œ์ค€ ์„น์…˜์ž…๋‹ˆ๋‹ค ( ๋งํฌ ).

@ qwerty19106 main () ์ด์ „์˜ ์‚ถ์€ ์ž˜๋ชป๋œ ๊ธฐ๋Šฅ ์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ณ  Rust์˜ ์˜๋ฏธ์—์„œ ๋ช…์‹œ ์ ์œผ๋กœ ๋ถ„๋ฆฌ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ข‹์•„, ์ข‹์€ ์–ธ์–ด ๋””์ž์ธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ # [no_std] ์—๋Š” ํ˜„์žฌ ์ข‹์€ ๋Œ€์•ˆ์ด ์—†์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ๊ฒ€์ƒ‰์ด ๋‚˜์˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

spin :: Once๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ๋น„์Œ‰๋‹ˆ๋‹ค (๋ชจ๋“  ์ฐธ์กฐ ๊ฐ€์ ธ ์˜ค๊ธฐ์—์„œ Ordering :: SeqCst ).

์ž„๋ฒ ๋””๋“œ ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ๋น„์Œ‰๋‹ˆ๋‹ค (๋ชจ๋“  ์ฐธ์กฐ ๊ฐ€์ ธ ์˜ค๊ธฐ์— Ordering::SeqCst ).

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜ณ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  "ํ•œ ๋ฒˆ"์ถ”์ƒํ™”๊ฐ€ ์•ก์„ธ์Šค์‹œ ์™„ํ™”๋˜๊ณ  ์ดˆ๊ธฐํ™”์‹œ ๋™๊ธฐํ™”๋˜์–ด์•ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์ƒ๊ฐ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
cc @Amanieu @alexcrichton

@ qwerty19106 :

"์ž„๋ฒ ๋””๋“œ"๋ผ๊ณ  ํ•  ๋•Œ ๋ฒ ์–ด ๋ฉ”ํƒˆ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? .init_array ๋Š” ์‚ฌ์‹ค ELF ํ˜•์‹ ์ž์ฒด์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์— ์œ ์˜ํ•  ๊ฐ€์น˜๊ฐ€ System V ABI ยฒ์˜ ์ผ๋ถ€๋„ ์•„๋‹™๋‹ˆ๋‹ค. .init ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. Linux ABI๊ฐ€ ์ƒ์† ํ•˜๋Š” System V ABI ์ดˆ์•ˆ ์—…๋ฐ์ดํŠธ์— ๋„๋‹ฌ ํ•  ๋•Œ๊นŒ์ง€ .init_array ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฒ ์–ด ๋ฉ”ํƒˆ์—์„œ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ .init_array ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋™์  ๋กœ๋” ๋ฐ / ๋˜๋Š” libc์˜ ์ฝ”๋“œ์— ์˜ํ•ด ๋ฒ ์–ด ๋ฉ”ํƒˆ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋ถ€ํŠธ ๋กœ๋”๊ฐ€ .init_array ์—์„œ ์ฐธ์กฐ ๋œ ์ฝ”๋“œ ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š” ํ•œ ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1 : 28 ํŽ˜์ด์ง€, ๊ทธ๋ฆผ 1-13 "ํŠน์ˆ˜ ์„น์…˜"์ฐธ์กฐ
2 : 63 ํŽ˜์ด์ง€, ๊ทธ๋ฆผ 4-13 "ํŠน์ˆ˜ ์„น์…˜ (๊ณ„์†)"์ฐธ์กฐ

@eddyb Once ์ฝ์„ ๋•Œ๋Š” ์ตœ์†Œํ•œ Acquire ๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ x86์—์„œ๋Š” ์ •์ƒ์ ์ธ๋กœ๋“œ์ด๊ณ  ARM์—์„œ๋Š”๋กœ๋“œ + ํŽœ์Šค์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์€ load(SeqCst) ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜์—์„œ load(Acquire) ์™€ ๋™์ผํ•œ asm์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

(์ด ํ† ๋ก ์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ๋” ์ด์ƒ MaybeUninit ๋Œ€ mem :: uninitialized์™€๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค LLVM์ดํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ wrt ๋™์ž‘-undef๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ทธ undef๋กœ ๋ฌด์Šจ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€๋Š” ์—ฌ๊ธฐ์„œ ์ฃผ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. )

์˜ค์ „ 13 ์ผ 2018 ๋…„ 9 ์›” 00:59:20 MESZ schrieb Amanieu [email protected] :

@eddyb ์ตœ์†Œํ•œ Acquire ๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
Once ์ด๊ฒƒ์€ x86์—์„œ๋Š” ์ •์ƒ์ ์ธ๋กœ๋“œ์ด๊ณ  ARM์—์„œ๋Š”๋กœ๋“œ + ํŽœ์Šค์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์€ load(SeqCst) ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š”
๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜์—์„œ load(Acquire) ์™€ ๋™์ผํ•œ asm์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

-
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/53491#issuecomment -420825802

MaybeUninit ์ด (๊ฐ€) ๋งˆ์Šคํ„ฐ์— ๋„์ฐฉํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ ๋‚  ๋ฐค์—์žˆ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. :)

https://github.com/rust-lang/rust/issues/54470๋Š” ์‚ฌ์šฉ ์ œ์•ˆ Box<[MaybeUninit<T>]> ์— RawVec<T> . ๋ณ€ํ™˜์ด ๋” ์ ์€ ์ƒ์ž์™€ ์Šฌ๋ผ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์กฐํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋ ค๋ฉด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— API๋ฅผ ๋” ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

ํŠนํžˆ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ํ• ๋‹นํ•˜๋ ค๋ฉด ( Box::new(MaybeUninit::uninitialized()) ์—ฌ์ „ํžˆ size_of::<T>() ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?) :

impl<T> Box<MaybeUninit<T>> {
    pub fn new_uninit() -> Self {โ€ฆ}
    pub unsafe fn assert_init(s: Self) -> Box<T> { transmute(s) }
}

impl<T> Box<[MaybeUninit<T>]> {
    pub fn new_uninit_slice(len: usize) -> Self {โ€ฆ}
    pub unsafe fn assert_init(s: Self) -> Box<[T]> { transmute(s) }
}

core::slice / std::slice ์—์„œ ํ•˜์œ„ ์Šฌ๋ผ์ด์Šค๋ฅผ ์ทจํ•œ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pub unsafe fn assert_init<T>(s: &[MaybeUninit<T>]) -> &[T] { transmute(s) }
pub unsafe fn assert_init_mut<T>(s: &mut [MaybeUninit<T>]) -> &mut [T] { transmute(s) }

Box :: new (MaybeUninit :: uninitialized ())๋Š” ์—ฌ์ „ํžˆ size_of ::() ํŒจ๋”ฉ ๋ฐ”์ดํŠธ

๊ทธ๋ ‡๊ฒŒํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์œ„ํ•œ codegen ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ๋”ฉ ๋ฐ”์ดํŠธ๋Š” ๋น„ํŠธ ํ‘œํ˜„์ด ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณต์‚ฌ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค (๋น„ํŠธ ํ‘œํ˜„์„ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์–ด์จŒ๋“  UB์ž…๋‹ˆ๋‹ค).

์ข‹์Šต๋‹ˆ๋‹ค. Box::new_uninit ๊ฐ€ ๋ถˆํ•„์š”ํ• ๊นŒ์š”? ํ•˜์ง€๋งŒ Box::new ์—๋Š” T: Sized ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šฌ๋ผ์ด์Šค ๋ฒ„์ „์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

MaybeUninit::zeroed ์„ (๋ฅผ) const fn ์œผ๋กœ ์˜นํ˜ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. FFI์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์šฉ๋„ (์˜ˆ : 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•˜๋Š” ์ •์ )๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. zeroed ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@mjbshaw ๋Š” zeroed ๊ฐ€ min_const_fn ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ #[rustc_const_unstable(feature = "const_maybe_uninit_zeroed")] ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (https://github.com/rust-lang/ rust / issues / 53555) ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ์•ˆ์ •์ ์ด๋”๋ผ๋„ MaybeUninit::zeroed ์˜ constness๊ฐ€ ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋” ๋„“์€ ์ƒํƒœ๊ณ„์—์„œ MaybeUninit ์œ ํ˜•์„ ๋” ๋นจ๋ฆฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ / ์•ˆ์ •ํ™”๋ฅผ ๋ช‡ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) MaybeUninit ์ถ”๊ฐ€
2) mem :: uninitialized / zeroed์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ ๋ณ€ํ™˜ํ•˜๊ณ  deprecate

์•ˆ๋…•ํ•˜์„ธ์š”.

MaybeUninit ์ถ”๊ฐ€

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

์ข‹์€! ๊ทธ๋ ‡๋‹ค๋ฉด MaybeUninit๋ฅผ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์•ˆ์ •ํ™”์‹œํ‚ฌ ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ ๋‹จ๊ณ„๋Š” https://github.com/rust-lang/rust/pull/54668์ด ์„ฑ๋Šฅ์„ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜๊ฒŒ ํšŒ๊ท€์‹œํ‚ค๋Š” ์ด์œ ๋ฅผ

๋˜ํ•œ ์„œ๋‘๋ฅด๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ชป ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ๋งˆ์ง€๋ง‰ API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋‘๋ฅด์ง€ ๋ง๊ณ  ๋‹ค์‹œ ๋ง์ณ ๋ณด์ž. ;)

์ฆ‰, ํ•„์ž๋Š” ๋ถˆํ•„์š”ํ•œ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ๋งˆ์นจ๋‚ด ์ด์ „ ํ’‹๊ฑด์„ ํ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์•„, ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๊ธˆ ๋‚˜์—๊ฒŒ ๋‹ค๋ฅธ ์ผ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค ... https : //github.com/rust-lang/rust/pull/54667์ด ์ฐฉ๋ฅ™ํ•˜๋ฉด ์˜ค๋ž˜๋œ API๊ฐ€ ์‹ค์ œ๋กœ ์ตœ์•…์˜ ํ’‹๊ฑด์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. MaybeUninit ๋กœ๋„๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ฌด์ธ ์œ ํ˜•์—์„œ ํ˜ธ์ถœ ๋  ๋•Œ MaybeUninit::into_inner ํŒจ๋‹‰์„ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์—์„œ T ๋ฌด์ธ ์ƒํƒœ์—์„œ x: &[mut] T ์‚ฌ์šฉํ•˜๋ฉด *x ๊ฐ€ ๋‹นํ™ฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ์—…๋ฐ์ดํŠธ : https://github.com/rust-lang/rust/pull/54668๋กœ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ์„ ์กฐ์ •ํ•  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @eddyb ์€ ๊ธฐ๊บผ์ด ๋ฉ˜ํ† ๋ง ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตฌํ˜„์„ ์ˆ˜ํ–‰ ํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. :)

๋ž˜ํผ์—์„œ ๋ฒ—์–ด๋‚˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

pub unsafe fn take(&mut self) -> T

์ œ์ถœํ• ๊นŒ์š”?

@shepmaster ์ด๊ฒƒ์€ ๊ธฐ์กด into_inner ๋ฐฉ๋ฒ•๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘๋ณต์„ ํ”ผํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋˜ํ•œ "๋ฐ”๊พธ๊ธฐ"๋Š” ์—ฌ๊ธฐ์—์„œ ์ž˜๋ชป๋œ ๊ทธ๋ฆผ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ self ์˜ ๋‚ด์šฉ์„ ์ „ํ˜€ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์†Œ์œ ๊ถŒ ๋งŒ ์ด์ „๋˜๋ฏ€๋กœ ์ด์ œ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๊ตฌ์ถ• ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

self ์„ ์ „ํ˜€ ๋ณ€๊ฒฝ

๋ฌผ๋ก  ๊ตฌํ˜„ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ptr::read ์ด์ง€๋งŒ ์‚ฌ์šฉ ๊ด€์ ์—์„œ ์œ ํšจํ•œ ๊ฐ’์„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ”„๋ ˆ์ž„์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ค‘๋ณต ๋ฐฉ์ง€

๋‚˜๋Š” ํ•˜๋‚˜์˜ ๊ตฌํ˜„์ด ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•ํ•œ ๋ฐ˜๋Œ€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ์ƒํƒœ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

into_inner ๊ฐ€ ๋„ˆ๋ฌด ๊ฒฐ๋ฐฑ ํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ ๋ฌธ์„œ๋ฅผ ๋„ˆ๋ฌด์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์ง€ ์•Š๊ณ  MaybeUninit::uninitialized().into_inner() ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ was_initialized_unchecked ์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ํ›„์— ๋งŒ โ€‹โ€‹ํ˜ธ์ถœํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” take ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ธˆ ์–ด์ƒ‰ํ•˜์ง€๋งŒ unchecked_into_initialized ๊ฒƒ์ด ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ณ  ๋ฌธ์„œ์—์„œ x.as_ptr().read() ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@SimonSapin into_inner ์€ (๋Š”) self ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ @shepmaster ์˜ take ๊ฒฝ์šฐ as_mut_ptr().read() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... ๋ฌผ๋ก  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํฌ์ธํ„ฐ๋กœ ๊ท€์ฐฎ๊ฒŒํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

take_unchecked ๋ฐ into_inner_unchecked ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฐฑ์—… ๊ณ„ํš์ด์ง€๋งŒ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฐ•์กฐ์™€ ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ (unwrap / into_inner / etc.)์— ๋Œ€ํ•œ ์„ค๋ช…์„ ํ•˜๋‚˜์˜ ์ด๋ฆ„์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ž๋Š” assert_initialized ํ•˜๊ณ  ํ›„์ž๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์„œ๋ช…์— ์˜ํ•ด ์•”์‹œ๋ฉ๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•œ unchecked_assert_initialized ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์•”์‹œ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด assert!() ์žˆ๋‹ค.

assert! ()์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์•”์‹œํ•˜์ง€ ์•Š๋„๋ก unchecked_assert_initialized ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ intrinsics::assume(foo) ๋Œ€ assert!(foo) ๋ฅผ ํ†ตํ•ด ๊ฐ€์ •๊ณผ ์ฃผ์žฅ์„ ๊ตฌ๋ถ„ํ•˜๋ฏ€๋กœ assume_initialized ?

assume ๋Š” ๋ถˆ์•ˆ์ •ํ•œ API์ด๊ณ , ๊ฐ€์ • ๋Œ€ assert์˜ ์•ˆ์ •์ ์ธ ์˜ˆ๋Š” unreachable_unchecked ๋Œ€ unreachable ๋ฐ get_unchecked ๋Œ€ get ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” unchecked ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์šฉ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

foo_unchecked ๋Š” ํ•ด๋‹น foo ์ด์žˆ์„ ๋•Œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด unsafe ๋ผ๋Š” ํ•จ์ˆ˜์˜ ์ˆœ์ˆ˜ํ•œ ํŠน์„ฑ์ด "๋‹ค๋ฅธ"๋ฌด์–ธ๊ฐ€๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ ์œ„์—.

์ด ์ž์ „๊ฑฐ ์ฐฝ๊ณ ๋Š” ๋ถ„๋ช…ํžˆ ์ž˜๋ชป๋œ ์ƒ‰์ž…๋‹ˆ๋‹ค

์ด ํŠน์ • API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ๋ ˆ๊ธฐ์ด๋ฏ€๋กœ ๋ถ€์ฃผ์˜ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด UB๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ "์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด UB์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์ด๋ฏธ ๋ณด์•˜๊ณ  ๊ณ„์† ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ, ๊ธฐ๊ฐ„ ". unchecked ์™€ ๊ฐ™์€ ์ค‘๋ณต ๋œ โš ๏ธ๊ฐ€ ๋„์›€์ด ๋ ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, ์˜คํžˆ๋ ค ๋” ๋‹นํ™ฉ์Šค๋Ÿฌ์›Œํ•˜๋Š” ํŽธ์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (= ์‚ฌ๋žŒ๋“ค์ด ์ฃผ๋ณ€์— ๋ฌป๊ฑฐ๋‚˜ ๋ฌธ์„œ๋ฅผ ์ฝ๊ฒŒ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค). ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ).

๋ฟก๋ฟก

into_inner ๊ฐ€ ๋„ˆ๋ฌด ๊ฒฐ๋ฐฑ ํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ ๋ฌธ์„œ๋ฅผ ๋„ˆ๋ฌด์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์ง€ ์•Š๊ณ  MaybeUninit::uninitialized().into_inner() ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ was_initialized_unchecked ์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ํ›„์— ๋งŒ โ€‹โ€‹ํ˜ธ์ถœํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” _ ์ •๋ง _์ด ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜๋ฏธ๋ก ์— ๋Œ€ํ•ด ์˜ณ์€ ์ผ์„ ๋งํ•˜๊ณ  ์ด๊ฒƒ์ด ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ดˆ๊ธฐํ™”ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฐ•์กฐ์ ๊ณผ ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ (unwrap / into_inner / etc.)์— ๋Œ€ํ•œ ์„ค๋ช…์„ ํ•˜๋‚˜์˜ ์ด๋ฆ„์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ž๋Š” assert_initialized ํ•˜๊ณ  ํ›„์ž๋Š” ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์„œ๋ช…์— ์˜ํ•ด ์•”์‹œ๋ฉ๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•œ unchecked_assert_initialized ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์•”์‹œ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด assert!() ์ด์žˆ๋‹ค.

๋‚˜๋Š” ์œ„ํ—˜ํ•œ ๋ฌผ๊ฑด์— ๋Œ€ํ•œ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“  ๊ธด ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‘ ๋ฒˆ ์ƒ๊ฐํ•˜๊ฒŒํ•œ๋‹ค๋ฉด was_initialized_into_inner_unchecked ๋„ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด (์ด์œ  ๋‚ด์—์„œ) ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.)

๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์ด์žˆ๋Š” IDE๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ๊ธด ์ด๋ฆ„์€ ์‚ฌ์†Œํ•œ๋กœ๋“œ ๋ฒ”ํ”„์ž…๋‹ˆ๋‹ค.

์ €๋Š”์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ธ์ฒด ๊ณตํ•™์— ํŠน๋ณ„ํžˆ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ํŠน์ • ํฌ์ธํŠธ ์ด๋ฆ„์„ ์ง€๋‚˜์„œ ์ฝ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›‘์–ด ๋ณด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ์ด ์ด๋ฆ„์€ ์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ฝ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ์ด ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š”๋งŒํผ ์ž์ฃผ ๋…ผ์˜ / ์„ค๋ช… ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค (๋น„๊ต์  ํ‹ˆ์ƒˆ ์‹œ์žฅ์ด๊ณ  ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ์†Œ์Šค ์ฝ”๋“œ์— ๊ธด ์‹๋ณ„์ž๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ (์˜ˆ : IDE ๋•๋ถ„์—) ์ฑ„ํŒ… ์‹œ์Šคํ…œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ... ๋œ ๋ฉ‹์ง€๋‹ค (์ด ์ ์— ๋Œ€ํ•ด ๋ฐ˜์€ ๋†๋‹ด์ด์ง€๋งŒ โ€‹โ€‹๋ฐ˜๋งŒ).

@shepmaster ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์ด์žˆ๋Š” IDE๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ unsafe ๋ธ”๋ก ๋‚ด๋ถ€๋ฅผ ํฌํ•จํ•˜์—ฌ ๋‚ด๋ถ€์— unchecked ๊ฐ€ ํฌํ•จ ๋œ ๋” ๊ธด ์ด๋ฆ„์ด ์ถ”๊ฐ€๋กœ ์ผ์‹œ ์ค‘์ง€๋˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ฑ„ํŒ… ์‹œ์Šคํ…œ์˜ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ... ๋œ ๋ฉ‹์ง€๋‹ค (์ด ์ ์— ๋Œ€ํ•ด ์ ˆ๋ฐ˜์€ ๋†๋‹ด์ด์ง€๋งŒ โ€‹โ€‹์ ˆ๋ฐ˜ ๋งŒ).

๋‚˜๋Š” ๊ทธ ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์กฐ๊ธˆ ํŠน๋ณ„ํ•ด์„œ ๋” ๊ธฐ์–ต์— ๋‚จ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ;)

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜ (๋˜๋Š” โ€‹โ€‹๋™์ผํ•œ ์˜๋ฏธ ์˜๋ฏธ๋ฅผ ํฌํ•จํ•˜๋Š” ์œ ์‚ฌํ•œ ์ด๋ฆ„) :

  • 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 ์ด ์ •๋ง๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ, ์ €๋Š” unchecked ๊ฐ€ ๋™์ผํ•œ ๋‹ค๋ฅธ _checked_ ๋ณ€ํ˜•๊ณผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” @shepmaster ์— ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ.

์ž๊ฐ€ ์ฐจ์šฉ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ptr::drop_in_place(maybe_uninit.as_mut_ptr()) ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์—ˆ์ง€๋งŒ MaybeUninit ์˜ ๊ณ ์œ  ํ•œ ๋ฐฉ๋ฒ• ์ธ unsafe fn drop_in_place(&mut self) ๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ManuallyDrop::drop ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

foo_unchecked๋Š” ํ•ด๋‹นํ•˜๋Š” foo๊ฐ€์žˆ์„ ๋•Œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜์˜ ์ˆœ์ „ ํ•œ ํŠน์„ฑ์ด "๋‹ค๋ฅธ"์ผ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฒ„์ „์ด์—†๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฒ„์ „์—์„œ ๊ฒฝ๊ณ  ํ‘œ์‹œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ข‹์€ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฒ„์ „์—์„œ ๊ฒฝ๊ณ  ํ‘œ์‹œ ์ œ๊ฑฐ

์•ฝ๊ฐ„ ์Œ๊ณก์„ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ unsafe ํ•จ์ˆ˜๊ฐ€ _unchecked ๋์— ๋ถ™์–ด ์žˆ์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ™์€ ๋ง์„ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๊ฒฝ๊ณ ๊ฐ€์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณต์ •ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. :) ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋Œ€๋‹ต์ด "๊ฑฐ์˜ ๊ฒฐ์ฝ”"๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊ฒฐ์ฝ” ํ‘œํ˜„ํ•˜์ง€ ์•Š๋Š” ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋กœ offset ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ›„ํšŒํ•œ๋‹ค. ๋ฌธ์ž ๊ทธ๋Œ€๋กœ unchecked ์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ IMO์—๋Š” ๋ญ”๊ฐ€ ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก ์•ˆ์— ์žˆ๊ณ  ์‹ค์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ .offset ๋Œ€์‹  .wrapping_offset , ๋‚ด๊ฐ€ ๋งŒ๋“ค ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ์•ฝ์†์„ํ–ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊ฒฐ์ฝ” ํ‘œํ˜„ํ•˜์ง€ ์•Š๋Š” ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜

์ด๊ฒƒ์€์ด ๋‹จ๊ณ„์—์„œ ๋‚˜์˜ ์ฆ๊ฑฐ์›€์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

@shepmaster ๋”ฐ๋ผ์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ์กด unsafe ๋ธ”๋ก (์•”์‹œ ์ ์œผ๋กœ unsafe ๊ฐ€์žˆ๋Š” ํฐ unsafe fn ๋‚ด๋ถ€์—์žˆ์„ ์ˆ˜ ์žˆ์Œ) ๋‚ด๋ถ€์—์„œ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค unsafe unsafe ๋ธ”๋ก), ์ถ”๊ฐ€ํ•˜๋Š” ํ˜ธ์ถœ์ด unsafe ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๊นŒ?

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ์กด unsafe ๋ธ”๋ก [...] ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ํ˜ธ์ถœ์ด unsafe ์ž„์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š”์ด ๊ฐ€๋Šฅ์„ฑ์„ ๋ฌด์‹œํ•  ์˜๋„๊ฐ€ ์—†์—ˆ์œผ๋ฉฐ ์‹ค์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด ์˜๊ฒฌ์€ ๊ธฐ์กด unsafe ํ•œ์ •์ž๊ฐ€ ๋” ๊นŠ์€ ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”

์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณ ์น  ์ˆ˜์—†๋Š” ์‹คํŒจ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ด๋ฆ„์— ๋‹จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์ด์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค .

์•„๋งˆ๋„ ํฐ ๊ฒƒ, ์•„๋งˆ๋„ unsafe ๋ธ”๋ก์ด์žˆ๋Š” ํฐ unsafe fn ๋‚ด๋ถ€

์ˆ˜๋ฐฑ ์ค„์˜ ํ•จ์ˆ˜๊ฐ€์žˆ์„ ๋•Œ ์„€๋„ ์ž‰์€ ๋ถ„๋ช…ํžˆ ๋‚˜์œ ์ƒ๊ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— Rust๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์„€๋„ ์ž‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์งˆ๋ฌธ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ์— ๋‚˜์œ ํ˜•ํƒœ๋กœ ๋ฐ›์•„ ๋“ค์—ฌ ์ง„๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งค์šฐ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Rust์˜ ์–ด๋–ค ์ธก๋ฉด ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์ด "ํ•„์š”ํ•œ"๊ฒƒ๋ณด๋‹ค ๋” ์ปค์ง€๋„๋ก


์ œ์ณ๋‘๊ณ , IDE + RLS๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ๊ธฐ๋Šฅ์„ ์‹๋ณ„ํ•˜๊ณ  ํŠน๋ณ„ํžˆ ๊ฐ•์กฐ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ํŽธ์ง‘์ž๋Š” ์ด๋ฏธ unsafe ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Rust์˜ ์–ด๋–ค ์ธก๋ฉด์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์ด "ํ•„์š”ํ•œ"๊ฒƒ๋ณด๋‹ค ๋” ์ปค์ง€๋„๋ก ๊ฐ•์š”ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š” https://github.com/rust-lang/rfcs/pull/2585;)

์ œ์ณ๋‘๊ณ , IDE + RLS๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ๊ธฐ๋Šฅ์„ ์‹๋ณ„ํ•˜๊ณ  ํŠน๋ณ„ํžˆ ๊ฐ•์กฐ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด IDE์—์„œ ์ฝ”๋“œ ๋งŒ ์ฝ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜์ ์œผ๋กœ IDE์—์„œ ๊ฒ€ํ† ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ Rust์˜ ์–ด๋–ค ์ธก๋ฉด์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์ด "ํ•„์š”ํ•œ"๊ฒƒ๋ณด๋‹ค ๋” ์ปค์ง€๋„๋ก ๊ฐ•์š”ํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒด์ธ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋” ํฐ ์˜ˆ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„์—์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ let ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„์ธ๊ฐ„์  ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ์ฒด์ธ์ด ์ปค๋ฒ„๋ฉ๋‹ˆ๋‹ค.

'ํž˜'์€ ์•„๋‹ˆ์ง€๋งŒ ํ™•์‹คํžˆ '๋™๊ธฐ'์ž…๋‹ˆ๋‹ค.

l rust-lang / rfcs # 2585๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ;)

๋„ค,ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ท€ํ•˜์˜ ์‚ฌ๊ฑด์— ๋„์›€์ด๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ํ•ญ์ƒ ์ „์ฒด ๋ณธ๋ฌธ ์ฃผ์œ„์— unsafe ๋ธ”๋ก์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ฃผ์„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด). ๊ทธ๋Ÿฌ๋ฉด ๋™์ผํ•œ ๋ฌธ์ œ๋กœ ๋ฐ”๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋Š” "sneak in"์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘๊ฐ€ IDE์—์„œ ์ฝ”๋“œ ๋งŒ ์ฝ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์„ ์ œ์ณ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ง ํ–ˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


๋‚ด ๋ฌธ์ œ๋Š” ํšจ๊ณผ์ ์œผ๋กœ ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ์˜นํ˜ธํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์€ ๋‚˜๋ฅผ ํฌ๊ฒŒ ๊ดด๋กญ ํžˆ๊ณ  ๋ฌด์–ธ๊ฐ€ ๊ฐ€ ์ฐจ์„  ์ฑ…์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์€ ๋‚˜๋ฅผ ํฌ๊ฒŒ ๊ดด๋กญ ํžˆ๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ฐจ์„  ์ฑ…์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ดํ•ด ํ–ˆ์–ด์š”. ์ด ๋ฐ˜๋ณต์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‘ ๊ฐœ์˜ ๋ˆˆ์„ ์ œ๊ณตํ•˜๋Š” 4-eyes ์›์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ;)

@shepmaster ๋‚˜๋Š”์ด ์˜คํ”„ ํŠธ๋ž™ ์กฐ๊ธˆ์„ ๋ฐ›๊ณ ์žˆ๋‹ค ์ƒ๊ฐํ•˜์ง€๋งŒ, IMO ์›๋ž˜ ์ ์€์ด ๋ฐฉ๋ฒ•์˜ ๋ถˆ๋ณ€์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค ์žˆ๋‹ค๊ณ ํ•ฉ๋‹ˆ๋‹ค - ๋•Œ, ์ฆ‰ unsafe ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœํ•˜์ง€ UB๋Š” ๊ฐ„๋‹จํ•œ ์ด๋ฆ„์œผ๋กœ.

"unchecked"๊ฐ€ ์ตœ์„ ์˜ ์„ ํƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ "์‰ฝ๊ฒŒ ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•˜๋Š”"์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ initialized_or_ub ์ค„์„ ๋”ฐ๋ผ ๋ช…๋ช… ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์•„์š”

๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜๋ ค๊ณ ํ–ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ž‘ํ’ˆ์„ ๋งํ–ˆ๊ณ  (์•„๋ฌด๋„ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™๋‹ค) ๊ฑฐ์ง“๋ง์„ํ•˜๊ฒ ๋‹ค. ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๋Š” initialized_or_ub ์ค„์„ ๋”ฐ๋ผ ๋ช…๋ช… ๊ทœ์น™์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค.

maybe_uninit(ialized) ๊ฑด๊ฐ€์š”? ์–ด๋–ป๊ฒŒ ๋“  ๊ด€๋ จ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ˜‡

์•„๋‹ˆ์š”, unwrap_or_else - "unhappy case"์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์— ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@eddyb ์ด๊ฑฐ ๋‚˜์˜์ง€ ์•Š์€๋ฐ ... .initialized_or_unsound ์•„๋งˆ๋„?

์ผ๋ฐ˜์ ์œผ๋กœ ์‹๋ณ„์ž ์ด๋ฆ„์— ์œ ํ˜• ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•ˆํ‹ฐ ํŒจํ„ด (์˜ˆ : foo_i32 , bar_mutex , baz_iterator )์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์— ๊ด€ํ•ด์„œ๋Š” unsafe ์ด fn ์œ ํ˜•์˜ ์ผ๋ถ€์ด์ง€๋งŒ _unchecked , _unsafe , _you_better_know_what_you_are_doing ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ฝค ํ”ํ•ฉ๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿด๊นŒ์š”?

๋˜ํ•œ ์ฐธ๊ณ ๋กœ rust-analyzer ์— ํ•จ์ˆ˜๊ฐ€ unsafe ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฌธ์ œ (https://github.com/rust-analyzer/rust-analyzer/issues/190)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘์ž์™€ IDE๋Š” unsafe ๋ธ”๋ก ๋‚ด์—์„œ unsafe ๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์„ ๊ฐ•์กฐ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” unsafe ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹๋ณ„์ž๊ฐ€ ์ ‘๋ฏธ์‚ฌ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์˜ˆ : _unchecked ์—ฌ๋ถ€), ์›์‹œ ํฌ์ธํ„ฐ ์—ญ ์ฐธ์กฐ ๋“ฑ

ํ‹€๋ฆผ์—†์ด rust-analyzer ๋Š” ์•„์ง ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (ํŽธ์ง‘ : intellij-Rust ์ข…๋ฅ˜์˜ can : https://github.com/intellij-rust/intellij-rust/issues/3013#issuecomment-440442306). ์˜๋„๋Š” unsafe ๋ธ”๋ก ๋‚ด์—์„œ ์ด๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด unsafe ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๊ฐ•์กฐ๋Š” ์ด๊ฒƒ์„ ์ ‘๋ฏธ์‚ฌ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์˜ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ์ •๋ง๋กœ ์ง€๊ธˆ ์ด๊ฒƒ์„ ์›ํ•œ๋‹ค๋ฉด์ด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ช‡ ๋ถ„ ์•ˆ์— ๊ตฌ๋ฌธ ํ•˜์ด ๋ผ์ดํ„ฐ์— "ํ‚ค์›Œ๋“œ"๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•˜๋ฃจ์— ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ผ๋ฐ˜์ ์œผ๋กœ ์‹๋ณ„์ž ์ด๋ฆ„์— ์œ ํ˜• ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•ˆํ‹ฐ ํŒจํ„ด (์˜ˆ : foo_i32 , bar_mutex , baz_iterator )์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ—๊ฐ€๋ฆฌ ํ‘œ๊ธฐ๋ฒ• ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜ ํŒจํ„ด์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋…ผ์˜์—์„œ๋Š” ์•ˆ์ „์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉฐ UB๊ฐ€ ์ œ์‹œํ•˜๋Š” ์œ„ํ—˜์„ ๊ฐ์•ˆํ•  ๋•Œ ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๋ฅผ ๋‘์–ด์•ผ ํ•  ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์— ๊ด€ํ•ด์„œ๋Š” unsafe ์ด fn ์œ ํ˜•์˜ ์ผ๋ถ€์ด์ง€๋งŒ _unchecked , _unsafe , _you_better_know_what_you_are_doing ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ฝค ํ”ํ•ฉ๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿด๊นŒ์š”?

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ : ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ค‘๋ณต์€ ๋‹น์‹ ์˜ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝ”๋“œ์™€ ์•ˆ์ „์— ์ค‘์š”ํ•œ ํ•˜๋“œ์›จ์–ด ๋“ฑ์— ๋ชจ๋‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฐธ๊ณ ๋กœ rust-analyzer ์— ํ•จ์ˆ˜๊ฐ€ unsafe ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฌธ์ œ ( rust-analyzer / rust-analyzer # 190 )๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘์ž์™€ IDE๋Š” unsafe ๋ธ”๋ก ๋‚ด์—์„œ unsafe ๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์„ ๊ฐ•์กฐ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” unsafe ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹๋ณ„์ž๊ฐ€ ์ ‘๋ฏธ์‚ฌ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์˜ˆ : _unchecked ์—ฌ๋ถ€), ์›์‹œ ํฌ์ธํ„ฐ ์—ญ ์ฐธ์กฐ ๋“ฑ

๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ rust-analyzer ๋Š” ์•„์ง ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์ง€๋งŒ unsafe ๋ธ”๋ก ๋‚ด์—์„œ ์ด๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด unsafe ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด ๊ตฌ๋ฌธ ๊ฐ•์กฐ๋Š” ์ ‘๋ฏธ์‚ฌ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌด์—‡์ด๋“ .

์ด ๋ชจ๋“  ๊ฒƒ์ด ๊ฝค ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @RalfJung์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด "๋ชจ๋“  ์‚ฌ๋žŒ์ด IDE์—์„œ๋งŒ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค .

์ถ”์•…ํ•œ ๊ฒƒ๊ณผ unsafe ๋ถ€์ •ํ™• ํ•œ (๋”ฐ๋ผ์„œ ๊ฑด์ „ํ•˜์ง€ ์•Š์€) ์‚ฌ์šฉ ์‚ฌ์ด์˜ ์ ˆ์ถฉ์ ์ด๋ผ๋ฉด ํ•ญ์ƒ ์ „์ž๋ฅผ ์„ ํ˜ธํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ "์ž ๊น, ๋‚ด๊ฐ€์ด ์ผ์„ ์ œ๋Œ€๋กœํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?"๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ž ์‹œ ๋ฉˆ์ถ”๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ง์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Mundane์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์•”ํ˜ธํ™” ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • 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๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ๊ธด ์ด๋ฆ„์€ ์‚ฌ์†Œํ•œ๋กœ๋“œ ๋ฒ”ํ”„์ž…๋‹ˆ๋‹ค.

RLS๊ฐ€ ๋” ๊ธฐ๋Šฅ์  ์ผ ๋•Œ๊นŒ์ง€๋Š” ์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์ด ๋™์˜ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค

  • ๋” ์„ค๋ช…์ ์ธ ์ด๋ฆ„์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ๋œ ์ธ์ฒด ๊ณตํ•™์ ์ธ ์ด๋ฆ„์€ ๋‚˜์˜๋‹ค

๋ฌธ์ œ๋Š” ๊ธด์žฅ ์ƒํƒœ ์ผ ๋•Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ํŠนํžˆ into_inner ์ด์ด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‚˜์œ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๋ฉ‹์ง„ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ๋ ˆํ†  ๊ตญ๊ฒฝ์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” into_inner a๊ฐ€ ๋  ๋•Œ Foo<T> ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ํฌํ•จ T , ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‹ถ์–ด. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ MaybeUninit<T> ์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0 ๊ฐœ ๋˜๋Š” 1 ๊ฐœ์˜ T ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋œ ๋‚˜์œ ์˜ต์…˜์€ ์ ์–ด๋„ unwrap ๋˜๋Š” unwrap_unchecked ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

from_initialized ๋˜๋Š” from_initialized_unchecked ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ "from"์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์  ๋ฉ”์„œ๋“œ ์ด๋ฆ„์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

unwrap_initialized_unchecked ๊ฐ€ ๊ดœ์ฐฎ์„๊นŒ์š”?

take_initialized ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  &mut self ๋Œ€์‹  self ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋‚ด๋ถ€ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ํ•จ์„ ๋ช…ํ™•ํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค. MaybeUninit ์˜ ์ปจํ…์ŠคํŠธ์—์„œ unsafe ๋ฐ Option / Result ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค๋„์ด ์ž‘์—…์ด ์„ ํƒ ์ทจ์†Œ๋˜์—ˆ์Œ์„ ๋ถ„๋ช…ํžˆํ•ฉ๋‹ˆ๋‹ค.

&mut self ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์€ ์˜๋ฏธ ์ƒ MaybeUninit ์—์„œ ์ด๋™ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์  ํ•  ์ˆ˜์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ’‹๊ฑด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋Œ€์ฒด ์ด๋ฆ„ : into ๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•”์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ ์†Œ์œ ๊ถŒ์„ ์ด๋™ํ•˜๋ฏ€๋กœ into_initialized_unchecked ?

& mut self๋ฅผ ์ทจํ•˜๋Š” ๊ฒƒ์€ ๋‹น์‹ ์ด MaybeUninit์—์„œ ์˜๋ฏธ ๋ก ์ ์œผ๋กœ ์ด๋™ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์  ํ•  ์ˆ˜์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ’‹๊ฑด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์š”์ฒญ ๋œ ๋ฐฉ๋ฒ•์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์ด ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ถ”์ ํ•˜๋Š” ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋ฆฐ ๊ฒƒ๊ณผ ์†Œ๋น„ํ•˜๋Š” ๋ณ€์ข…์„ ๋ชจ๋‘ ๊ฐ€์งˆ ๊ฐ€์น˜๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” take_initialized ๋˜๋Š” ๋” ๋ช…์‹œ์ ์ธ ๋ณ€ํ˜• take_initialized_unchecked ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์ด๋ฆ„์„ MaybeUninitialized๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

PR์„ ์ค€๋น„ ํ•  ์‚ฌ๋žŒ ์žˆ๋‚˜์š”?

PR ์ค€๋น„๋ฅผ ์œ„ํ•ด?

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ๋ฉ‹์ง„ sed ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ;-)

into_inner ๋ฉ”์„œ๋“œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐœ์„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ unchecked ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ณ  ๋„์›€์ด๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์œผ๋กœ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : take_initialized ์ข‹์•„ ๋ณด์ธ๋‹ค

assume_initialized ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด:

  • '์˜๋ฌด ์ฆ๋ช…'๋ชจ๋ธ์— ์—ฐ๊ฒฐ
  • ๋ณธ๋Šฅ์ ์œผ๋กœ '๊ฐ€์ •์€ ์œ„ํ—˜ํ•˜๋‹ค'์™€ ์—ฐ๊ฒฐ
  • ๋‘ ๋‹จ์–ด ๋งŒ ํ•„์š”
  • ์ž‘์—…์˜ ์˜๋ฏธ ๋ก ์  ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฝค ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ์Œ
  • LLVM assume ๋‚ด์žฅ ํ•จ์ˆ˜์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ์ž˜๋ชป ๊ฐ€์ •ํ•˜๋ฉด UB์ž…๋‹ˆ๋‹ค.

PR์„ ์ค€๋น„ ํ•  ์‚ฌ๋žŒ ์žˆ๋‚˜์š”?

์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ. libs ํŒ€์€ ์ด๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Copy ๋•Œ T: Copy MaybeUninit<T> ๊ฐ€ Copy ๊ฐ€ ์•„๋‹Œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@tommit ์™œ๋ƒํ•˜๋ฉด MaybeUninit<T> ๋Š” ManuallyDrop<T> ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ ๋‚ด๋ถ€ ๊ฐ’์ด ์‚ญ์ œ๋˜๋„๋ก ๋ณด์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Copy ๊ตฌํ˜„ํ•˜๋ฉด Rust ์‹ ๊ทœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ์กฐ์ฒด ์ž์ฒด ๋˜๋Š” ๋ณต์‚ฌ๋ณธ์˜ ๋‚ด๋ถ€ ๊ฐ’ T ๋งค๋ฒˆ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋” ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ luojia65 T ์ž์ฒด๊ฐ€ Copy ์ผ ๋•Œ ManuallyDrop ๋ฐ MaybeUninit ์ด ๋ฌด์—‡์„ํ•˜๋“  ๊ด€๊ณ„์—†์ด ์ถ”๋ก  ๋ผ์ธ์ด ์ ์šฉ๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ #[derive(Copy)] ์ถ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค;)

์ด๊ฒƒ์˜ ๋‹ค์†Œ ๋ฏธ๋ฌ˜ํ•œ ์ธก๋ฉด์— ๋Œ€ํ•œ ๊ด€์ฐฐ :
๋‚˜๋Š” ๋น„๋ก ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ MaybeUninit<T> ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค Copy ํ•˜๋ฉด T: Copy , MaybeUninit<T> ํ•˜์ง€ ์•Š์•„์•ผ Clone ํ•˜๋ฉด T: Clone ์™€ T ๋Š” Copy ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์˜ˆ, ์šฐ๋ฆฌ๋Š” clone ์ „ํ™” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Copy: Clone ...

๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. *self ๋ฐ˜ํ™˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ Clone for MaybeUninit<T> where T: Copy ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์˜ฌ๋ผ์˜จ ๋ชจ๋“  ์งˆ๋ฌธ์œผ๋กœ ๋ฌธ์ œ ์„ค๋ช…์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์นœ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

ManuallyDrop::drop ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ํฌํ•จ ๋œ ๊ฐ’์˜ ์†Œ๋ฉธ์ž๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ๋ž˜ํ•‘ ๋œ ๊ฐ’์€ ์ด์ œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์€์ด ๋ฐฉ๋ฒ•์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

MaybeUninit ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ"๊ณผ ํ˜ผ๋™ ๋  ์ˆ˜ ์—†๋„๋ก ํ•ด๋‹น ๋ฌธ๊ตฌ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๊ด€์ ์—์„œ, a๋Š” ๊ฐ์†Œํ•˜์ง€ ManuallyDrop<T> ๋” ์ด์ƒ ์•ˆ์ „ T ,ํ•˜์ง€๋งŒ์ด ์œ ํšจ T ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™” ์‹ ๊ฒฝ๊นŒ์ง€๋กœ ์ ์–ด๋„ ....

"๋ถ€์‹ค"/ "์œ ํšจํ•˜์ง€ ์•Š์Œ", ์•„๋งˆ๋„? ์ดˆ๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค.

FWIW ๋‚˜๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ ์–ด๋„ ๋‚˜์—๊ฒŒ๋Š”)
๊ฐœ์ฒด๊ฐ€ ๋‘ ๋ฒˆ ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒƒ์€ "์•ˆ์ „"๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ๋ฌธ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด
"์•ˆ์ „"์„ ์ •์˜ํ•˜๋Š” UCG์—์„œ ํ•˜์ดํผ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
T๋Š” "์œ ํšจ"ํ•˜๊ณ  ํ•˜์ดํผ ๋งํฌ "์œ ํšจ"์ •์˜ ์—ฌ์•ผํ•˜์ง€๋งŒ
์•„์ง ์–ด๋””์—๋„ ์ด๋Ÿฌํ•œ ์ •์˜๊ฐ€ ์ ํ˜€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค ... ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”
๋ฌธ์„œ ์ „์ฒด์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ์˜์—ญํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ๊ธฐํ•˜๊ธฐ ์ „์— MaybeUninit๋ฅผ ์•ˆ์ •ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@RalfJung ๋‚˜๋Š” ์žฅ์†Œ๊ฐ€ "์—์„œ ์ด๋™ํ–ˆ๋‹ค"๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. FWIW ์šฐ๋ฆฌ๋Š” std::ptr::read ์—์„œ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜์ง€๋งŒ ๊ฑฐ๊ธฐ์—์„œ๋„ ๊ทธ๋‹ค์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@bluss ์šฐ๋ฆฌ๋Š” "๋” ๋‚˜์€
์†”๋ฃจ์…˜โ€/โ€œ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœโ€.

์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋Š” 'X๋Š” ์ง€์› ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Y๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”'์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€
Y๊ฐ€์—†๊ณ  X๊ฐ€ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
Y๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ .

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ •๋ง ์ด์ƒํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@cramertj "์œ ํšจํ•˜์ง€ ์•Š์Œ"์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํƒ€๋‹น์„ฑ ๋ถˆ๋ณ€์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์„ ํƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

UCG์— "์•ˆ์ „"์„ ์ •์˜ํ•˜๋Š” ์ž‘์€ ๋ฌธ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•˜์ดํผ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. T๋Š” "์œ ํšจ"ํ•˜๊ณ  ํ•˜์ดํผ ๋งํฌ "์œ ํšจ"์ •์˜ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ์ด๋Ÿฌํ•œ ์ •์˜๋ฅผ ์–ด๋””์—๋„ ๊ธฐ๋กํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ...

์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์–ป์—ˆ์„ ๋•Œ ํ™•์‹คํžˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค : D

@RalfJung ์ €๋Š” "์œ ํšจ์„ฑ ๋ถˆ๋ณ€"์ด ๋Œ€๋ถ€๋ถ„์˜ (๊ฑฐ์˜ ์–ด๋–ค?) Rust ์‚ฌ์šฉ์ž์˜ ์–ดํœ˜์ง‘์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ"๋ฅผ ๊ตฌ์–ด์ฒด๋กœ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค ( ManuallyDrop<T> ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. a T ). ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ํ‘œํ˜„ ๋ถˆ๋ณ€์„ ์œ ์ง€ํ•ด์•ผํ•œ๋‹ค๊ณ ํ•ด์„œ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค„์–ด๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” "์œ ํšจ์„ฑ ๋ถˆ๋ณ€"์ด ๋Œ€๋ถ€๋ถ„์˜ (๊ฑฐ์˜ ์–ด๋–ค?) Rust ์‚ฌ์šฉ์ž์˜ ์–ดํœ˜์ง‘์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•˜์ง€๋งŒ,์ด ์šฉ์–ด๋Š” ๊ณต์‹์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๊ณต์‹์ ์ธ ์šฉ์–ด๋ฅผ ์„ ํƒํ•ด์•ผํ•˜๋ฉฐ ๊ทธ๋Ÿฐ ์ถฉ๋Œ์„ ํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ์—์„œ "์œ ํšจํ•œ"๋ฐ์ดํ„ฐ๋ฅผ "์•ˆ์ „"์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "์œ ํšจ"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋‹ค๋ฅธ ๋‹จ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@shepmaster ๊ฐ€ ์–ผ๋งˆ ์ „์— ์ผ์Šต๋‹ˆ๋‹ค.

๋ž˜ํผ์—์„œ ๋ฒ—์–ด๋‚˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

pub unsafe fn take(&mut self) -> T

๋‚ด ๊ฐ€์žฅ ํฐ ๊ด€์‹ฌ์‚ฌ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์‚ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ˆ˜๋กœ ๋ณต์‚ฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ maybe_uninit.as_ptr().read() ๊ฒƒ์ด ์ •๋ง ๋‚˜์œ๊ฐ€์š”?

๋‚˜๋Š” take ๊ฐ™์€ ๊ฒƒ์„ into_inner ๊ฐ™์€ ๊ฒƒ์„ ๋Œ€์ฒดํ•˜๋„๋ก ๊ฑฐ๊ธฐ ์–ด๋”˜๊ฐ€์— ์ œ์•ˆํ–ˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ into_inner self ์†Œ๋น„ํ•˜๋Š” ์ถ”๊ฐ€ ์ œํ•œ์€ ์‹ค์ œ๋กœ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

@RalfJung ๊ฒฐ๊ตญ MaybeUninit ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ as_ptr ์ฃผ์œ„์˜ ํŽธ๋ฆฌํ•œ ๋ž˜ํผ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ take ์ดํ›„ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ์ค‘ ํ•˜๋‚˜, ์ˆ˜ MaybeUninit ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค ๋‹จ์ง€ Option ํƒœ๊ทธ๊ฐ€ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค. ์ด๋Š” ๋งŽ์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด (์˜ˆ : ํ•ด์‹œ ํ…Œ์ด๋ธ”)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/57045 ์—์„œ MaybeUninit ์— ๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

    /// Get a pointer to the first contained values.
    pub fn first_ptr(this: &[MaybeUninit<T>]) -> *const T {
        this as *const [MaybeUninit<T>] as *const T
    }

    /// Get a mutable pointer to the first contained values.
    pub fn first_mut_ptr(this: &mut [MaybeUninit<T>]) -> *mut T {
        this as *mut [MaybeUninit<T>] as *mut T
    }

๋™๊ธฐ ๋ถ€์—ฌ์™€ ํ† ๋ก ์„ ์œ„ํ•ด PR์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ œ๊ฑฐ ํ•  ๋•Œ zeroed ๋‹จ์ง€๋กœ ๋Œ€์ฒด์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค MaybeUninit::zeroed().into_inner() ๊ฐ™์€ ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋™๋“ฑํ•œ ๋ฐฉ๋ฒ•์ด๋˜๊ณ ์žˆ๋‹ค. ์‹ค์งˆ์ ์ธ ๋ณ€ํ™”๋Š” ์—†์Šต๋‹ˆ๋‹ค. uninit ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์‹  MaybeUninit ์œ ํ˜•์˜ ๊ฐ’ ๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ณต์šฉ์ฒด์˜ ๊ฐ’์— ์ €์žฅ๋˜๋Š” ๋ชจ๋“  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์˜ ์‹ค์งˆ์ ์ธ ๋ณ€๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ FFI์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ std::mem::zeroed ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€์› ์ค‘๋‹จ์€ ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ํฐ ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋„๋ก ๋งŒ๋“ค๋ฉฐ, ์ ์–ด๋„ ๋งค์šฐ ์„ฑ๊ฐ€ ์‹œ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋‹ค๋ฅธ ๋” ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ์ˆจ๊ธธ ์ˆ˜์žˆ๋Š” #[allow(deprecated)] ์˜ ์ฆ๊ฐ€๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

unsafe -marked ์ฝ”๋“œ์— ๋Œ€ํ•œ Rust์˜ ๋ชจ๋ธ๊ณผ ๊ฐ€์ด๋“œ ๋ผ์ธ์„ ๋ช…ํ™•ํžˆํ•˜๋Š”์ด ์—ฐ์Šต์€ ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ, zeroed ์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ์„ ํ”ผํ•ฉ์‹œ๋‹ค. .

@bluss ๋‚ด ์ดํ•ด (์ž˜๋ชป ๋  ์ˆ˜ ์žˆ์Œ)๋Š” std::mem:zeroed ๋Š” std::mem::uninitialized ๋งŒํผ์ด๋‚˜ ์œ„ํ—˜ํ•˜๋ฉฐ UB๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ vec![0; N] ๋˜๋Š” [0; N] ๋กœ ๋” ์ž˜ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ ์ค‘์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ rustfix ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณ€๊ฒฝ์„ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”์ดํŠธ ๋˜๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ ์™ธ์— std::mem::zeroed ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด UB๋กœ ์ด์–ด์งˆ ์ˆ˜์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

@scottjmaddox std::mem:zeroed UB๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์ง€๋งŒ std::mem::uninitialized ๊ณผ ๋‹ฌ๋ฆฌ std::mem:zeroed ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ์ผ๋ถ€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๋„ค์ดํ‹ฐ๋ธŒ ์œ ํ˜•, ๋งŽ์€ FFI ๊ด€๋ จ struct ๋“ฑ). ๋งŽ์€ unsafe ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ zeroed() ๋„ ๊ฐ€๋ณ๊ฒŒ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜์ง€๋งŒ uninitialized() ๋งŒํผ ๋ฌธ์ œ๊ฐ€๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ ์ธก๋ฉด์—์„œ ์ฐจ์ด๊ฐ€์—†๊ณ  MaybeUninit ๋ฒ„์ „์ด ๋” ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์— std::mem:zeroed() MaybeUninit::zeroed().into_inner() ๋Œ€์‹  std::mem:zeroed() ๊ฐ€๋…์„ฑ์ด ์•ฝ๊ฐ„ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค).

๋ฟก๋ฟก

std :: mem :: uninitialized์™€ ๋‹ฌ๋ฆฌ std :: mem : zeroed ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ์ผ๋ถ€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ธฐ๋ณธ ์œ ํ˜•,

mem::uninitialized ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ์ผ๋ถ€ ์œ ํ˜• ( ์˜ˆ : unit )์ด ์žˆ๊ณ  ์ผ๋ถ€ "๋„ค์ดํ‹ฐ๋ธŒ"์œ ํ˜• (์˜ˆ : bool , &T ๋“ฑ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. .) mem::zeroed ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.


์—ฌ๊ธฐ์—๋Š” MaybeUninit ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์˜คํ•ด๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : "Uninitialized"๊ฐ€ ์ด๋ฆ„์— ์žˆ์Œ).

์šฐ๋ฆฌ๊ฐ€ ๋ง‰์œผ๋ ค๋Š” ์œ„ํ—˜์€ _invalid_ ๊ฐ’์ด ๋ชจ๋‘ 0์„ ํฌํ•จํ•˜๋Š”์ง€, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋น„ํŠธ๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด _invalid_ ๊ฐ’์˜ ์ƒ์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ : ๋น„ํŠธ ํŒจํ„ด์—์„œ bool true ๋˜๋Š” false )๊ฐ€ ์•„๋‹ˆ๊ณ ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mem::zeroed ๋ฐ mem::uninitialized ๋ชจ๋‘ _invalid_ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ๊ด€์ ์—์„œ ๋˜‘๊ฐ™์ด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

OTOH MaybeUninit::zeroed() ๋ฐ MaybeUninit::uninitialized() ๋Š” union ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— _safe_ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. MaybeUninit::into_inner ๋Š” unsafe ์ด๋ฉฐ MaybeUninit<T> ์˜ ํ˜„์žฌ ๋น„ํŠธ๊ฐ€ T ์˜ _valid_ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ „์ œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ _safe_ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ ํŒจํ„ด์ด _invalid_์ด๋ฉด ๋™์ž‘์ด ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„ํŠธ ํŒจํ„ด์ด ๋ชจ๋‘ 0, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋น„ํŠธ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•˜์ง€ ์•Š์€์ง€ ์—ฌ๋ถ€๋Š” ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@RalfJung ์ €๋Š” MaybeUninit ๋ผ๋Š” ์ด๋ฆ„์ด ์•ฝ๊ฐ„ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์™€ ํ”ผํ•˜๋Š” ์œ„ํ—˜์„ ๋” ์ž˜ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์„ MaybeInvalid ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘ : @Centril ์˜ ์ œ์•ˆ์— ๋”ฐ๋ผ ์ž์ „๊ฑฐ ํ†ตํ–‰ ๋ฌธ์ œ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.


ํŽธ์ง‘ : FWIW, ์ œ๋กœํ™” ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฒด ๊ณตํ•™์  ๋ฐฉ๋ฒ• (์˜ˆ : MaybeUninit ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ )์ด ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ mem::zeroed ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  0 ๋น„ํŠธ ํŒจํ„ด์ด ์œ ํšจํ•œ ์œ ํ˜• ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ๊ตฌํ˜„๋˜๋Š” Zeroed ํŠน์„ฑ์„ Default ์™€ ์œ ์‚ฌํ•œ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. mem::zeroed ์ง€๊ธˆ์€ํ•˜์ง€๋งŒ ํ•จ์ •์ด ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ˜„์žฌ ์‚ฌ์šฉ์ž๋ฅผ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋งˆ๋ จ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋Šฅ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. MaybeUninit ๋Š” ๋‚ด ๋ˆˆ์— mem::zeroed ๋ณด๋‹ค ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋น„๋ก ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ (๋” ์•ˆ์ „ํ•˜์ง€๋งŒ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š์Œ) mem::zeroed ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค MaybeUninit ๋„์ฐฉํ•˜์ž๋งˆ์ž mem::zeroed ๊ทธ ๋•Œ๊นŒ์ง€ ์ธ์ฒด ๊ณตํ•™์ ์ธ ๋Œ€์ฒดํ’ˆ์ด ์—†์–ด๋„๋ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์™€ ํ”ผํ•˜๋Š” ์œ„ํ—˜์„ ๋” ์ž˜ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์„ MaybeInvalid ๋˜๋Š” ์ด์™€ ๋น„์Šทํ•œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/56138 ์—์„œ Bikeshed

๋ฟก๋ฟก

์ผ๋ถ€ "๋„ค์ดํ‹ฐ๋ธŒ"์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : 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 ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ €์™€ ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.) ์ œ๋กœ ์•ˆ์ „ ์œ ํ˜•์˜ ๊ฒฝ์šฐ mem::zeroed ).

bool์ด FFI์— ์•ˆ์ „ํ•œ ํ•œ (์ผ๋ฐ˜์ ์œผ๋กœ RFC 954๊ฐ€ ๊ฑฐ๋ถ€๋˜๊ณ  ๋น„๊ณต์‹์ ์œผ๋กœ ์Šน์ธ ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„์ฃผ ๋จ) mem :: zeroed๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ณ  ์‹ถ์ง€ ์•Š์•˜์ง€๋งŒ bool ๋Š” C์˜ _Bool ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ •์˜๋œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ FFI ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ C์˜ _Bool ์˜ true ๋ฐ false ๊ฐ’์€ C ํ‘œ์ค€์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์–ธ์  ๊ฐ€๋Š” C20์—์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ). ๋”ฐ๋ผ์„œ mem::zeroed ๋Š” ์œ ํšจํ•œ bool ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ตฌํ˜„ ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ,ํ•˜์ง€๋งŒ mem :: zeroed์— ๋Œ€ํ•œ UB๊ฐ€์žˆ๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์—๋Š” MaybeUninit :: zeroed (). into_inner ()์— ๋Œ€ํ•œ UB๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์›๋ž˜ ์ฃผ์„์— .into_inner ()๋ฅผ ์˜๋„์ ์œผ๋กœ ํฌํ•จํ•˜๋„๋ก์ฃผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค). ์‚ฌ์šฉ์ž๊ฐ€ .into_inner ()๋ฅผ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜๋ฉด MaybeUninit๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ œ๋กœ ์•ˆ์ „ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ mem :: zeroed๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— mem :: zeroed๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ €์™€ ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค). .

๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์š”์ ์„ ๋งŒ๋“ค๊ณ ์žํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. MaybeUninit ๋Š” mem::zeroed ์—๋Š”์—†๋Š” into_inner ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๋„์ž… ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ( uninitialized ๋˜๋Š” zeroed๋กœ ์œ ๋‹ˆ์˜จ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค).

์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ mem::zeroed ๋ฅผ MayeUninit + into_inner ๋ฒˆ์—ญํ• ๊นŒ์š”? ์ด๋Š” mem::zeroed ์˜ ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ "์ˆ˜์ •"ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ฉฐ, ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์Œ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋™์ผํ•œ ํšจ๊ณผ์™€ ํ›จ์”ฌ ๋‚ฎ์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

mem::zeroed ์—์„œ MaybeUninit ๋กœ ์ด๋™ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ into_inner ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜๊ฑฐ๋‚˜ into_inner ํ˜ธ์ถœ์ด ์•ˆ์ „ํ•ด์งˆ ๋•Œ๊นŒ์ง€ MaybeUninit ์„ union ๊ณ„์† ์ž‘์—…ํ•˜์‹ญ์‹œ์˜ค (์ด ๊ฒฝ์šฐ๊นŒ์ง€ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๋ณ€๊ฒฝ MaybeUninit ๋Œ€์‹  T S ๋“ฑ).

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ณ  ์‹ถ์ง€ ์•Š์•˜์ง€๋งŒ bool ๋Š” C์˜ _Bool ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ •์˜๋œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ FFI ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ C's _Bool are not defined in the C standard (although they might be some day, maybe in C20), so whether mem :: zeroed creates a valid bool`์˜ true ๋ฐ false ๊ฐ’์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ตฌํ˜„ ์ •์˜๋ฉ๋‹ˆ๋‹ค. .

ํƒ„์  ํŠธ๋ฅผ ๊ณ„์†ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผํ•˜์ง€๋งŒ C11์—์„œ๋Š” 0์œผ๋กœ ์„ค์ •๋˜๋Š” ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ ์ •์ˆ˜ ์œ ํ˜•์˜ ๊ฐ’ 0์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค (์„น์…˜ 6.2.6.2 "์ •์ˆ˜ ์œ ํ˜•", ๋‹จ๋ฝ 5 ์ฐธ์กฐ) ( _Bool ). . ๋˜ํ•œ true ๋ฐ false ์ด ๋ช…์‹œ ์ ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค (์„น์…˜ 7.18 "๋ถ€์šธ ์œ ํ˜• ๋ฐ ๊ฐ’ <stdbool.h> "์ฐธ์กฐ).

๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์š”์ ์„ ๋งŒ๋“ค๊ณ ์žํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. MaybeUninit ๋Š” mem::zeroed ์—๋Š”์—†๋Š” into_inner ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๋„์ž… ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์ด๋ฏ€๋กœ ๊ทธ์— ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ( uninitialized ๋˜๋Š” zeroed๋กœ ์œ ๋‹ˆ์˜จ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค).

MaybeUninit ๋ฐ MaybeUninit::zeroed ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋‘˜ ๋‹ค ๊ทธ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” MaybeUninit::zeroed ์ œ๊ฑฐ๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ std::mem::zeroed ์—๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

mem :: uninitialized๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ์œ ํ˜• (์˜ˆ : ๋‹จ์œ„)์ด์žˆ๋Š” ๋ฐ˜๋ฉด, mem :: zeroed๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•˜๋Š” ์ผ๋ถ€ "๋„ค์ดํ‹ฐ๋ธŒ"์œ ํ˜• (์˜ˆ : bool, & T ๋“ฑ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ถ‰์€ ์ฒญ์–ด์ž…๋‹ˆ๋‹ค. zeroed ๋ฐ uninitialized ๋ชจ๋‘ ์œ ํ˜•์˜ ์ผ๋ถ€ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‚ฌ์šฉ์—์„œ ๋น„๊ตํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. mem::uninitialized ๊ฐ€ ์œ ํšจํ•œ ์œ ํ˜•์˜ ์ˆ˜๋Š” ๋งค์šฐ ์ ์œผ๋ฉฐ (์‹ค์ œ๋กœ ํฌ๊ธฐ๊ฐ€ 0 ์ธ ์œ ํ˜•์ผ๊นŒ์š”?) ์•„๋ฌด๋„ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : ZST์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜• ์ƒ์„ฑ์ž). ๋ฐ˜๋ฉด์— mem::zeroed ๊ฐ€ ์œ ํšจํ•œ ๋งŽ์€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. mem::zeroed ์€ (๋Š”) ์ตœ์†Œํ•œ ๋‹ค์Œ ์œ ํ˜•์— ๋Œ€ํ•ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ •์ˆ˜ ์œ ํ˜• (์œ„์— ์–ธ๊ธ‰ ๋œ bool )
  • ๋ชจ๋“  ์›์‹œ ํฌ์ธํ„ฐ ์œ ํ˜•
  • Option<T> ์—ฌ๊ธฐ์„œ T๋Š” ์—ด๊ฑฐ ํ˜• ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. T ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    • NonZeroXXX (๋ชจ๋“  ์ •์ˆ˜ ์œ ํ˜•)

    • NonNull<U>

    • &U

    • &mut U

    • fn ํฌ์ธํ„ฐ

    • ์ด ๋ชฉ๋ก์—์žˆ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐฐ์—ด

    • ๋ชจ๋“  struct ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ํ•„๋“œ๋Š”์ด ๋ชฉ๋ก์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

  • ์ด ๋ชฉ๋ก์˜ ์œ ํ˜•์œผ๋กœ ๋งŒ ๊ตฌ์„ฑ๋œ ๋ชจ๋“  ๋ฐฐ์—ด, struct ๋˜๋Š” union .

์˜ˆ, uninitialized ๋ฐ zeroed ์ž ์žฌ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด๋Ÿฌํ•œ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๋งค์šฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

mem::uninitialized ์˜ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let val = MaybeUninit::uninitialized();
initialize_value(val.as_mut_ptr()); // or val.set
val.into_inner()

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํฐ ์‹ค์ˆ˜๋ฅผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  mem::zeroed ์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„ ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ ์ด๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ mem::zeroed() ๋ฅผ MaybeUninit::zeroed().into_inner() ๋กœ ๋Œ€์ฒดํ•ด๋„ ํ’‹๊ฑด ์˜ˆ๋ฐฉ ํšจ๊ณผ๊ฐ€ ์ „ํ˜€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” @bluss์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด uninitialized ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์€ ์ž˜๋ชป๋œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ์œ ํ˜•์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. zeroed ์˜ ์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์œ ํšจํ•œ ์œ ํ˜•์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ ๋œ Zeroed ํŠธ๋ ˆ์ด ํŠธ ๋˜๋Š” ์œ ์‚ฌ (์˜ˆ : Pod ,ํ•˜์ง€๋งŒ T: Zeroed ๋Š” T: Pod ์˜๋ฏธํ•˜์ง€ ์•Š์Œ) ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์•ˆ์ •์ ์ธ fn zeroed2<T: Zeroed>() -> T ํ™•๋ณด ํ•  ๋•Œ๊นŒ์ง€ fn zeroed<T>() -> T ํ๊ธฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋ฟก๋ฟก

ํƒ„์  ํŠธ๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ฏธ์•ˆํ•˜์ง€๋งŒ C11์€

๊ณผ์—ฐ! ์œ ํšจํ•œ ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ C ++์˜ bool ๋ฟ์ž…๋‹ˆ๋‹ค! ์ˆ˜์ • ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.์ด ๋ณด์ฆ๊ณผ ํ•จ๊ป˜ UCG์— PR์„ ๋ณด๋‚ด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ด๋Ÿฌํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. mem::uninitialized ์ด ์œ ํšจํ•œ ์œ ํ˜•์˜ ์ˆ˜๋Š” ๋งค์šฐ ์ ์œผ๋ฉฐ (์‹ค์ œ๋กœ ํฌ๊ธฐ๊ฐ€ 0 ์ธ ์œ ํ˜•์ผ๊นŒ์š”?) ์•„๋ฌด๋„ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : ZST์˜ ๊ฒฝ์šฐ ์œ ํ˜• ์ƒ์„ฑ์ž).

ZST๋ฅผ ์ผ์ข…์˜ "์ž‘์—… ์ฆ๋ช…"๋˜๋Š” "์ž์› ํ† ํฐ"๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "์ฆ๊ฑฐ ์ฆ๋ช…"์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ๋ชจ๋“  ZST์— ๋Œ€ํ•ด ์˜ณ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ :

mod refl {
    use core::marker::PhantomData;
    use core::mem;

    /// Having an object of type `Id<A, B>` is a proof witness that `A` and `B`
    /// are nominally equal type according to Rust's type system.
    pub struct Id<A, B> {
        witness: PhantomData<(
            // Make sure `A` is Id is invariant wrt. `A`.
            fn(A) -> A,
            // Make sure `B` is Id is invariant wrt. `B`.
            fn(B) -> B,
        )>
    }

    impl<A> Id<A, A> {
        /// The type `A` is always equal to itself.
        /// `REFL` provides a proof of this trivial fact.
        pub const REFL: Self = Id { witness: PhantomData };
    }

    impl<A, B> Id<A, B> {
        /// Casts a value of type `A` to `B`.
        ///
        /// This is safe because the `Id` type is always guaranteed to
        /// only be inhabited by `Id<A, B>` types by construction.
        pub fn cast(self, value: A) -> B {
            unsafe {
                // Transmute the value;
                // This is safe since we know by construction that
                // A == B (including lifetime invariance) always holds.
                let cast_value = mem::transmute_copy(&value);

                // Forget the value;
                // otherwise the destructor of A would be run.
                mem::forget(value);

                cast_value
            }
        }
    }
}

fn main() {
    use core::mem::uninitialized;

    // `Id<?A, ?B>` is a ZST; let's make one out of thin air:
    let prf: refl::Id<u8, String> = unsafe { uninitialized() };

    // Segfault:
    let _ = prf.cast(42u8);
}

@Centril ์ด๊ฒƒ์€ ์ผ์ข…์˜ ํƒ„์  ํŠธ์ด์ง€๋งŒ ๊ท€ํ•˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ uninitialized ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž˜๋ชป๋œ ๊ฐ’์ด ์ƒ์„ฑ๋˜๋Š” ์œ ํ˜•์˜ ์˜ˆ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Id ์ด ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ๋‚ด๋ถ€ ๋ถˆ๋ณ€์„ฑ์„ ์œ„๋ฐ˜ํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ transmute(()) ) ๋˜๋Š” ์œ ํ˜• ์บ์ŠคํŒ… ์›์‹œ ํฌ์ธํ„ฐ.

@jethrogb ๋‚ด ์œ ์ผํ•œ ์š”์ ์€ a) ๋ฌธ๊ตฌ์— ๋”์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์‹ญ์‹œ์˜ค. b) ์œ ํšจํ•œ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํ† ๋ก ์—์„œ ํ”„๋ผ์ด๋ฒ„์‹œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. "๋‚ด๋ถ€ ๋ถˆ๋ณ€์„ฑ ์œ„๋ฐ˜"๊ณผ "์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’"์€ ๊ฐ™์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ถ€์ˆ˜์  ์ธ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. " A != B ์ด๋ฉด Id<A, B> ๋Š” ๋ฌด์ธ์ž…๋‹ˆ๋‹ค."

"๋‚ด๋ถ€ ๋ถˆ๋ณ€์„ฑ ์œ„๋ฐ˜"๊ณผ "์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’"์€ ๊ฐ™์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ถ€์ˆ˜์  ์ธ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. " A != B ์ด๋ฉด Id<A, B> ๋Š” ๋ฌด์ธ์ž…๋‹ˆ๋‹ค."

"๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์— ์˜ํ•ด ๋ถ€๊ณผ ๋œ"๋ถˆ๋ณ€์€ ์—ฌ๋Ÿฌ๋ฉด์—์„œ "์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ถ€๊ณผ ๋œ"๋ถˆ๋ณ€ ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ @RalfJung ์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด ์šฉ์–ด์—์„œ Id ์˜ˆ์ œ์—๋Š” ์•ˆ์ „ ๋ถˆ๋ณ€์ด ์žˆ์œผ๋ฉฐ mem::zeroed ๋˜๋Š” Id<A, B> ๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ฉ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์•ˆ์ „ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ฆ‰๊ฐ์ ์ธ UB๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Id ์—๋Š” ์œ ํšจ ๋ถˆ๋ณ€์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Id mem::zeroed ๋˜๋Š” mem::uninitialized ๋กœ ์ž˜๋ชป๋œ Id ๊ฐ’์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ž‘์„ฑ์ž๋Š” ํ™•์‹คํžˆ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ถˆ๋ณ€์„ฑ์„ ์—ผ๋‘์— ๋‘์–ด์•ผํ•˜์ง€๋งŒ์ด ๋…ผ์˜๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์œ ํšจ์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•ˆ์ „ ๋ถˆ๋ณ€์€ ์‚ฌ์šฉ์ž ์ •์˜๋˜๊ณ  ๊ฑฐ์˜ ๊ณต์‹ํ™”๋˜์ง€ ์•Š์œผ๋ฉฐ ์ž„์˜์ ์œผ๋กœ ๋ณต์žก ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์— ๋Œ€ํ•ด ์ถ”๋ก ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ / ์–ธ์–ด์— ๋Œ€ํ•œ ํฌ๋ง์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์•ˆ์ „ ๋ถˆ๋ณ€์„ ๊นจ๋Š” ๊ฒƒ์ด ๋•Œ๋•Œ๋กœ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ (๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šด๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ) T ์˜ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ mem::zeroed::<T>() ๋ฅผ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋ฐฐ์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ์šฐ๋ฆฌ๋Š” ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๊นจ์ง„ ์œ ํšจ์„ฑ ๋ถˆ๋ณ€์˜ ๊ฒฐ๊ณผ๋Š” ๊นจ์ง„ ์•ˆ์ „ ๋ถˆ๋ณ€๋ณด๋‹ค ์–ด๋–ค๋ฉด์—์„œ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค (๋ชจ๋“  ์ง€์˜ฅ์ด ์ฆ‰์‹œ ํ’€๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ทธ ํ•  ๊ธฐํšŒ๊ฐ€ ์ ๊ณ , ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด UB๋กœ ์ธํ•œ ์‹ค์ œ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ ๋ถˆ๋ณ€์„ฑ์€ ๋™์ผํ•œ ๋ชจ๋“ˆ / ํฌ๋ ˆ์ดํŠธ์˜ ์ฝ”๋“œ์—์„œ๋งŒ ์ง์ ‘ ์•…์šฉ๋ฉ๋‹ˆ๋‹ค).

์ฝ์€ ํ›„ ์ฝ”๋ฉ˜ํŠธ๋ฅผ @jethrogb , ๋‚˜๋Š” ๋™์˜ mem::zeroed ์˜ ๋„์ž…์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ํ•ด์„œ๋Š” ์•ˆ MaybeUninit .

@jethrogb ์ž‘์€ ๋‹ˆํŠธ :

์ด ๋ชฉ๋ก์—์žˆ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐฐ์—ด
ํ•„๋“œ๊ฐ€์ด ๋ชฉ๋ก์˜ ์œ ํ˜• ์ธ ๋ชจ๋“  ๊ตฌ์กฐ์ฒด.

์ด๊ฒƒ์ด ๋‹จ์ˆœํ•œ ์˜คํƒ€์ธ์ง€ ์˜๋ฏธ ๋ก ์  ์ฐจ์ด์ธ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ,์ด ๋‘ ๊ฐœ์˜ ๊ธ€ ๋จธ๋ฆฌ ๊ธฐํ˜ธ๋ฅผ ๋นผ๋‚ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. None ๊ฐ€ Option<[&u8; 2]> ๊ฒฝ์šฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค None ์ผ€์ด์Šค์˜ ํ‘œํ˜„์œผ๋กœ [0, 24601] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค-๋‚ด๋ถ€ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋งŒ ํ‹ˆ์ƒˆ ํ‘œํ˜„์„ ์ทจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค-cc @ ์ด๊ฒƒ ์— ๋Œ€ํ•ด ๋‚˜๋ฅผ ํ™•์ธํ•˜๋Š”

๋ฟก๋ฟก

์˜ค๋Š˜๋‚  mem :: zeroed์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ ์ด๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ถœ์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐ˜๋ฉด์— mem :: zeroed๊ฐ€ ์œ ํšจํ•œ ๋งŽ์€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž˜๋ชป ์‚ฌ์šฉ๋  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ๋„ ๋ฌดํ•œํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” mem::zeroed ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋” ์ธ์ฒด ๊ณตํ•™์ ์ธ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ์„ ๋•Œ๊นŒ์ง€ ์ง€์› ์ค‘๋‹จ์„ ์—ฐ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋งค๋ ฅ์ ์ธ ๋Œ€์•ˆ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์ผ์‹œ์ ์ธ ์ธ์ฒด ๊ณตํ•™์  ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ mem::zeroed ์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ฑฐ ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ ˆ์ถฉ์•ˆ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ง€์› ์ค‘๋‹จ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ์ž ์žฌ์ ์œผ๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ (ํŠนํžˆ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์‹ ๊ทœ ์‚ฌ์šฉ์ž)์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ฒฝ๊ณ ํ•˜๋ฉฐ, ๋Œ€์‹  ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์— ๋Œ€ํ•œ ๊ฑด์ „ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๊ฒฝ๊ณ ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” MaybeUninit ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณ  mem::zeroed ๋ฐ mem::uninitialized ๋ณด๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š์ง€๋งŒ ์ €์—๊ฒŒ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€ ์•Š๊ฒŒ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. MaybeUninit ์ด์ด ํ† ๋ก  ์ฃผ์žฅ์˜ ์ผ๋ถ€ ์˜๊ฒฌ๋งŒํผ ๊ณ ํ†ต ์Šค๋Ÿฝ๋‹ค๋ฉด ์•ˆ์ „ํ•œ mem::zeroed ๋Œ€์•ˆ์„์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ / ๋˜๋Š” RFC๊ฐ€ ์ฆ‰์‹œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค (์•„๋ฌด๊ฒƒ๋„ AFAICT๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Œ).

๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  mem::zeroed ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž์˜ ์„ ํƒ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. mem::zeroed ์—์„œ libcore mem::zeroed ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ mem::zeroed ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋ชจ๋“  ์‚ฌ์šฉ๋ฒ•์ด ์–ด์จŒ๋“  ์˜ฌ๋ฐ”๋ฅธ์ง€ ์ ๊ทน์ ์œผ๋กœ ์กฐ์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ mem::zeroed ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž, ์ผ๋ฐ˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž, mem::uninitialized ๋Œ€์‹  "๋œ ๋ฌด์„œ์šด"๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ๋“ฑ์ž…๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋ฃจ์Šค

์ œ๋กœํ™”๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด MaybeUninit :: zeroed (). into_inner ()๋กœ๋งŒ ๋Œ€์ฒด๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์‹ค์งˆ์ ์ธ ๋ณ€ํ™”๋Š” ์—†์Šต๋‹ˆ๋‹ค. uninit ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด MaybeUninit ๋˜๋Š” ๋™๋“ฑํ•œ ์œ ๋‹ˆ์˜จ ์œ ํ˜•์˜ ๊ฐ’์— ์ €์žฅ๋˜๋Š” ๋ชจ๋“  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์˜ ์‹ค์งˆ์ ์ธ ๋ณ€๊ฒฝ์ด ๋Œ€์‹  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •์ˆ˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•  ๋•Œ ์‚ฌ์‹ค์ด์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ฐธ์กฐ ์œ ํ˜•์„ ์‚ดํŽด๋ณด๋ฉด mem::zeroed() ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋‚˜๋Š” ํ›จ์”ฌ ๋” ๊ฐ€๋Šฅ์„ฑ์ด ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์‹คํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ๋™์˜ mem::zeroed::<&T>() ์‹คํ˜„ ์‚ฌ๋žŒ๋“ค๋ณด๋‹ค ๋ฌธ์ œ๊ฐ€ mem::uninitialized::<bool>() ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ mem::zeroed() ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ mem::uninitialized::<u32>() ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ˆ˜ ์œ ํ˜•์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋น„ํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด mem::uninitialized() ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  "POD ์œ ํ˜•"์— ๋Œ€ํ•ด ์œ ํšจ ํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ์ด ๋…ผ์˜๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

mem :: uninitialized๊ฐ€ ์œ ํšจํ•œ ์œ ํ˜•์˜ ์ˆ˜๋Š” ๋งค์šฐ ์ ์œผ๋ฉฐ (์‹ค์ œ๋กœ ํฌ๊ธฐ๊ฐ€ 0 ์ธ ์œ ํ˜•์ผ๊นŒ์š”?) ์•„๋ฌด๋„ ์‹ค์ œ๋กœ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : ZST์˜ ๊ฒฝ์šฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑด์„ค์ž).

FWIW, ์ผ๋ถ€ ์Šฌ๋ผ์ด์Šค ๋ฐ˜๋ณต๊ธฐ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ํ˜•์‹ ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜์—†๋Š” ์ œ๋„ค๋ฆญ ์ฝ”๋“œ์—์„œ ZST๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด mem::zeroed() / MaybeUninit::zeroed().into_inner() ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

mem::zeroed() ๋Š” C ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— memset(&x, 0, sizeof(x)) ๋กœ ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ํŠน์ • FFI ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Amanieu ๋ถˆํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. memset ์ผ์น˜ํ•˜๋Š” Rust ๊ตฌ์กฐ๋Š” write_bytes ์ž…๋‹ˆ๋‹ค.

mem :: zeroed ()๋Š” ํŠน์ • FFI ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ mem::zeroed ๋Š” ๊ฐœ์ธ ๋˜๋Š” ํ”Œ๋žซํผ ์ข…์† ํ•„๋“œ๋กœ libc ๊ตฌ์กฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@RalfJung ๋ฌธ์ œ ์˜ ์ „์ฒด ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Type x; memset(&x, 0, sizeof(x)); ์ด๊ณ  ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์—๋Š” Rust์— ์ƒ์‘ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ MaybeUninit ์ด ํŒจํ„ด์€ ๋ผ์ธ ๋…ธ์ด์ฆˆ๊ฐ€ ๋งŽ์ด์—๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ›„ ๋ฌดํšจ ๊ฒฐ์ฝ” (์ตœ์ ํ™”์—†์ด ํ›จ์”ฌ ๋” CODEGEN)์ž…๋‹ˆ๋‹ค memset .

MaybeUninit ์˜ ๋””์ž์ธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. MaybeUninit<T> ์•ˆ์— ํฌํ•จ ๋œ T ์˜ ๋‹จ์ผ ํ•„๋“œ์— ์“ธ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์œ ํšจํ•œ / ์ดˆ๊ธฐํ™” ๋œ ์œ ํ˜•์œผ๋กœ ๋๋‚ ๊นŒ์š”?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

& mut Foo ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ ์“ฐ๊ธฐ๊ฐ€ UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

main () {
    let uninit_foo = MaybeUninitilized::<Foo>::uninitialized();
    unsafe { *uninit_foo.get_mut().bar = true; }
    unsafe { *uninit_foo.get_mut().baz = "hello world".to_owned(); }
}

์ฐธ์กฐ ๋Œ€์‹  ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

main () {
    let uninit_foo = MaybeUninitilized::<Foo>::uninitialized();
    unsafe { *uninit_foo.as_mut_pointer().bar = true; }
    unsafe { *uninit_foo.as_mut_pointer().baz = "hello world".to_owned(); }
}

์•„๋‹ˆ๋ฉด UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๊ณ ์ด ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง๊ด€์ ์œผ๋กœ, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ / ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ์ด ์Šค๋ ˆ๋“œ์˜ ์—ฌ๋Ÿฌ ์ฃผ์„์œผ๋กœ ์ธํ•ด ์˜์‹ฌ์ด ์ƒ๊น๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ผ๋ถ€ ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•ด์•ผํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์ด์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ธํ”Œ๋ ˆ ์ด์Šค (in-place) ๋นŒ๋” ํŒจํ„ด์ด์ง€๋งŒ ์ผ๋ถ€ ํ•„๋“œ์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’.

MaybeUninit ์•ˆ์— ํฌํ•จ ๋œ T์˜ ๋‹จ์ผ ํ•„๋“œ์— ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ชจ๋“  ํ•„๋“œ์— ์“ฐ๊ณ  ์œ ํšจ / ์ดˆ๊ธฐํ™” ๋œ ์œ ํ˜•์œผ๋กœ ๋๋‚  ์ˆ˜ ์žˆ๋„๋ก?

์˜ˆ. ์‚ฌ์šฉํ•˜๋‹ค

ptr::write(&mut *(uninit.as_mut_ptr()).bar, val1);
ptr::write(&mut *(uninit.as_mut_ptr()).baz, val2);
...

์ด๋ฅผ ์œ„ํ•ด get_mut() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด get_mut ์˜ ๋ฌธ์„œ์—์„œ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. https://github.com/rust-rfcs/unsafe-code-guidelines/ ์—์„œ ๋…ผ์˜๋˜๋Š” ํ–ฅํ›„ ๊ทœ์น™์„ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@RalfJung *(uninit.as_mut_ptr()).bar = val1; ์ด (๊ฐ€) ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ bar ์ด์ „ ๊ฐ’์„ ๋–จ์–ด ๋œจ๋ฆด ์œ„ํ—˜์ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

ptr::write(&mut (*uninit.as_mut_ptr()).bar, val1);

@scottjmaddox ์•„, ๋งž์•„. Drop ์— ๋Œ€ํ•ด ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํ•„๋“œ์— ์“ฐ๋Š”์ด ๋ณ€ํ˜•์€ get_mut() ๋ณด๋‹ค ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ๋œํ•ฉ๋‹ˆ๊นŒ? ptr::write ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์ฝ”๋“œ ์ง€์ ์—์„œ ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€ ํ•„๋“œ์— &mut _ ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.์ด ํ•„๋“œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒํผ ์ •์˜๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ๋“ค์–ด์ง„. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๊ฒƒ์ด ์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋œ ์ƒํƒœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋„๋ก ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๊นŒ?

๋…ธ์ถœ ๋œ &mut _ ์ค‘๊ฐ„์ฒด๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ํฌ์ธํ„ฐ ํ”„๋กœ์ ์…˜ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ์š”?


์•ฝ๊ฐ„ ํฅ๋ฏธ๋กœ์šด ์˜ˆ :

pub struct A { inner: bool }

pub fn init(mut uninit: MaybeUninit<A>) -> A {
    unsafe {
        let mut previous: [u8; std::mem::size_of::<bool>()] = [0];

        {
            // Doesn't the temorary reference assert inner was in valid state before?
            let inner_ptr: *mut _ = &mut (*uninit.as_mut_ptr()).inner;
            ptr::copy(inner_ptr as *const [u8; 1], (&mut previous) as *mut _, 1);

            // With the assert below, couldn't the compiler drop this?
            std::ptr::write(inner_ptr, true);
        }

        // Assert Inner wasn't false before, so it must have been true already!
        assert!(previous[0] != 0);

        // initialized all fields, good to proceed.
        uninit.into_inner()
    }
}

๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ &mut _ ๋ฅผ ์œ ํšจํ•œ ํ‘œํ˜„์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ptr::write ? ์–ด์„ค ์…˜์„ ํ†ต๊ณผํ•˜๋ฉด ์ฝ˜ํ…์ธ ๋Š” 0 ์•„๋‹ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์œ ํšจํ•œ ๋ถ€์šธ์€ true/1 ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์–ด์„ค ์…˜์„์ง€๋‚˜ ์น˜๋ฉด ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๊ฐ’์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์ •๋ ฌ ํ›„์—์ด ๊ฐ’์œผ๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? llvm์ด ์ง€๊ธˆ ์ด๊ฒƒ์„ ์•…์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ๋ณด์žฅ ๋ ์ง€ ํ™•์‹  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


๋Œ€์‹  ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ž์ฒด MaybeUninit ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ํ˜„์‹ค์„ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋†€์ดํ„ฐ ์—์„œ ์–ด์„ค ์…˜์ด ํŠธ๋ฆฌ๊ฑฐ ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ str::ptr::write ๊ฐ€ inner ๋Œ€ํ•œ ์œ ์ผํ•œ ์“ฐ๊ธฐ์ด๋ฏ€๋กœ previous ์—์„œ ์ฝ๊ธฐ ์ „์— ์ด๋ฏธ ๋ฐœ์ƒ ํ–ˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. false ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.


์ด ์ถ”์  ๋ฌธ์ œ๊ฐ€์ด ์งˆ๋ฌธ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@RalfJung @scottjmaddox ๋‹ต๋ณ€ ๋ฐ”๋กœ ๋‚ด๊ฐ€ ์š”์ฒญํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.
@HeroicKatora ๋„ค, ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์˜ฌ๋ฐ”๋ฅธ ์ฃผ๋ฌธ์ผ๊นŒ์š”?

struct Foo {bar: bool, baz: String}

fn main () {
    let mut uninit_foo = MaybeUninit::<Foo>::uninitialized();
    unsafe { ptr::write_unaligned(&mut ((*uninit_foo.as_mut_ptr()).bar) as *mut bool, true); }
    unsafe { ptr::write_unaligned(&mut ((*uninit_foo.as_mut_ptr()).baz) as *mut String, "".to_string()); }
}

( ๋†€์ดํ„ฐ )

ํฌ์ธํ„ฐ ( &mut foo as *mut T )์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฆ‰์‹œ ์บ์ŠคํŒ…ํ•˜๋ฉด ์‹ค์ œ๋กœ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค๋Š” Reddit (๋ถˆํ–‰ํžˆ๋„ ๋” ์ด์ƒ ์ฐพ์„ ์ˆ˜ ์—†์Œ)์— ๋Œ€ํ•œ ์ฃผ์„์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ *uninit_foo.as_mut_ptr() ๋น„ํŠธ๋Š” ๋‚˜๋ฅผ ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋‹จ์ผํ™” ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์—ญ ์ฐธ์กฐํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ฝ์ง€ ์•Š์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐ unaligned ์˜ ๋ณ€์ข… ptr::write ์ด์ƒ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค MaybeUninit<T> ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ•„๋“œ๋ฅผ ์ •๋ ฌ ํ•œ ๊ฒƒ ๊ฐ™์€?

write_unaligned ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•„๋“œ ์ •๋ ฌ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ &mut ๋ฅผ *mut ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— as *mut bool ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์œ ์ถ” ๋œ ๊ฐ•์ œ๊ฐ€ ์•ˆ์ „ / ์œ ํšจํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ด๊ณ  as *mut _ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋ ค๋ฉด ํฌ์ธํ„ฐ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@scottjmaddox ๊ตฌ์กฐ์ฒด๊ฐ€ #[repr(packed)] ๊ฒฝ์šฐ์—๋„ ptr::write ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•ฉ๋‹ˆ๊นŒ? ptr::write ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๋ฏ€๋กœ ํŒจํ‚น ๋œ ํ‘œํ˜„์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ptr::write_unaligned ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (์†”์งํžˆ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ •๋ ฌ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜์—†๋Š” " MaybeUninit<T> ์ด์ƒ์˜ ์ผ๋ฐ˜ ์ฝ”๋“œ"์˜ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ

์ฆ‰, ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฆ‰์‹œ ์บ์ŠคํŒ… (& mut foo as * mut T)ํ•˜๋ฉด ์‹ค์ œ๋กœ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋˜๋Š” ๋‚ด์šฉ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€์ด ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์˜๋ฏธ ์ฒด๊ณ„์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. IR์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ถ”๊ฐ€ ๊ฐ€์ •์„ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜๋ฏธ ๋ก ์  ํšจ๊ณผ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @scottjmaddox ๋Š” ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์—ฐ์‚ฐ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ์ •ํ™•ํ•˜์ง€๋งŒ ์งˆ๋ฌธ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ref-to-ptr ๊ฐ•์ œ ๋ณ€ํ™˜ ์ด์ „ ๋ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ @mjbshaw ๋Š” ์ธ์ˆ˜๊ฐ€ ์•Œ ์ˆ˜์—†๋Š” ์ผ๋ฐ˜ ์ธ์ˆ˜ ์ธ ๊ฒฝ์šฐ ptr::write_unaligned ๊ฐ€ ํ•„์š”ํ•œ ์ผ๋ฐ˜ ์•ˆ์ „์— ๋Œ€ํ•ด ๊ธฐ์ˆ ์ ์œผ๋กœ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์„ ์–ด๋””์„œ ์ฝ์—ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์ง€๋งŒ (nomicon? @RalfJung ์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ํ•˜๋‚˜?) ์›์‹œ ํฌ์ธํ„ฐ ์—ญ ์ฐธ์กฐ, ์ฐธ์กฐ ๋ฐ ์ฐธ์กฐ๋ฅผ ํฌ์ธํ„ฐ๋กœ ์ฆ‰์‹œ ๋ณ€ํ™˜ ( ๊ฐ•์ œ ๋˜๋Š” ์บ์ŠคํŒ…)์€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํ•„๋“œ์— ์“ฐ๋Š”์ด ๋ณ€ํ˜•์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ get_mut ()๋ณด๋‹ค ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๋œ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ptr :: write์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์ฝ”๋“œ ์ง€์ ์—์„œ ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€ ํ•„๋“œ์— & mut _์„ ์ƒ์„ฑํ–ˆ์œผ๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ ๋  ์ „์ฒด ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒํผ ์ •์˜๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๊ฒƒ์ด ์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋œ ์ƒํƒœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋„๋ก ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๊นŒ?

์•„์ฃผ ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค! ์ด๋Ÿฌํ•œ ์šฐ๋ ค๊ฐ€ ๋‚ด๊ฐ€ https://github.com/rust-lang/rfcs/pull/2582๋ฅผ ์—ฐ ์ด์œ  ์ค‘ ํ•˜๋‚˜ &mut ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  *mut ํ•ฉ๋‹ˆ๋‹ค.

@mjbshaw Touchรฉ. ์˜ˆ, ๊ตฌ์กฐ์ฒด๊ฐ€ ํŒจํ‚น ๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ์˜ณ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ptr::write_unaligned ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋…น์Šฌ์ง€ ์•Š๋Š” ๊ตฌ์กฐ๋ฅผ ์•„์ง ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์—๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์•„๋งˆ ์ž˜๋ ค์ง„ ๋ณดํ’€ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ด€๋ จ ์ž˜๋ฆฐ ๋ฆฐํŠธ๊ฐ€ ๋ณด์ด์ง€ ์•Š์•„์„œ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust-clippy/issues/3659

mem::zeroed ๋น„์ถ”์ฒœ์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/pull/57825

์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œ๋กœํ™”์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ํฌํฌํ•˜๊ธฐ ์œ„ํ•ด RFC repo์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ํ™•๋ณด๋˜๋ฉด ์–ธ์  ๊ฐ€ mem::zeroed ๋ฅผ ํ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com / rust-lang / rfcs / issues / 2626

const uninitialized , as_ptr ๋ฐ
๋‚˜๋จธ์ง€ API๋ณด๋‹ค as_mut_ptr ์•ž์„œ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ๋Š” ์ด๊ฒƒ๋“ค์ด
์ง€๊ธˆ์ฒ˜๋Ÿผ ์•ˆ์ •ํ™”๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋จธ์ง€ API๋Š”
as_ptr ๋ฐ as_mut_ptr ์ƒ๋‹จ์ด๋ฏ€๋กœ ์ผ๋‹จ ์•ˆ์ •ํ™”๋˜๋ฉด
์•ˆ์ •์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜๋Š” crates.io์— MaybeUninitExt ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋” ๋งŽ์€ ์‚ฌ๋žŒ (์˜ˆ : ์•ˆ์ • ์ „์šฉ ์‚ฌ์šฉ์ž)์„ ํ—ˆ์šฉํ•˜๋„๋ก ํ˜„์žฌ ๋…ผ์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

์ž„๋ฒ ๋””๋“œ์—์„œ๋Š” ์ „์—ญ ํ• ๋‹น ์ž (๋ถˆ์•ˆ์ •) ๋Œ€์‹  ์ •์  ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋งŽ์ด . MaybeUninit ์—†์ด๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
์•ˆ์ •๋œ ์ •์  ๋ณ€์ˆ˜. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ณ ์ • ์šฉ๋Ÿ‰์„ ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ •์  ๋ณ€์ˆ˜์˜ ์ปฌ๋ ‰์…˜ ๋ฐ ๋Ÿฐํƒ€์ž„์‹œ ์ •์  ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”
์ œ๋กœ ๋น„์šฉ. ์ด API ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ฐจ๋‹จ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž„๋ฒ ๋””๋“œ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด
[์„ค๋ฌธ ์กฐ์‚ฌ] ์ง€์—ญ ์‚ฌํšŒ์— ๊ทธ๋“ค์˜ ๊ณ ์ถฉ๊ณผ ํ•„์š”์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •ํ™”
MaybeUninit ๋Š” ์•ˆ์ •์„ ์œ„ํ•ด ๋‘ ๋ฒˆ์งธ๋กœ ๋งŽ์€ ์š”์ฒญ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
const fn with trait bounds) ๊ทธ๋ฆฌ๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ์ˆ˜์‹ญ ๊ฐœ ์ค‘ 7 ์œ„๋ฅผ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
rust-lang / * ๊ด€๋ จ ์š”์ฒญ. WG ๋‚ด๋ถ€ ์‹ฌ์˜ ๋์— ์šฐ๋ฆฌ๋Š”
์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ์˜ˆ์ƒ๋˜๋Š” ์˜ํ–ฅ์œผ๋กœ ์ธํ•ด ์ „์ฒด์ ์œผ๋กœ 3 ์œ„์— ์šฐ์„  ์ˆœ์œ„๋ฅผ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

(๋” ๊ฐœ์ธ์ ์ธ ๋ฉ”๋ชจ์—์„œ ์ €๋Š” ์ž„๋ฒ ๋””๋“œ ๋™์‹œ์„ฑ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ์ž‘์„ฑ์ž์ž…๋‹ˆ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ MaybeUninit (๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ 10-50 %๊นŒ์ง€ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”
์ด๋ฅผ ์œ„ํ•ด ์•ผ๊ฐ„ ์ „์šฉํ™”๋ฌผ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
์•ผ๊ฐ„ ์ „์šฉ ์ž„๋ฒ ๋””๋“œ ๋ฐ ์ตœ๊ทผ์—์•ผ ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์•ผ๊ฐ„ ์ „์šฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ž˜๋ชป๋œ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ์ด API๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ธฐ๋ฅผ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

@japaric ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ 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 ๋ฅผ ์ˆ˜๋ฝํ•˜๊ธฐ ์ „์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ์ •ํ™”ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ ์–ด๋„ ๋‹ค์Œ์€ UB๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ™•์‹คํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let x: MaybeUninit<(!, u32)> = MaybeUninit::uninitialized();
let r1: *const ! = &(*x.as_ptr()).1; // immediately coerced to raw ptr, no UB
let r2 = &(*x.as_ptr()).1 as *const !; // immediately cast to raw ptr, no UB

(ํ‰์†Œ์™€ ๊ฐ™์ด ! ๋Š” ์—ฌ๊ธฐ์—์„œ ๋ถ‰์€ ์ฒญ์–ด์ด๊ณ ,์ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชจ๋“  ์˜ˆ์ œ๋Š” bool ๋Œ€์‹  ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด UB-wise์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.)

๋‚ด ํฌ๋ง์€ MaybeUninit๋ฅผ ํ•˜๋‚˜์˜ ์ผ๊ด€๋œ "ํŒจํ‚ค์ง€"๋กœ ์•ˆ์ •ํ™”์‹œ์ผœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์Šคํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ๋งŒ ๋‹ค์‹œ ๋ฐฐ์šฐ๋ฉด๋˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธธ์„ ๋”ฐ๋ผ ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ์ฃผ์žฅ์ด ๋งค์šฐ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ฆ‰๊ฐ์ ์ธ ํ•„์š”๋Š” UB์—†์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹จ์ˆœํžˆ "์›์‹œ ํฌ์ธํ„ฐ ์‚ฌ์šฉ ๋ฐ ptr::read_unaligned ๋ฐ ptr::write_unaligned "์ธ ๊ฒฝ์šฐ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์Šคํƒ ๊ฐ’์— ๋Œ€ํ•œ ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ•„๋“œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋ ค๋ฉด ์ž˜ ์ •์˜ ๋œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. . rust-lang / rfcs # 2582 (์ผ๋ถ€ ๋ฌธ์„œ ํฌํ•จ)๋Š” ์ฆ‰๊ฐ์ ์ธ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ MaybeUninit ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@scottjmaddox ๊ทธ RFC๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?ํ•˜์ง€๋งŒ MaybeUninit ์—†์œผ๋ฉด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ (์Šคํƒ) ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ?

@RalfJung ๋‚˜๋Š” ๋‹ค์Œ์ด UB์ธ์ง€ ์—ฌ๋ถ€์— ๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋‚ด ๋ฌต์‹œ์ ์ธ ๊ฐ€์ •์€ rust-lang / rfcs # 2582 ๊ฐ€ ์œ„์˜ ์˜ˆ๋ฅผ ์œ ํšจํ•˜๊ณ  ์ž˜ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”.

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

UB์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ์™€๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ฌต์‹œ์ ์ธ ๊ฐ€์ •์€ rust-lang / rfcs # 2582๊ฐ€ ์œ„์˜ ์˜ˆ๋ฅผ ์œ ํšจํ•˜๊ณ  ์ž˜ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ์™„์ „ํžˆ ๋†€๋ž๋‹ค. RFC๋Š” ์ฐธ์กฐ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ ๊ทธ๊ฒƒ์ด ๋ถ€์šธ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ?

๋ฟก๋ฟก

UB์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ์™€๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

mem :: uninitialized () ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

Rust์˜ ์ •์ƒ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ๋ฅผ ์šฐํšŒํ•˜๋ฉด์„œ T ์œ ํ˜•์˜ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์ฒ™ํ•˜๋ฉด์„œ ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์—๋Š” 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 )์˜ ๋‘ ๊ฐœ์˜ _valid_ ๊ฐ’๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค

mem::uninitialized ๋Š” ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ uninitialized ๊ฐ’์„ ๊ฐ–๋Š” ๋น„ํŠธ ํŒจํ„ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ ํŒจํ„ด์€ 0x0 ๋„ 0x1 ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ฒฐ๊ณผ bool ๋Š” _invalid_์ด๊ณ  ๋™์ž‘์€ ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘์„ ์ •์˜ํ•˜๋ ค๋ฉด true , false ๋˜๋Š” uninitialized ์„ธ ๊ฐ€์ง€ ์œ ํšจํ•œ ๊ฐ’์„ ์ง€์›ํ•˜๋„๋ก bool ์˜ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ T-lang๊ณผ T- ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฏธ bool ๊ฐ€ C์˜ _Bool ์™€ ๋™์ผํ•˜๋‹ค๊ณ  RFC๋ฅผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. bool ๋Š” C FFI์—์„œ ์ด์‹ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์‚ฌ์šฉ).

ํ‹€๋ฆผ์—†์ด C๋Š” Rust์™€ ๋˜‘๊ฐ™์€ ์œ ํšจ์„ฑ ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ C "ํŠธ๋žฉ ํ‘œํ˜„"์€ ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์ด true ๋˜๋Š” false ์„ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๋Š” _Bool ๋กœ C์—์„œ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•˜๋‹ค๋ฉด ๋‹ค์Œ ์•ˆ์ „ ์ฝ”๋“œ๋„ UB ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

let x: bool;
x = true;

๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ์šฐ ๋‹ค์Œ ์•ˆ์ „ ์ฝ”๋“œ๋„ UB ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

let x: bool; ๋Š” x ์„ uninitialized ๋น„ํŠธ ํŒจํ„ด์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉฐ x ๋ฅผ ์ „ํ˜€ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. x = true; x ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค (์ฐธ๊ณ  : x ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค).

์ด๋Š” ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ _Bool x; x ๋ฅผ _indeterminate_ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” C์˜ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” x ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜ ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

mem::uninitialized ์˜ ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ดˆ๊ธฐํ™” ์ถ”์ ์— ๊ด€ํ•œ ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค .

let x: bool; ๋Š” ์ž์ฒด์ ์œผ๋กœ x ๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์„ ์˜ˆ์•ฝํ•˜์ง€ ์•Š๊ณ  ์ด๋ฆ„ ๋งŒ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. let x = foo; ์•ฝ๊ฐ„์˜ ๊ณต๊ฐ„์„ ์˜ˆ์•ฝํ•˜๊ณ  foo ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. let x: bool = mem::uninitialized(); ๋งค์žฅ๋Ÿ‰ 1 ๊ณต๊ฐ„์˜ ๋ฐ”์ดํŠธ x ํ•˜์ง€๋งŒ์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์žŽ, ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ mem :: uninitialized์— ๋Œ€ํ•œ ์ „๋ฌธํ™”์™€ ํ•จ๊ป˜ mem :: uninitialized ๋ฐ intrinsics :: uninit ๋ชจ๋‘์— ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•˜๋Š” ๋‹ค๋ฆฌ ๋””์ž์ธ API๋ฅผ ์ดฌ์˜ํ•˜๋Š” ๋งค์šฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ๋‹นํ™ฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ mem :: uninitialized๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bool์ด ํฌํ•จ ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋„ UB์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@kpp

๋˜ํ•œ mem :: uninitialized๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bool์ด ํฌํ•จ ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ๋„ UB์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ-๋‹น์‹ ์ด ์•„๋งˆ ์•Œ๊ณ  ๊ณ„์‹œ ๊ฒ ์ง€๋งŒ, mem::uninitialized ์€ (๋Š”) ๋ฐœ์— ์ด์„ ์˜๋Š” ๊ฒƒ์ด ์‚ฌ์†Œํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” MaybeUninit ๋Œ€์‹  ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข€ ๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ์œ ๋‹ˆ์˜จ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ตฌ์ฒดํ™”ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ’์„ "๋ถ€๋ถ„์ ์œผ๋กœ"์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. _invalid_ ์ƒํƒœ์˜ ๊ฐ’ ์ž์ฒด. ๊ฐ’์€ into_inner() ํ˜ธ์ถœ ํ•  ๋•Œ๊นŒ์ง€๋งŒ ์™„์ „ํžˆ _valid_๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ ๋ฐ ์„ ํƒ ์ทจ์†Œ (๋น„) ์ดˆ๊ธฐํ™”์— ๋Œ€ํ•œ nomicon ์„น์…˜์„ ์ฝ๋Š” ๋ฐ ๊ด€์‹ฌ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://doc.rust-lang.org/nomicon/checked-uninit.html let x: bool; ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ Rust์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ดํ•ดํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์„ค๋ช…์€ ์•„์ง RFC ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— "๋น„ ๊ทœ๋ฒ” ์ "์ด๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ง€์นจ WG๋Š” ์˜ฌํ•ด ์–ธ์  ๊ฐ€ ํ˜„์žฌ ํ–‰๋™์„ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๋ณด์žฅํ•˜๋Š” RFC๋ฅผ ์ œ์ถœํ•˜๋ ค๊ณ  ์‹œ๋„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ mem :: uninitialized ๋ฐ intrinsics :: uninit๋กœ ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•˜๋Š” ๋‹ค๋ฆฌ ์„ค๊ณ„ API๋ฅผ ์ดฌ์˜ํ•˜๋Š” ๋งค์šฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ํ˜„์žฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฌธ์„œ๋ฅผ "์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋„๋ก MaybeUninit ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.


๊ฐ™์€ ์ด๋Ÿฐ ํ† ๋ก  ๋ฐ ๋ฌธ์ œ ์ด ๋‚˜๋ฅผ ๋”์šฑ ๋”์™€ @japaric ์šฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋ฌธ ๋ฐ–์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์–ป์–ด์•ผํ•œ๋‹ค ๋™์˜ ๋ฉ”์ดํฌ์—…. ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ์ด ์™€ ์ด ์ฒดํฌ ๋ฐ•์Šค์˜ ๋ชฉ๋ก์„ ์ณค๋‹ค ์–ป์„, ๋‚ด๊ฐ€ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ํŒจํ„ด์„ ์ œ๊ณตํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

const uninitialized, as_ptr ๋ฐ
๋‚˜๋จธ์ง€ API๋ณด๋‹ค ์•ž์„œ as_mut_ptr? ๋‚˜์—๊ฒŒ๋Š” ์ด๊ฒƒ๋“ค์ด
์ง€๊ธˆ์ฒ˜๋Ÿผ ์•ˆ์ •ํ™”๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด +1. ์ด ๊ธฐ๋Šฅ์„ ์•ˆ์ •์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ๋“ค์€์ด ๊ธฐ๋ณธ ํ•˜์œ„ ์ˆ˜์ค€ API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ์ƒ์œ„ ์ˆ˜์ค€ (์ž ์žฌ์ ์œผ๋กœ ์•ˆ์ „ํ•œ) API๋ฅผ ์‹คํ—˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  API์˜ ์ด๋Ÿฌํ•œ ์ธก๋ฉด์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ get_ref ๋ฐ get_mut ์€ (๋Š”) ์•ˆ์ •ํ™”๋˜์ง€ ์•Š๊ณ  ์™„์ „ํžˆ ์ œ๊ฑฐ ๋  ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐธ์กฐ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์›์‹œ ํฌ์ธํ„ฐ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ๋“ค์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์–ด๋„ as_ptr ๋ฐ as_mut_ptr ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์œ ํ˜น์„๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค),์ด ๊ฒฝ์šฐ์—๋Š” UB๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” ๋ฐ˜๋ฉด ํฌ์ธํ„ฐ ๋ฉ”์„œ๋“œ๋Š” ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์›์‹œ ํฌ์ธํ„ฐ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทœ์น™์ด "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ"์ด๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช…์‹œ ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒํ•ด์•ผ๋งŒ ๊ทธ๋Ÿฌํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•จ์œผ๋กœ์จ ์‚ฌ๋žŒ๋“ค์ด์ด ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๋„์™€์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

https://github.com/rust-lang/rfcs/pull/2582 ๊ฐ€์ •ํ•˜๋ฉด (1) (2)๊ฐ€ UB๋„ ์•„๋‹ˆ๊ณ  (1) ํฌ์ธํ„ฐ์˜ ์—ญ ์ฐธ์กฐ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์™„์ „ํžˆ ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ? ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”?

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

๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๋…ผ๋ฆฌ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ (์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ† ๋ก ์˜ ์ผ๋ถ€๋ฅผ MaybeUninit์— ๋Œ€ํ•œ ๋ฌธ์„œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค)? ๋‚˜๋Š” (1)์—์„œ ์—ญ ์ฐธ์กฐ ๋œ ๊ฐ’์ด ํ•ญ์ƒ "rvalue"๋กœ ์œ ์ง€๋˜๊ณ  "lvalue"๊ฐ€๋˜์ง€ ์•Š๊ณ  "lvalue"๊ฐ€๋˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด, (2)์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ bool์ด "lvalue"๊ฐ€๋˜์–ด ์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ตฌ์ฒดํ™”๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ฒƒ์„ ์ถ”์ธกํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ด๊ฒƒ์ด Rust์—์„œ ์ •ํ™•ํ•œ ์šฉ์–ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ C ++์— ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค).

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ฒ˜์Œ์— ์ด๋Ÿฌํ•œ ํ˜ผ๋ž€์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•„๋“œ์— ๋Œ€ํ•œ ์›์‹œ ํฌ์ธํ„ฐ๋กœ ์ง์ ‘ ํ‰๊ฐ€๋˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ํ•„๋“œ ์•ก์„ธ์Šค ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ RFC๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ทœ์น™์ด "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ"์ธ ๊ฒฝ์šฐ

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทœ์น™์ด๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ UCG์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” (2)๊ฐ€ UB์ธ๋ฐ๋„ (1)์ด UB๊ฐ€ ์•„๋‹ˆ๋ฉฐ (1)์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์˜ ์—ญ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์™„์ „ํžˆ ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ?

์ข‹์€ ์งˆ๋ฌธ! ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. &mut foo as *mut bool ๋ฅผ &raw mut foo ์œ ํ˜•์˜ ์›์ž ์‹์ธ *mut bool . ์—ฌ๊ธฐ์—๋Š” ์ฐธ์กฐ๊ฐ€์—†๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์›์‹œ ptr ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

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

UB์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ์™€๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ฌต์‹œ์ ์ธ ๊ฐ€์ •์€ rust-lang / rfcs # 2582 ๊ฐ€ ์œ„์˜ ์˜ˆ๋ฅผ ์œ ํšจํ•˜๊ณ  ์ž˜ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ์™„์ „ํžˆ ๋†€๋ž๋‹ค. RFC๋Š” ์ฐธ์กฐ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ ๊ทธ๊ฒƒ์ด ๋ถ€์šธ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ?

@RalfJung ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ํšจํ•œ bool ๊ฐ’์œผ๋กœ ์ฆ‰์‹œ ๋ฎ์–ด ์จ ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด ๊ด€์ฐฐ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด UB๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์š”?

x์˜ ๊ฐ’์ด Drop์„ ๊ตฌํ˜„ํ•˜๋Š” ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๋ฎ์–ด ์“ฐ๋ ค๋ฉด ์›์‹œ ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ UB๋ฅผ ํ”ผํ•˜๋ ค๋ฉด rfc 2582๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์€ ์œ ํšจํ•œ bool ๊ฐ’์œผ๋กœ ์ฆ‰์‹œ ๋ฎ์–ด ์จ์„œ ๊ด€์ฐฐ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— UB๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์š”?

์˜๋ฏธ๋ก ์€ ๋ฌธ๋ณ„๋กœ ๋ฌธ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค (MIR๋ณด๊ธฐ). ๋ชจ๋“  ๋‹จ์ผ ์ง„์ˆ ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. let x: bool = mem::uninitialized(); ๋Š” ์ž˜๋ชป๋œ ๋ถ€์šธ์„ ๊ตฌ์ฒดํ™”ํ•˜๊ณ  ๋‚˜์ค‘์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๋ถ€์šธ์„ ๊ตฌ์ฒดํ™”ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

x์˜ ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฌธ๋งฅ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • ์˜ˆ์˜ ๋งฅ๋ฝ์—์„œ ํ–‰๋™์ด ์ž˜ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” "์ •์˜๋˜์ง€ ์•Š์€ ํ–‰๋™"์˜ ์˜๋ฏธ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํŠน์ • ๋ถˆ๋ณ€์— ์˜์กด ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋“ค์€ ํ•ญ์ƒ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ถˆ๋ณ€ ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์—‰๋ง์ด๋ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‹น์‹ ์€ "๊ฐ’์„ ๊ฒ€์‚ฌ ํ•˜๋Š” ๋ฐ๋Š” ํƒ€๋‹น์„ฑ ๋ถˆ๋ณ€์ด ํ•„์š”ํ•˜๋‹ค"๋ผ๋Š” ํ˜•์‹์„ ๊ธฐ๋Œ€ํ•˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ, "๊ฒ€์‚ฌ"๋Š” bool ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค if . ์ด๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ์–‘์ด์ง€๋งŒ ๋œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ’์ด ๋ถˆ๋ณ€์„ ๊ฐ€์ •ํ•˜๊ธฐ ์ „์— ์‹ค์ œ๋กœ "๊ฒ€์‚ฌ"๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š”ํ•˜๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด์—†๋Š” ๊ฒƒ์„ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ๊ธฐ์ˆ ์€ ์›ํ•˜๋Š” ์ตœ์ ํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๊ณ  (์•ˆ์ „ํ•˜์ง€ ์•Š์€) ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ธฐ๋Œ€์— ๋ถ€ํ•ฉํ•˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์˜ ์ •์˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"์ •์˜๋˜์ง€ ์•Š์€ ํ–‰๋™"์˜ ์˜๋ฏธ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ผ์ง€ ๋งŒ ์งง์€ ๋Œ€๋‹ต์€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ์‚ฌ์šฉ์ž์™€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ„์˜ ๊ณ„์•ฝ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์•ฝ์—๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž์˜ ์˜๋ฌด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ๋ช… ์˜๋ฌด์ž…๋‹ˆ๋‹ค. "NULL ํฌ์ธํ„ฐ๋ฅผ deeferencing a NULL pointer is UB"๋Š” "ํฌ์ธํ„ฐ๊ฐ€ ์—ญ ์ฐธ์กฐ ๋  ๋•Œ๋งˆ๋‹ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š”์ด ํฌ์ธํ„ฐ๊ฐ€ NULL ์ผ ์ˆ˜ ์—†์Œ์„ ์ฆ๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํฌ์ธํ„ฐ๊ฐ€ ์—ญ ์ฐธ์กฐ ๋  ๋•Œ๋งˆ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ๋Š” "์•„ํ•˜! ์—ฌ๊ธฐ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํฌ์ธํ„ฐ๊ฐ€ NULL์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ฆ๋ช… ํ–ˆ์œผ๋ฏ€๋กœ ์ตœ์ ํ™” ๋ฐ ์ฝ”๋“œ ์ƒ์„ฑ์—์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. , ํ”„๋กœ๊ทธ๋ž˜๋จธ! "

๊ณ„์•ฝ์ด ์ •ํ™•ํžˆ ๋งํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : LLVM์— ์˜ํ•ด ์ œ์•ฝ ๋จ). ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ UCG๋Š” (์–ธ์–ด ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์—์„œ๋“ค์€ ๋ฐ”์— ๋”ฐ๋ผ) ๊ณ„์•ฝ์— ๋‹ค์Œ ์ ˆ์ด ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. "rvalue๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ๋งˆ๋‹ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š”์ด rvalue๊ฐ€ ํ•ญ์ƒ ํƒ€๋‹น์„ฑ ๋ถˆ๋ณ€์„ ๋งŒ์กฑ ์‹œํ‚ค์‹ญ์‹œ์˜ค. " ๊ณ„์•ฝ์„œ์—์ด ์กฐํ•ญ์„ ํฌํ•จํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๋ฌผ๋ฆฌ ๋ฒ•์น™์ด๋‚˜ ์ปดํ“จํ„ฐ๋Š” ์—†์ง€๋งŒ ๋‹ค์–‘ํ•œ ์„ ํƒ ์‚ฌ์ด์—์„œ ํ•ฉ๋ฆฌ์ ์ธ ํƒ€ํ˜‘์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ, ์šฐ๋ฆฌ๋Š” ์•ฝํ•œ ๊ณ„์•ฝ์œผ๋กœ ์ •๋‹นํ•˜๊ฒŒ ๋ฐฉ์ถœ ํ•  ์ˆ˜์—†๋Š” LLVM์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ด๋ฏธ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  LLVM์— ์•Œ๋ ค์ฃผ๋Š” ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋งˆ๋‹ค MaybeUninit ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค"์™€ " ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋œ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"์ค‘์—์„œ ์„ ํƒํ•˜๋ฉด ์ „์ž๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์„ ํƒ์ฒ˜๋Ÿผ.

์˜ˆ๋ฅผ ๋“ค์–ด :

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

์ด ์ฝ”๋“œ๋Š” ์˜ค๋Š˜๋‚  rustc์˜ UB์ž…๋‹ˆ๋‹ค. mem::uninitialized::<bool>() ์— ๋Œ€ํ•œ (์ตœ์ ํ™”๋˜์ง€ ์•Š์€) LLVM IR์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

; core::mem::uninitialized
; Function Attrs: inlinehint nonlazybind uwtable
define zeroext i1 @_ZN4core3mem13uninitialized17h6c99c480737239c2E() unnamed_addr #0 !dbg !5 {
start:
  %tmp_ret = alloca i8, align 1
  %0 = load i8, i8* %tmp_ret, align 1, !dbg !14, !range !15
  %1 = trunc i8 %0 to i1, !dbg !14
  br label %bb1, !dbg !14

bb1:                                              ; preds = %start
  ret i1 %1, !dbg !16
}
; snip
!15 = !{i8 0, i8 2}

๊ธฐ๋ณธ์ ์œผ๋กœ์ด ํ•จ์ˆ˜๋Š” ์Šคํƒ์— 1 ๋ฐ”์ดํŠธ๋ฅผ ํ• ๋‹น ํ•œ ๋‹ค์Œ ํ•ด๋‹น ๋ฐ”์ดํŠธ๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜๋กœ๋“œ๋Š” !range ๋กœ ํ‘œ์‹œ๋˜์–ด LLVM์— ๋ฐ”์ดํŠธ๊ฐ€ 0 <= x <2 ์‚ฌ์ด ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, 0 ๋˜๋Š” 1 ๋งŒ ๊ฐ€๋Šฅํ•จ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. LLVM์€ ์ด๊ฒƒ์ด ์ฐธ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋™์ž‘์€ ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒฝ์šฐ.

์š”์•ฝํ•˜๋ฉด ๋ฌธ์ œ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ณ  ์ด๋™ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

๋ฐ•๋žŒํšŒ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด์ œ ํ›จ์”ฌ ๋” ๋ช…ํ™• ํ•ด์กŒ์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” "์ •์˜๋˜์ง€ ์•Š์€ ํ–‰๋™"์˜ ์˜๋ฏธ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ด ์ผ๋ จ์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ (๋‘ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์— ๋‹ค์†Œ ํฅ๋ฏธ๋กญ๊ณ  ๋ฌด์„œ์šด ์˜ˆ์ œ๊ฐ€ ์žˆ์Œ)์€ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. http://blog.llvm.org/2011/05/what-every-c-programmer-should-know .html

์ •๋ง ์ข‹์€ ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณ€๊ฒฝ ํ•œ ์‚ฌํ•ญ์€ ๋‚ด๊ฐ€ ๋‚˜์—ด ํ•  ์ˆ˜์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ์™€ ๋‚ด๊ฐ€ ํ•  ์ˆ˜์—†๋Š” ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์— ์ข‹์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ (๋ฐ ๊ธฐํƒ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ)์€ ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Nomicon์—๋Š” uninitialized ์— ๋Œ€ํ•œ ์„น์…˜ ์ด ์žˆ์ง€๋งŒ (์•„๋งˆ๋„์ด โ€‹โ€‹์œ ํ˜•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์—…๋ฐ์ดํŠธ ๋  ๊ฒƒ์ž„) ๋ฌธ์ œ์˜ ์ „์ฒด์ ์ธ ๋ณต์žก์„ฑ์„ ํ‘œํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(์ €๋Š” ๊ทธ๋Ÿฌํ•œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ž์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋ณด๋‹ค ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•„๋Š” ์‚ฌ๋žŒ์„ ์ง€๋ช…ํ•ฉ๋‹ˆ๋‹ค.)

https://github.com/rust-lang/rust/issues/55422#issuecomment -433943803์˜ ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด : into_inner ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ MaybeUninit::into_inner(foo) ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. foo.into_inner() MaybeUninit::into_inner(foo) ๋Œ€์‹  foo.into_inner() -๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/58129์—์„œ ์ผ๋ถ€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  &mut T ์—์„œ set &mut T ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  into_inner ์ด๋ฆ„์„ into_initialized

๊ทธ ํ›„์— https://github.com/rust-lang/rust/pull/56138 ์ด ํ•ด๊ฒฐ๋˜๋ฉด API์˜ ์ผ๋ถ€ ์•ˆ์ •ํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ƒ์„ฑ์ž, as_ptr , as_mut_ptr , set , into_initialized ).

MaybeUninit::zeroed() ๊ฐ€ const fn ๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ( MaybeUninit::uninitialized() ์€ const fn )

ํŽธ์ง‘ : ์‹ค์ œ๋กœ ์•ผ๊ฐ„ Rust๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ const fn ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

MaybeUninit::zeroed() ๊ฐ€ const fn ๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ( MaybeUninit::uninitialized() ์€ const fn )

@gnzlbg ์‹œ๋„ ํ–ˆ์ง€๋งŒ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณง ์•ˆ์ •ํ™”๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๊ฑฑ์ •๋˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์‹ค์ œ๋กœ์ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์ด ์ „ํ˜€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ์ด ์•ˆ์ •ํ™”๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ API ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@ rust-lang / libs ๋ฉ”์†Œ๋“œ ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์กฐ๊ฑด์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด MaybeUninit::as_ptr(...) ์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๊ธฐ์—์žˆ๋Š” ์ผ๋ถ€ ์ž‘์—…์ด ํ•จ์ˆ˜ ์—ฌ์•ผํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋  ์ฝ”๋“œ๋ฅผ ๋‚ ๋ ค ๋ฒ„๋ฆด๊นŒ ๊ฑฑ์ •๋œ๋‹ค.ํ•˜์ง€๋งŒ OTOH, ManuallyDrop ์ผ๋ถ€ ํ•จ์ˆ˜๋Š” ์ •ํ™•ํžˆ ์ด๊ฒƒ์„ํ–ˆ๋‹ค.

@RalfJung ๋‚ด ์ดํ•ด๋Š” ์‚ฌ์šฉ์ž ์œ ํ˜•์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์—ญ ์ฐธ์กฐํ•˜๋Š” ํ•ญ๋ชฉ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ”ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ManuallyDrop::take .

MaybeUninit<T> ๋Š” ๊ฒฐ์ฝ” Deref<Target = T> ๊ฐ€ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๋ฉ”์„œ๋“œ๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญํ•˜๋ฉด๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ MaybeUninit ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ std ์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. sys / sgx / ext / arch.rs ์—์„œ๋Š” ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ get_mut ์ž˜๋ชป ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ์™€ ์›์‹œ ํฌ์ธํ„ฐ๊ฐ€ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค (928efca1์—์„œ ์ˆ˜์ • ๋จ). ๋‚˜๋Š” ์ด๋ฏธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์— ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ๊ทธ ์ฐจ์ด๋ฅผ ์‹ค์ œ๋กœ ์•Œ์•„ ์ฐจ๋ฆฌ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. sys / sgx / rwlock.rs ์—์„œ const fn new() ์˜ ๋น„ํŠธ ํŒจํ„ด์ด C ํ—ค๋” ํŒŒ์ผ์˜ ๋ฐฐ์—ด ์ด๋‹ˆ์…œ ๋ผ์ด์ €์™€ ๋™์ผํ•œ ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” zeroed ๋‹ค์Œ์— set ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "do n't care"๋น„ํŠธ๊ฐ€ 0์ธ์ง€ ํ™•์ธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .
  1. out.get_mut() as *mut _ ! = out.as_mut_ptr() ์ด๋ฉด ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •๋ง C ++์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“  ๊ณ ์ณ ์กŒ์œผ๋ฉด ์ข‹๊ฒ ์–ด์š”.

get_mut() ์˜ ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ตœ๊ทผ์— ๋‚ด๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ํ•œ ๊ฐ€์ง€๋Š” MaybeUninit<T> ์ด T ์™€ ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง€๋„๋ก ๋ณด์žฅ๋˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํž™์˜ ๊ฐ’์„ ๋ถ€๋ถ„์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ ๋‹ค์Œ์ด๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ’, ์˜ˆ : ( ์ „์ฒด ๋†€์ดํ„ฐ )

struct Foo {
    x: i32,
}

let mut partial: Box<MaybeUninit<Foo>> = Box::new(MaybeUninit::uninitialized());
let complete: Box<Foo> = unsafe {
    ptr::write(&mut (*partial.as_mut_ptr()).x, 5);
    mem::transmute(partial)
};

Miri์— ๋”ฐ๋ฅด๋ฉด์ด ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ์œ ํ˜•์˜ ์ƒ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ์ž์ฒด๋กœ ์‚ฌ์šด๋“œ์ธ์ง€ ์•Œ ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ง€๊ธˆ์€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

@ Nemo157 into_inner ๊ฐ€ ์žˆ๋Š”๋ฐ ์™œ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

@Pzixel ์€ ์ดˆ๊ธฐํ™” ํ›„ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์Šคํƒ์— ํ• ๋‹น ๋œ ๊ฒฝ์šฐ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์œ ๋ฐœํ•˜๋Š” 100MB ๋ฒ„ํผ๋ฅผ ํฌํ•จํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑ ํ•˜๋ ค๋ฉด ์Šคํƒ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒ์ž๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ API fn uninit_boxed<T>() -> Box<MaybeUninit<T>> ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ box ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ,์ด ์ž‘ํ’ˆ์ฒ˜๋Ÿผ ๊ทธ ๋ณ€ํ˜•์˜๋ฅผ ๋ณผ ์ˆ˜์žˆ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํž™ ๊ณต๊ฐ„์„ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๋ฌธ์„ into_initialized ์Šคํƒ ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค ๋†€์ดํ„ฐ

@ Nemo157 ๋ณต์‚ฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์„ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์ปดํŒŒ์ผ์ด ๊ทธ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ์†์„ฑ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

์ตœ๊ทผ์— ๋‚ด๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ํ•œ ๊ฐ€์ง€๋Š” MaybeUninit<T> ์ด T ์™€ ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง€๋„๋ก ๋ณด์žฅ๋˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํž™์˜ ๊ฐ’์„ ๋ถ€๋ถ„์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ ๋‹ค์Œ์ด๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ’,

๋‚˜๋Š”์ด ๋ณด์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Œ์„ ์ฝ”๋“œ์ฃผ์˜์˜ ๋ถ€๋ถ€์™€ ํ•จ๊ป˜, ์œ ํšจํ•ฉ๋‹ˆ๋‹ค :

  • ์‚ฌ์šฉ์ค‘์ธ ์œ ํ˜• (ํŠนํžˆ ์ผ๋ฐ˜ ์ฝ”๋“œ)์— ๋”ฐ๋ผ ptr::write_unaligned ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ๋งŽ์€ ํ•„๋“œ๊ฐ€ ์žˆ๊ณ  ๊ทธ์ค‘ ์ผ๋ถ€๋งŒ ์ดˆ๊ธฐํ™” ๋œ ๊ฒฝ์šฐ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” ๋  ๋•Œ๊นŒ์ง€ T๋กœ ๋ณ€ํ™˜ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค .

์ด๊ฒƒ์€ ์•ˆ์ „ํ•œ ๋‚ด๋ถ€ ๋นŒ๋” ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด proc-macro์™€ ๊ฒฐํ•ฉ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค.

@Pzixel ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์ด ๊ฐ™์œผ๋ฉด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•œ ํ›„ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ปดํŒŒ์ผ๋Ÿฌ ๋Š” ๋ณต์‚ฌ๋ณธ์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๊ตฌ์กฐ์—์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@nicoburns ์˜ˆ, ์ง€๊ธˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #[same_layout] ๋˜๋Š” #[elide_copying] ๋˜๋Š” ๋‘˜ ๋‹ค ๋˜๋Š” transmute ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜ ๋‹ค ๋˜๋Š” ๋‹ค๋ฅธ ์†์„ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค #[elide_copying] . ๋˜๋Š” ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด into_constructed ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ ˆ์ด์•„์›ƒ์— ๊ด€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ํ˜„๋ช…ํ•œ ์‚ฌ๋žŒ๋“ค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. into_constructed ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ  ์ถ”๊ฐ€ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์ง€๋งŒ @ Nemo157 ์€ transmute ๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. into_constructed ๊ฐ€ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜์—†๋Š” ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

out.get_mut() as *mut _ ! = out.as_mut_ptr() ์ด๋ฉด ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •๋ง C ++์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“  ๊ณ ์ณ ์กŒ์œผ๋ฉด ์ข‹๊ฒ ์–ด์š”.

get_mut() ์˜ ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” get_mut() ์™€ get_ref() ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ํ˜ผ๋ž€ ์Šค๋Ÿฝ๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ์‹ค์ˆ˜๋กœ ์‰ฝ๊ฒŒ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ„์˜ ๋น„์Šทํ•œ ์ ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค ( as_ptr() ์— ๋Œ€ํ•œ ๋” ์•ˆ์ „ํ•œ ๋Œ€์•ˆ์ด๋˜๋Š” ํ™˜์ƒ์„์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. as_mut_ptr() ์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.)

@RalfJung์ด ์•ˆ์ •ํ™”๋ฅผ ์ œ์•ˆํ•œ API์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (https://www.ralfj.de/blog/2019/02/12/all-hands-recap.html ์ฐธ์กฐ).

@RalfJung ptr::freeze() ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ๋Œ€ํ•ด (https://www.ralfj.de/blog/2019/02/12/all-hands-recap.html) :

MaybeUninit ? ( MaybeUninit::frozen() , MaybeUninit::abitrary() ๋˜๋Š” ์œ ์‚ฌ)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ๊นŒ์š”? ์ง๊ด€์ ์œผ๋กœ, ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” zeroed ์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๋Š” ๋น„์šฉ์—†์ด ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ง„์ •์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋งŒํผ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š๋Š” ํ•œ uninitialized ์ƒ์„ฑ์ž๋ณด๋‹ค ๊ถŒ์žฅ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ ์—์„œ "๊ณ ์ • ๋œ"๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€"๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ—‰

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 ! ๋ฌด์ธ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MaybeUninit::<!>::uninitiailized().get_mut() ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด as_mut_ptr ๊ฐ€ ๋œ ์œ„ํ—˜ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@nicoburns ( freeze ๋Š” ๋‚ด ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ํ† ๋ก ์˜ ์ผ๋ถ€ ์˜€๊ณ  ์ œ์•ˆ์„ ๋งŽ์ด ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.)

@RalfJung์ด ์•ˆ์ •ํ™”๋ฅผ ์ œ์•ˆํ•œ API์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์—

์˜ณ์€. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ „ํ˜€ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

MaybeUninit ? ( MaybeUninit::frozen() , MaybeUninit::abitrary() ๋˜๋Š” ์œ ์‚ฌ)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ๊นŒ์š”?

์˜ˆ! ๊ธฐ๋ณธ MaybeUninit ๊ฐ€ ์•ˆ์ •๋˜๊ณ  ptr::freeze ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ด๊ฒƒ์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ ์—์„œ "๊ณ ์ • ๋œ"๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€"๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋” ๋งŽ์€ ์—ฐ๊ตฌ์™€ ๋ฒค์น˜๋งˆํ‚น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. LLVM์€ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•  ์ˆ˜์žˆ๋Š” ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋ฉด ๋‹ค๋ฅธ ๋Œ“๊ธ€๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค.)

@Pzixel ์ด ์‚ฌ์ „ ํ• ๋‹น ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. Rust๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ RFC๋ฅผ ํ—ˆ์šฉํ–ˆ์ง€๋งŒ (4 ๋…„ ์ „!) ์ดํ›„ ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌํ˜„์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์œ„์—์„œ ์‚ฌ์šฉํ•œ box ๊ตฌ๋ฌธ ์ œ์™ธ). ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์›ํ•˜๋ฉด ์ œ๊ฑฐ์— ๋Œ€ํ•œ i.rl.o ์Šค๋ ˆ๋“œ ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

@nicoburns๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด MaybeUninit ๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋œ ์ธ์ฒด ๊ณตํ•™์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์˜ ๋นŒ๋”ฉ ๋ธ”๋ก์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋…์„ ์‹คํ—˜ํ•˜๊ณ  ์–ด๋–ค ์ข…๋ฅ˜์˜ API๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑด๋ฌผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” MaybeUninit ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณด์ฆ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

@ Nemo157 ํ•œ๊ณณ ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@jethrogb ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ง€๊ธˆ API๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

2. sys / sgx / rwlock.rs ์—์„œ const fn new() ์˜ ๋น„ํŠธ ํŒจํ„ด์ด C ํ—ค๋” ํŒŒ์ผ์˜ ๋ฐฐ์—ด ์ด๋‹ˆ์…œ ๋ผ์ด์ €์™€ ๋™์ผํ•œ ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์™€, ๊ทธ๊ฑด ๋ฏธ์ณค ๋„ค์š” ^^ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”. ๊ฒฐ๊ตญ ์ธ์ˆ˜๊ฐ€์—†๋Š” const fn ์ด๋ฏ€๋กœ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ...

์ตœ๊ทผ์— ๋‚ด๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ํ•œ ๊ฐ€์ง€๋Š” MaybeUninit<T> ๊ฐ€ T ์™€ ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง€๋„๋ก ๋ณด์žฅ๋˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํž™์˜ ๊ฐ’์„ ๋ถ€๋ถ„์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ ๋‹ค์Œ์ด๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ’

์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋ชฉ๋ก์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

fn into_initialized_box(Box<MaybeUninit<T>>) -> Box<T>

Box ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ "๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ค‘์ธ ์œ ํ˜• (ํŠนํžˆ ์ผ๋ฐ˜ ์ฝ”๋“œ)์— ๋”ฐ๋ผ ptr::write_unaligned ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์ฝ”๋“œ์—์„œ๋Š” ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ์กฐ์ฒด๊ฐ€ ํŒจํ‚น๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ptr::write ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค! ์ž๊พธ ์žŠ์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค ...)

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑ ํ•˜๋ ค๋ฉด ์Šคํƒ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒ์ž๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ API fn uninit_boxed<T>() -> Box<MaybeUninit<T>> ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฒ„๊ทธ ์ด์ง€๋งŒ, ๊ทธ ๋ฒ„๊ทธ๋Š” ๊ณ ์น˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์ƒ๊ฐ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์Šคํƒ ์Šฌ๋กฏ์„ ์ œ๋กœํ™” ํ•œ ๋‹ค์Œ memcpying ๋“ฑ์„ ํ”ผํ•˜๋Š” zeroed_box ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ๋ชจ๋“  ๋ณต์ œ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. : /

๊ทธ๋ž˜์„œ ์ €๋Š” ์ดˆ๊ธฐ ์•ˆ์ •ํ™” ์ดํ›„ / ๋ณ‘๋ ฌ๋กœ ํž™์— ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ (๊ธฐ๋ณธ์ ์œผ๋กœ Box ๋ฐ MaybeUninit ํ˜ผํ•ฉ)์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง„ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ํ•จ๊ป˜ ๋ชจ์—ฌ ์ตœ์†Œ ํฌ๊ธฐ๋ฅผ ๋””์ž์ธ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ API ํ™•์žฅ์ž…๋‹ˆ๋‹ค. @eddyb ๋„ ์ด๊ฒƒ์— ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋” ์ด์ƒ mem::uninitialized ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ์ด (์ด๋ฏธ ๋„ˆ๋ฌด ํฐ) ์ถ”์  ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ž์ฒด ํ† ๋ก  ์žฅ์†Œ๋ฅผ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์˜๊ฒฌ : ์ผ๋ฐ˜์ ์œผ๋กœ MaybeUninit<T> ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํฐ ๋ถˆ๋งŒ์ด ์—†์Šต๋‹ˆ๋‹ค. mem::uninitialized ๋ณด๋‹ค ํ’‹ ๊ฑด์ด ์ ์Šต๋‹ˆ๋‹ค. const new ๋ฐ uninitialized ๋ฉ”์„œ๋“œ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋” ๋งŽ์€ ๋ฐฉ๋ฒ• ์ค‘ ์›ํ•˜๋Š” const๋ฅผํ–ˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋งŽ์€ ์ด๋“ค์˜ ์ดํ•ด๊ฐ€ ํ•„์š” ์ด์ƒ์— ๋งŒ๋“ค์–ด ์งˆ ์ง„ํ–‰ const fn ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ์ „์— ์ผ๋ฐ˜์ ์œผ๋กœ const .

T ๋ฐ MaybeUninit<T> ๋Œ€ํ•ด "๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ"๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์ฆ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ABI์™€ ํ˜ธํ™˜๋˜๊ณ  (ํšจ๊ณผ์ ์œผ๋กœ #[repr(transparent)] ์†์„ฑ์ด ๊ณต์šฉ์ฒด์— ์ ์šฉ๋  ์ˆ˜ ์—†์Œ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ) FFI ์•ˆ์ „ (์ฆ‰, T ์ด FFI ์•ˆ์ „ ์ธ ๊ฒฝ์šฐ) ์ด๋ฉด MaybeUninit<T> ๋„ FFI์— ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค). (์ ‘์„  ์ ์œผ๋กœ, ์–‘์˜ ํฌ๊ธฐ ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ์žˆ๋Š” ๊ณต์šฉ์ฒด์— #[repr(transparent)] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค (๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ))

์ €๋Š” ์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ์—์„œ MaybeUninit<T> ์˜ ABI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹นํ™ฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค). ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€์ด ์„ค๋ช…์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@mjbshaw ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์–‘์˜ ํฌ๊ธฐ์˜ ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ์žˆ๋Š” ๊ณต์šฉ์ฒด์— #[repr(transparent)] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ•ด๋‹น ์†์„ฑ์ด ์กด์žฌํ•˜๋ฉด MaybeUninit ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค์ด์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ๋Š” ์ด๋ฏธ rustc์— ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค ( MaybeUninit<T> ์‚ฌ์‹ค์ƒ์ด์™€ ABI - ํ˜ธํ™˜ T ,ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ RFC๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‚ดํŽด๋ณด๊ณ  repr(transparent) ๊ณต์šฉ์ฒด์— ZST๊ฐ€ ์•„๋‹Œ ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? :๋””

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ RFC๋ฅผ ์ž‘์„ฑํ•˜๊ณ ์ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ณ  repr(transparent) ๊ณต์šฉ์ฒด์— ZST๊ฐ€ ์•„๋‹Œ ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? :๋””

@RalfJung ๋ฌผ์–ด ๋ณด๋ฉด๋ฐ›์„ ๊ฒƒ์ด๋‹ค!

์ฐธ์กฐ https://github.com/rust-lang/rust/pull/58468

์ด๋ ‡๊ฒŒํ•˜๋ฉด maybe_uninit ์—์„œ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์•ˆ์ •ํ™” ํ•  ์ˆ˜์žˆ๋Š” API ๋งŒ ๋‚จ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณ„๋„์˜ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŠธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„์š”, ์ค€๋น„ PR์ด ๋ชจ๋‘ ๋„์ฐฉํ–ˆ๊ณ  into_inner ๋„ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— https://github.com/rust-lang/rfcs/pull/2582 ๋ฅผ ์ˆ˜๋ฝํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•„๋“œ๋ณ„๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ MaybeUninit ์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. FCP๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ƒ์ž๊ฐ€ ๊ฑฐ์˜ ์ค€๋น„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ MaybeUninit ๋ฅผ) ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ๊ฝค ๋ช‡ ๊ตฐ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค take ์ž‘๋™ ๋ฐฉ๋ฒ• &mut self ๋ณด๋‹ค๋Š” self . ํ˜„์žฌ x.as_ptr().read() ์žˆ์ง€๋งŒ x.take() ๋˜๋Š” x.take_initialized() ๊ฐ€ ํ›จ์”ฌ ๋” ๋ช…ํ™• ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@Amanieu ์ด๊ฒƒ์€ ๊ธฐ์กด์˜ into_inner ๋ฐฉ๋ฒ•๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘๋ณต์„ ํ”ผํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๐Ÿ˜‰

๋ฐฉ๋ฒ• take ์˜ Option ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. x.as_ptr().read() x์˜ ๋‚ด๋ถ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  Option::take ๊ฐ’์„ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ qwerty19106 x.as_ptr().read() on a MaybeUninit _semantically_ ๊ฐ’์„ ๊บผ๋‚ด๊ณ  ๋ž˜ํผ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‚จ๊ฒจ์ง„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์€ ๊ฐ€์ ธ์˜จ ๊ฐ’๊ณผ ๋™์ผํ•œ ๋น„ํŠธ ํŒจํ„ด์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. .

ํ˜„์žฌ x.as_ptr().read() ์žˆ์ง€๋งŒ x.take() ๋˜๋Š” x.take_initialized() ๊ฐ€ ํ›จ์”ฌ ๋” ๋ช…ํ™• ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ๊ฐ์— take -like ๋ฉ”์„œ๋“œ๋Š” take ๋ฐ into_initialized ๋‘˜ ๋‹ค์™€ ๋‹ฌ๋ฆฌ ๋‘ ๋ฒˆ๋ฐ›๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์— ๋Œ€ํ•œ Copy ์œ ํ˜• (๋ฐ ๋Œ€ํ•œ ์‚ฌ์‹ค Copy ๊ฐ™์€ ๊ฐ’ None as Option<Box<T>> ), ํ…Œ์ดํฌ ๋ณด๋‚ด๊ณ  ๋‘ ๋ฒˆ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ take ์™€์˜ ๋น„์œ ๋Š” ์ œ ๊ด€์ ์—์„œ ์‹ค์ œ๋กœ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ read_initialized() ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์‹œ์ ์—์„œ ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ as_ptr().read() ๋ณด๋‹ค ๋” ๋ช…ํ™•ํ•œ ์ง€ ์ง„์ง€ํ•˜๊ฒŒ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

x.as_ptr().read() on a MaybeUninit _semantically_ _semantically_ ๋ฒ ์ผ์„ ๊บผ๋‚ด๊ณ  ๋ž˜ํผ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‚จ๊ฒจ์ง„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์€ ๊ฐ€์ ธ์˜จ ๊ฐ’๊ณผ ๋™์ผํ•œ ๋น„ํŠธ ํŒจํ„ด์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

MaybeUninit ์—๋Š” ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ์˜๋ฏธ ๋ถˆ๋ณ€์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ง„์ˆ ์— ์™„์ „ํžˆ ๋™์˜ํ•˜๋Š”์ง€ ํ™•์‹  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. TBH MaybeUninit ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์›์‹œ ์ž‘์—… ํšจ๊ณผ ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@RalfJung ํ , ์•„๋งˆ๋„ "์˜๋ฏธ ์ƒ"์ด ์ž˜๋ชป๋œ ๋‹จ์–ด ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ฐ’์„ ์ฝ์€ ํ›„ ๊ฐ’์ด ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์œ ํ˜•์ด Copy ๋ผ๋Š” ๊ฒƒ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ).

์›์‹œ ์šด์˜ ํšจ๊ณผ ๋งŒ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ์ˆ ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์ง€ ์•Š๊ณ ๋„ ๋‹ค๋ฅธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API์˜ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•  ์ˆ˜์žˆ๋Š” ์ด์™€ ๊ฐ™์€ ์ด์ƒํ•œ ์ƒํ˜ธ ์ž‘์šฉ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” Miri๊ฐ€ ์—ฌ์ „ํžˆ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธธ์ด๊ฐ€ 0 ์ธ ์ฝ๊ธฐ๋ฅผ ์ถ”์ ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค).

@RalfJung ๋‚ด ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ด๊ฒƒ์€ static mut ์— ๊ฐ’์„ ๋„ฃ์€ ๋‹ค์Œ ๋‚˜์ค‘์— ๊บผ๋‚ด๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ ์„ ์†Œ๋น„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— into_uninitialized ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@Amanieu ๋‚ด๊ฐ€ x.take_initialized() ๊ฐ€ x.as_ptr().read() ๋ณด๋‹ค ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

ํ—‰ํ—‰

๋‚˜๋Š” Miri๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธธ์ด๊ฐ€ 0 ์ธ ์ฝ๊ธฐ๋ฅผ ๊ณ„์† ์ถ”์ ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธธ์ด๊ฐ€ 0 ์ธ ์ฝ๊ธฐ๋Š” ๊ฒฐ์ฝ” UB๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Miri๊ฐ€ ์™œ ๊ทธ๊ฒƒ๋“ค์— ๊ด€์‹ฌ์„ ๊ฐ€์งˆ๊นŒ์š”?

์›์‹œ ์šด์˜ ํšจ๊ณผ ๋งŒ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ์ˆ ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์ง€ ์•Š๊ณ ๋„ ๋‹ค๋ฅธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API์˜ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•  ์ˆ˜์žˆ๋Š” ์ด์™€ ๊ฐ™์€ ์ด์ƒํ•œ ์ƒํ˜ธ ์ž‘์šฉ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก , ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์ง€ ์•Š๊ณ ๋„ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๋ฅผ ์œ„ํ•ด 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 ๋ณด๋‹ค ๋” ๋‚˜์€ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๊นŒ?

๊ทธ PR์€ ๋˜ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ์ค‘ ์ผ๋ถ€์— ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

read_initialized ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ทธ ์ž๋ฆฌ์—์žˆ๋Š” ๋™์•ˆ MaybeUninit<T>: Copy ์ด๋ฉด T: Copy MaybeUninit<T>: Copy T: Copy . ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ , get_initialized ๊ฐ€ ๋” ๋‚˜์€ ์ด๋ฆ„์ผ๊นŒ์š”? ๊ฒฐ๊ตญ set ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด set ์ด๋ฆ„์„ write ๋กœ ๋ฐ”๊ฟ”์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์ผ๊ด€์„ฑ์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MaybeUninit ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์Šฌ๋ผ์ด์Šค๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋น„์ธ๊ฐ„์ ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • &mut [T] ๋ฅผ &mut [MaybeUninit<T>] ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด &out ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ &mut [MaybeUninit<T>] ์‚ฌ์šฉํ•˜์—ฌ ์—๋ฎฌ๋ ˆ์ด์…˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด read ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • &mut [MaybeUninit<T>] ์—์„œ &mut [T] ๋กœ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ณ€ํ™˜ (๊ทธ๋ฆฌ๊ณ  &[T] ), ์Šฌ๋ผ์ด์Šค์˜ ๋ชจ๋“  ์š”์†Œ์—์„œ .set ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง„ API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// The returned slice is truncated to the number of elements actually read.
fn read<T>(out: &mut [MaybeUninit<T>]) -> Result<&mut [T]>;

์Šฌ๋ผ์ด์Šค ์ž‘์—…์ด ํ˜„์žฌ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ first_ptr ๋ฐ first_ptr_mut . ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ์ตœ๊ณ ์˜ API์™€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋จผ์ € "ํ•ต์‹ฌ API"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ง‘์ค‘ ํ•œ ๋‹ค์Œ ์Šฌ๋ผ์ด์Šค (๋ฐ Box )์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋ฆ„ ๋ณ€๊ฒฝ์˜ ์ƒ๊ฐ์ฒ˜๋Ÿผ set ์— write , ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ptr::write .

๊ฐ™์€ ๋งฅ๋ฝ์—์„œ read_initialized read ๋ณด๋‹ค ์ •๋ง ๋‚ซ์Šต๋‹ˆ๊นŒ? ์ˆจ๊ฒจ์ง€๋Š” ์šฐ๋ฐœ์  ์ธ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ๋‹ค๋ฉด ์•„๋งˆ๋„ ๋ฉ”์„œ๋“œ ๋Œ€์‹  ํ•จ์ˆ˜๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์˜ˆ : MaybeUninit::read(&mut v) ? write , ์ฆ‰ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด MaybeUninit::write(&mut v) ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์‚ฌ์šฉ ์„ฑ๊ณผ ๋ช…์‹œ ์„ฑ ์‚ฌ์ด์˜ ์ƒ์ถฉ ๊ด€๊ณ„์ด๋ฉฐ, ํ•œ ๊ฒฝ์šฐ์—์„œ ๋ช…์‹œ ์„ฑ์ด ๋” ๋‚˜์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์™œ ๋‹ค๋ฅธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋Ÿฌํ•œ API๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ ์ตœ์†Œํ•œ์˜ API (์˜ˆ : new , uninitialized , zeroed , as_ptr , as_mut_ptr ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ •ํ™”๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค get_ref ๋ฐ get_mut .

get_ref ๋ฐ get_mut ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-rfcs/unsafe-code-guidelines/issues/77 ์„ ํ•ด๊ฒฐ ํ•œ ํ›„์— ๋งŒ โ€‹โ€‹์•ˆ์ •ํ™”๋˜์–ด์•ผํ•˜๋ฉฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

์ตœ์†Œํ•œ์˜ API๋กœ ์•ˆ์ •ํ™”, ์ฆ‰ new , uninitialized , zeroed , as_ptr , as_mut_ptr

๋‚ด ๊ณ„ํš์€ into_initialized , set / write , ๊ทธ๋ฆฌ๊ณ  read_initialized ์ด ์ตœ์†Œ ์„ธํŠธ์˜ ์ผ๋ถ€๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ˆ ๋ ๊นŒ์š”? set / write ๋ฐ read_initialized ๋Š” ๋‚˜๋จธ์ง€๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ œ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜์—์„œ ์•ˆ์ •ํ™”ํ•˜์ง€ ์•Š๋Š”์ชฝ์œผ๋กœ ๊ธฐ์šธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒ˜์Œ๋ถ€ํ„ฐ into_initialized ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค, IMO.

๋ฉ”์„œ๋“œ ๋Œ€์‹  ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ : MaybeUninit::read(&mut v) ? write , ์ฆ‰ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด MaybeUninit::write(&mut v) ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์— ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•œ ๋‚ด์šฉ์—์„œ Deref ์ธ์Šคํ„ด์Šค ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ ์  ํ•จ์ˆ˜ ์ ‘๊ทผ ๋ฐฉ์‹ ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋„์ž…ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

read_initialized read ๋ณด๋‹ค ์ •๋ง ๋‚ซ์Šต๋‹ˆ๊นŒ?

์ข‹์€ ์งˆ๋ฌธ! ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ด๊ฒƒ์€ into_initialized ์™€์˜ ๋Œ€์นญ์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ into_inner ๋Š” ํ˜ธ์ถœ ๋œ ์œ ํ˜•์˜ ๊ฐœ์š”๋ฅผ ์žƒ์„ ์ˆ˜์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด๋ฉฐ read ๋Š” ํ›จ์”ฌ ๋œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด์ฉŒ๋ฉด ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ํ•ด์•ผ initialized ๋Œ€์‹  into_initialized ? ๋„ˆ๋ฌด ๋งŽ์€ ์˜ต์…˜ ...

์ด์ „์— ๋…ผ์˜ ๋œ ๋‚ด์šฉ์—์„œ Deref ์ธ์Šคํ„ด์Šค ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ ์  ํ•จ์ˆ˜ ์ ‘๊ทผ ๋ฐฉ์‹ ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋„์ž…ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ptr::read ๋ฐ ptr::write ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ์„  ์ˆœ์œ„๋Š” ์ด๋ฏธ MaybeUninit::read ๋ฐ MaybeUninit::write ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์ข‹์•„, ๋ถ„๋ช…ํžˆ ๊ฑฐ๊ธฐ์— read ๋ฐ write ๋„ˆ๋ฌด ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์€ ... ๊ฒฐ์ฝ” ์ „์— ... ์‚ฌ๋žŒ๋“ค์„ ๋ฐœ๊ฒฌํ•˜์ง€๋งŒ ๊ทธ๋“ค์€ ์ง„์งœ๋กœ ์ดํ•ด๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ํฌ์ธํ„ฐ, ์†Œ๋น„ MaybeUninit .

๋„ˆ๋ฌด ๋งŽ์€ ์˜ต์…˜ ...

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ž์ „๊ฑฐ ํ˜๋ฆผ์ด์žˆ์„ ๋•Œ๊นŒ์ง€ new , uninitialized , zeroed , as_ptr , as_mut_ptr ์•ˆ์ •ํ™” ํ•  ์ค€๋น„๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ptr::read ๋ฐ ptr::write ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋ฌผ๋ก  ๋…๋ฆฝ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๊ทธ๊ฒƒ๋“ค์€ ์˜ค๋Š˜๋‚ ์—๋„ ๋ฐฉ๋ฒ•์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ํฌ์ธํ„ฐ๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.

์›์‹œ ํฌ์ธํ„ฐ๋Š” Copy ์ด๋ฏ€๋กœ ์‹ค์ œ๋กœ ์†Œ๋น„๋˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์›์‹œ ํฌ์ธํ„ฐ๋Š” Copy ์ด๋ฏ€๋กœ ์‹ค์ œ๋กœ ์†Œ๋น„๋˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์ง€์ ...

์Œ, v.as_ptr().read() ๋Š” ์ด๋ฏธ ๊ฝค ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. as_ptr ๋‹ค์Œ์— read ๊ฐ€ ์˜ค๋ฉด into_initialized ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์‹ ์ค‘ํ•˜๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ ์–ด๋„ ์ง€๊ธˆ์€ as_ptr ๋ฐ as_mut_ptr ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  new , uninitialized ๋ฐ zeroed .

@Amanieu &mut MaybeUninit<[T]> ์™€ &mut [MaybeUninit<T>] ์•ˆ์ „ํ•œ ๋ณ€ํ™˜์ด์žˆ๋Š” Cell ๊ฒฝ์šฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋‹ค์Œ์„ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

fn read<T>(out: &mut MaybeUninit<[T]>) -> Result<&mut [T]> {
    let split = out.as_mut_slice_of_uninit();
    // ... operate on split ...
    return Some(unsafe { split[0..n].as_uninit_mut_slice().get_mut() })
}

๋˜ํ•œ ํ˜ธ์ถœ์ž์—๊ฒŒ ์˜๋ฏธ๋ฅผ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. &mut [MaybeUninit<T>] ์ทจํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๊ฒƒ์ด ๊ดœ์ฐฎ๊ณ  ์–ด๋–ค ๊ฒƒ์ด ๊ทธ๋ ‡์ง€ ์•Š์€์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋ณ„๋˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— &mut MaybeUninit<[T]> ์ทจํ•˜๋ฉด ์ด๋ฏธ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€์— ๊ด€ํ•ด์„œ๋Š” ์…€์„ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

(๋ฌผ๋ก  ๋ฐฉ๋ฒ•์˜ ์ด๋ฆ„์€ ๋ฐ”์ดํฌ ์‰๋”ฉ์˜ ๋Œ€์ƒ์ด๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” Cell ๊ฐ€ํ•˜๋Š” ์ผ์„ ๋ชจ๋ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.)

@eternaleye MaybeUninit<[T]> ์€ (๋Š”) ๊ณต์šฉ์ฒด๊ฐ€ DST๊ฐ€ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•œ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.

์Œ, ๋งž์•„

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ž์ „๊ฑฐ ํ˜๋ฆผ์ด์žˆ์„ ๋•Œ๊นŒ์ง€ new , uninitialized , zeroed , as_ptr , as_mut_ptr ์•ˆ์ •ํ™” ํ•  ์ค€๋น„๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ด๋“  ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์—์ด RFC ๋ฅผ

๋”ฐ๋ผ์„œ ์‹คํ—˜ ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ํ˜„์žฌ set , read_initialized ๋ฐ into_initialized ๋ผ๋Š” ์ด๋ฆ„์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์ž์ „๊ฑฐ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. set -> write .as_ptr().read() ๋Œ€ํ•œ ๊ฐ€์žฅ ์ข‹์€ ์€์œ ๋Š” "get"์ด ์•„๋‹ˆ๋ผ "read"์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ณด์™„ ( .as_ptr_mut().write() )์€ "set"์ด ์•„๋‹ˆ๋ผ "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 ์—„๊ฒฉํ•œ ์ƒ์œ„ ์ธ 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 ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ˜•์‹์— ๋Œ€ํ•œ ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๊ธด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” "Rust API๋Š” ์•ฝ์–ด / ๊ธด ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ์‚ฌ์‹ค ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

์•ฝ์–ด๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ชจํ˜ธ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์–ด๋””์—์„œ๋‚˜ ๊ธด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•˜๋ฃจ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜ผํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ IMO๊ฐ€ ๋‘ ์„ธ๊ณ„ ๋ชจ๋‘์—์„œ ์ตœ์•…์ž…๋‹ˆ๋‹ค. Rust๋Š” ๊ธด ํ˜•์‹๋ณด๋‹ค ์•ฝ์–ด๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์•ฝ์–ด๋กœ Uninit<T> ๋ฅผ, ๋ฉ”์„œ๋“œ์˜ ๋˜ ๋‹ค๋ฅธ ์•ฝ์–ด๋กœ .into_init() ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ณ€ํ™˜์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— into_initialized() ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” take_initialized() ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ take ๋ฉ”์„œ๋“œ์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์˜๋ฏธ ๋ก ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ณ  ์˜๋ฏธ ๋ก ์  ๋ช…ํ™•์„ฑ์ด ์ฐจ์šฉ / ์ด๋™ ์ผ๊ด€์„ฑ์„ ๋Œ€์ฒดํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐจ์ž…์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„์ง์—†๋Š” ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ move_initialized ๋˜๋Š” consume_initialized ์žˆ์Šต๋‹ˆ๋‹ค.

set() ๋Œ€ write() , ๋ณ„์นญ์ด ๋  as_ptr().write() ์™€ ์œ ์‚ฌ์„ฑ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด write() ๋ฅผ ๊ฐ•๋ ฅํžˆ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ take_initialized() ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด์žˆ์„ ๊ฒฝ์šฐ ์ „์ž์˜ ๋ช…์‹œ ์„ฑ์œผ๋กœ ์ธํ•ด read() ๋ณด๋‹ค read_initialized() ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ทธ๋Ÿฌ๋‚˜ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด as_ptr().write() ๋ฐ as_ptr().read() ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ณ  DANGER DANGER ์ •์‹  ํšŒ๋กœ๋ฅผ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@gnzlbg ์šฐ๋ฆฌ๋Š” ์œ ํ˜•์˜ ์ด๋ฆ„์— ๋Œ€ํ•œ FCP๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ํ† ๋ก ์„ ๋‹ค์‹œ ์—ด์–ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ MaybeUninit::uninit() ๋ฐ x.into_init() ์—์„œ์ฒ˜๋Ÿผ "init"๋ฅผ ์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ณ€ํ™˜์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— into_initialized() ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

into ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์œ ํ˜•์—์„œ ๋™์ผํ•œ (์†Œ์œ  ํ•œ) ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š” ๊ฒƒ ์™ธ์— ์‹ค์ œ๋กœ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์–‘ํ•œ into_vec ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‚˜๋Š” take_initialized(&mut self) (into_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) (into_init ์™ธ์—) ๊ดœ์ฐฎ์ง€ ๋งŒ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋‹ค์‹œ undef ๋˜๋Œ๋ ค ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์ „ ์ด๋ฆ„์ด ์ž‘์—…์„ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— into_initialized(self) take_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() ๋Œ€ v.as_ptr().read() ์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€๋งŒ. v.read_init() ์€ (๋Š”) ๋ถˆํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ €๋Š” into_initialized (self) ๋Œ€์‹  take_initialized (self)๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ด๋ฆ„์ด ์ž‘์—…์„ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‚˜๋Š” ํ…Œ์ดํฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ & mut self๋ฅผ ์ทจํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ 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 ์˜ _ ์œ ํšจ ๋ถˆ๋ณ€ _์„ ๋งŒ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” 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 ์˜๋ฏธ์—์„œ "์ดˆ๊ธฐํ™”"๋˜์–ด ๊ทธ ๊ทธ๊ฒƒ์„ ๋งŒ์กฑ _validity์˜ invariant_ T ์•„๋‹Œ ์ ์—์„œ ๊ทธ๊ฒƒ์ด ๋งŒ์กฑ์˜ _safety์˜ invariant_ T , ๊ทธ๋ฆฌ๊ณ  ๊ตฌ๋ณ„์€ ๋ฏธ๋ฌ˜ํ•˜์ง€๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ์ด ๊ตฌ๋ณ„์€ improperly_initialized ๋ฅผ unsafe fn ๋กœ ์„ ์–ธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ "์ดˆ๊ธฐํ™”"๋œ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ MaybeUninit::into_init ์˜ "์œ ํšจํ•˜์ง€๋งŒ MaybeUnsafe"์˜๋ฏธ๋ฅผ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๊ทน๋„๋กœ ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด 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 ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ 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! ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์— ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ํ™•์ธ์„์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” into_init๊ฐ€ ์ฃผ์žฅํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๊ทธ ๊ฐ’์ด T์˜ ํƒ€๋‹น์„ฑ ๋ถˆ๋ณ€์„ ๋งŒ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž„์„ ๋‹ค์‹œ ์–ธ๊ธ‰ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ์—์„œ T๊ฐ€ "์ดˆ๊ธฐํ™”"๋˜๋Š” ๊ฒƒ๊ณผ ํ˜ผ๋™ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. OTOH, ์ฒซ ๋ฒˆ์งธ ์„ค๋ช…์—์„œ "์ดˆ๊ธฐํ™”"๊ฐ€ ์ด์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์€ fn improperly_uninitialized ()-> AlwaysTrue๋ฅผ ์•ˆ์ „ํ•œ fn์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ AlwaysTrue๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋“ค์ด "์ดˆ๊ธฐํ™”"ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ ์ ˆํ•˜๊ฒŒ "์ดˆ๊ธฐํ™”"๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์ง€์ ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ๋‘ ๊ฐ€์ง€ ๋ถˆ๋ณ€์„ฑ์ด ์–ด๋”˜๊ฐ€์—์„œ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ข‹์€ ๊ณณ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์˜ ์ง๊ฐ์€ improperly_uninitialized ๊ฐ€ ๊ดœ์ฐฎ์ง€ ์•Š๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ผ ๊ธฐ๋Šฅ. "๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ถˆ๋ณ€์„ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ"์€ "๋‚ด๊ฐ€ ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“  ์•ˆ์ „ํ•œ ๊ธฐ๋Šฅ์€ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๊ฐ€ ๊ทธ๋“ค์„ ํŒŒ๊ดดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋กํ•ด์•ผํ•œ๋‹ค"๋Š” ์ƒ๊ฐ์„ ํ•  ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

Invalid๋กœ๋„ ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€์•ˆ์ „ํ•˜์ง€ ์•Š์ŒValidityCheckeable :: is_valid (Invalid) ๋‘ ๊ฐ€์ง€ ํŠน์„ฑ ์ธ ValidityCheckeable ๋ฐ UnsafeCheckeable์ด ์žˆ์œผ๋ฉฐ ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋ฐ UnsafeCheckeable :: is_safe (Unsafe), Invalid :: into_valid ๋ฐ Unsafe :: into_safe ๋ฉ”์„œ๋“œ assert_validity! ๊ทธ๋ฆฌ๊ณ  assert_safety! ๊ทธ๋“ค์—.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํƒ€๋‹น์„ฑ ๋ถˆ๋ณ€๋„ ์ฐธ์กฐ์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์Œ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋ฌผ์„ ์–ด๋–ป๊ฒŒ ๊ณ ๋ ค ํ•˜๋Š๋ƒ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.)

์•ˆ๋…•ํ•˜์„ธ์š”.

์ด๋™ ..., ์†Œ๋น„ ..., ๋ณ€ํ™˜ ... ๋“ฑ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์ด๋ฆ„์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” into_init (ialized)๊ฐ€ ๋„ˆ๋ฌด ํ˜ผ๋ž€ ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค; ๋‚˜๋„, ๊ทธ๊ฒƒ์€ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋‹ค๊ณ  ์•”์‹œ ์ ์œผ๋กœ ์ฃผ์žฅ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

move_init ๋Š” into_init ๋ณด๋‹ค "์–ด์„ค ์…˜"์„ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ?

assert_init(italized) ์ด (๊ฐ€) ์ด์ „์— ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ read ๋˜๋Š” read_initialized ๋˜๋Š” as_ptr().read ๋„ ์‹ค์ œ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด ๋ง๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ทน๋„๋กœ ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด Invalid<T> ๋ฐ Unsafe<T> , Invalid<T>::into_valid() -> Unsafe<T> , ์‚ฌ์šฉ์ž๊ฐ€ uninit.into_valid().into_safe() ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ„์˜ improperly_initialized ๋ฐ˜ํ™˜ Unsafe<T> ์‚ฌ์šฉ์ž๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ฐ’ ์„ค์ •ํ•˜๊ณ , ํ›„์— ๋งŒ AlwaysTrue ์— true ์‹ค์ œ๋กœ ์•ˆ์ „ T๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

@gnzlbg ์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฝค uninit.into_valid().into_safe() ์€ uninit.assume_initialized() ๋˜๋Š” ๊ทธ ๋ฐ–์˜ ๊ฒƒ๋“ค์— ๋น„ํ•ด ์žฅํ™ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๊ตฌ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ๋ชจ๋ธ์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜…์ด ๋ชจ๋ธ์„ ์ข€ ๋” ์กฐ์‚ฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

assert_init(italized) ์ด (๊ฐ€) ์ด์ „์— ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@RalfJung ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ์ด assume_initialized @eternaleye์— (๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š”) ๋•Œ๋ฌธ์—. ๊ฝค ์„ค๋“๋ ฅ์žˆ๋Š” ๊ทผ๊ฑฐ ๋ชฉ๋ก์€ https://github.com/rust-lang/rust/issues/53491#issuecomment -440730699๋ฅผ ์ฐธ์กฐ

TBH ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์žฅํ™ฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@RalfJung ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”? ์•„๋งˆ๋„ ๋†’์€ ์ˆ˜์ค€์˜ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์Œ ... ๋” ์ž์„ธํ•œ API๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋‹ค๋ฉด

uninit.into_inner(uninit.assert_initialized());

์˜๋ฏธ ์ƒ ๊ฝค ์ž˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ๋Š” ์–ด์„ค ์…˜์„ ๊ธฐ๋กํ•˜๋Š” ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์œ ํšจํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ƒํ™”๊ฐ€ ์‚ฌ๋žŒ๋“ค์„ ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์–ด ์‹ค์ˆ˜๋ฅผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ถ”๊ฐ€ ๋…ธ๋ ฅ์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ @eternaleye (๋‚ด ์ƒ๊ฐ์—)๋กœ ์ธํ•ด assume_initialized๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ์„ค๋“๋ ฅ์žˆ๋Š” ๊ทผ๊ฑฐ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ # 53491 (์ฃผ์„)์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ณต์ •ํ•œ. assume_initialized ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด assume_init ์ผ๊นŒ์š”? ์ด๋Š” ์ƒ์„ฑ์ž, MaybeUninit::uninit() vs MaybeUninit::uninitialized() ์™€ ์ผ์น˜ ํ•ด์•ผํ•˜๋ฉฐ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜๋กœ ์•ˆ์ •ํ™” ๋  ์˜ˆ์ •์ด๋ฏ€๋กœ ๊ณง ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@nicoburns ์—ฌ๊ธฐ์— ํ† ํฐ์„ ํ†ตํ•ด ๊ฐ„์ ‘ ์ถ”๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์–ป์„ ์ˆ˜์žˆ๋Š” ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๋†’์€ ์ˆ˜์ค€์˜ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์Œ, "๋‹จ์ง€" MaybeUninit ๋ณด๋‹ค ๋” ์žฅํ™ฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? ์ถ”๊ฐ€์ ์ธ ์ •์‹ ์  ๋ถ€๋‹ด (๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ์ดํ•ดํ•ด์•ผ ํ•จ)์ด ๋งŽ๊ณ  ์ด์ค‘ ํ’€๋ฆผ์ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉํ•  ์œ ํ˜•์„ ์„ ํƒํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ์ •๋‹นํ™”ํ•ด์•ผ ํ•  ์ถ”๊ฐ€ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ œ๋กœ Unsafe ์˜ ์œ ์šฉ์„ฑ์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ NOP ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ Vec ๊ตฌํ˜„์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•  ๋•Œ๋งˆ๋‹ค Unsafe<Vec<T>> ๋ณ€ํ™˜ํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ต์œก์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ, ์œ ํšจํ•˜์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ Vec<T> ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์— ๋ถ€์—ฌํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ํญ๋ฐœ ํ•  ๋•Œ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€์ ์—์„œ ํ•„์š”๋กœํ•˜๋Š” MaybeUninit ์™€ ๋Œ€์กฐํ•˜๊ณ , ์ž์‹ ์˜ ๊ฐœ์ธ ์ฝ”๋“œ์—์„œ "๋‚˜์œ" bool ์— ๋Œ€ํ•ด์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋†€๋ผ ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

์ƒ๋‹นํ•œ ๋น„์šฉ์„ ๊ฐ์•ˆํ•  ๋•Œ Unsafe ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ๋™๊ธฐ ๋ถ€์—ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

MaybeUninit ์„ MaybeInvalid ๋กœ ๋ฐ”๊พธ๋Š” ์ธ์ˆ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ "์œ ํšจํ•˜์ง€ ์•Š์Œ"์€ ๋งค์šฐ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค ( ๋ฌด์—‡ ์— Vec "๊ฐ€ ์œ ํšจํ•˜๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ. "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ"์€ ์ตœ์†Œํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์—ฐ๊ด€์„ฑ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. "์œ ํšจ ๋ถˆ๋ณ€"์˜ ์ด๋ฆ„์„ "์ดˆ๊ธฐํ™” ๋ถˆ๋ณ€"์œผ๋กœ ๋ฐ”๊ฟ”์•ผํ• ๊นŒ์š”?

๋˜ํ•œ, Unsafe<T> ์กด์žฌ๋งŒ์œผ๋กœ๋„์ด ๋ž˜ํผ ์™ธ๋ถ€์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•๋ ฅํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๊ทœ์น™์„ ์ฑ„ํƒํ•˜์ง€ ์•Š๋Š” ํ•œ (๊ทธ ์•ˆ์— ๋ž˜ํ•‘ ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฐ’์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ž˜๋ชป ์•”์‹œํ•˜์—ฌ) ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ RFC์™€ ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ•ฉ์˜๊ฐ€ ํ•„์š”ํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹ค์†Œ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ( @RalfJung ์€ ์œ„์—์„œ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ์ด์œ ๋ฅผ ์ œ์‹œํ–ˆ๋‹ค), UB๊ฐ€ ๊ด€๋ จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— MaybeUninit ๋ณด๋‹ค ๋” ์•ฝํ•œ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ์Šคํƒ€์ผ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ RFC๊ฐ€ ์Šน์ธ๋˜๊ณ  ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ฌธ์„œ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋”๋ผ๋„ ๊ทธ๋Ÿฌํ•œ ๊ทœ์น™์ด Rust ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋ณดํŽธ์  ์ผ์ง€์— ๋Œ€ํ•ด์„œ๋Š” ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ IMO์—์„œ ๊ทธ ๋Œ€ํšŒ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์€ MaybeUninit API๋ฅผ ์ž์ „๊ฑฐ๋ฅผ ํƒ€๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฐ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํŠ€๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ณผ์ •์˜ ํ•ด๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด ์•ˆ์ •ํ™”๋ฅผ ๋” ์ง€์—ฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. MaybeUninit<T> -> T ๋ณ€ํ™˜์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด ํ–ฅํ›„ Rust ์„ธ๋Œ€๋Š” ์ฒ˜์Œ์— ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด MaybeUninit<Unsafe<T>> ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐํ™” ๋œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์•„๋‹ˆ๋ฉด assume_init ์ผ๊นŒ์š”? ์ƒ์„ฑ์ž์™€ ์ผ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. MaybeUninit::uninit() vs MaybeUninit::uninitialized() -๊ทธ๋ฆฌ๊ณ  _that_ one์€ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜๋กœ ์•ˆ์ •ํ™” ๋  ์˜ˆ์ •์ด๋ฏ€๋กœ ๊ณง ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•, ์ƒ์„ฑ์ž ๋ฐ -> T ํ•จ์ˆ˜์™€ 3 ๋ฐฉํ–ฅ ์ผ๊ด€์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์— -ialized ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ::uninit() ๋ฐ .assume_init() ์ด (๊ฐ€) ์•„๋งˆ๋„ ๊ฐˆ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Œ, "๋‹จ์ง€" MaybeUninit ๋ณด๋‹ค ๋” ์žฅํ™ฉํ•œ ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ?

๋‹ฌ๋ ค ... ์ œ ์ƒ๊ฐ์—๋Š” foo.assume_init().assume_safe() (๋˜๋Š” foo.init().safe() ํ•˜๋‚˜ ๊ฐ„๋‹จํ•œ ๋ ํ•˜๋Š” ๊ฒฝํ–ฅ ๊ฒฝ์šฐ) ๋ชจ๋“  ์ด์ƒ์ด๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์กฐํ•ฉ์„ foo.assume_init_safe() ๋กœ ์ œ๊ณต ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์กฐํ•ฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‘ ๊ฐ€์ง€ ๊ฐ€์ •์„ ์„ค๋ช…ํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์ •์‹ ์  ๋ถ€๋‹ด (๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ์ดํ•ดํ•ด์•ผ ํ•จ)์ด ๋งŽ๊ณ  ์ด์ค‘ ํ’€๋ฆผ์ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉํ•  ์œ ํ˜•์„ ์„ ํƒํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์— ์ •๋‹นํ™”ํ•ด์•ผ ํ•  ์ถ”๊ฐ€ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€๋‹น์„ฑ๊ณผ ์•ˆ์ „์„ฑ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•ด์•ผ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์ •์‹ ์ ์œผ๋กœ ๋” ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…์ด tho๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ Unsafe ์˜ ์œ ์šฉ์„ฑ์„ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ NOP ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ ๋ถˆ๋ณ€์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํ•œ; ๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ POV์—์„œ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ณ„์˜ ์œ ์šฉ์„ฑ์€ ์ผ์ข…์˜ "์„ธ์…˜ ์œ ํ˜•"์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์ƒ๋‹นํ•œ ๋น„์šฉ์„ ๊ฐ์•ˆํ•  ๋•Œ Unsafe ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ œ ๋ˆˆ์„ ์‚ฌ๋กœ ์žก์€ ๋ถ€๋ถ„์€ ๊ฐ€๋ฅด์น˜๋Š” ๋Šฅ๋ ฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด .assume_init() ์ด "OK; ์œ ํšจ์„ฑ ๋ถˆ๋ณ€์„ฑ์„ ํ™•์ธํ–ˆ๊ณ  ์ด์ œ ์ข‹์€ T "๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. MaybeUninit<T> ์˜ ํ˜„์žฌ ์ฒด๊ณ„๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” Unsafe<T> ๋ฐ Invalid<T> ์ด๋ฆ„๊ณผ ๊ฒฐํ˜ผํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์— ๊ด€๊ณ„์—†์ด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ต์œก์ ์œผ๋กœ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ˜„์žฌ ํ”„๋ ˆ์ž„ ์›Œํฌ ๋‚ด์—์„œ์ด๋ฅผ ๋ณด์™„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

MaybeUninit ์„ MaybeInvalid ๋กœ ๋ฐ”๊พธ๋Š” ์ธ์ˆ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค _. ๊ทธ๋Ÿฌ๋‚˜ "์œ ํšจํ•˜์ง€ ์•Š์Œ"์€ ๋งค์šฐ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค (_what_?์— ์œ ํšจํ•˜์ง€ ์•Š์Œ). ์‚ฌ๋žŒ๋“ค์ด "์œ ํšจ ํ•จ"๊ณผ "์•ˆ์ „ํ•จ"์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. "์œ ํšจํ•œ Vec "๊ฐ€ ์œ ํšจํ•˜๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ. "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ"์€ ์ตœ์†Œํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์—ฐ๊ด€์„ฑ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. "์œ ํšจ ๋ถˆ๋ณ€"์˜ ์ด๋ฆ„์„ "์ดˆ๊ธฐํ™” ๋ถˆ๋ณ€"์œผ๋กœ ๋ฐ”๊ฟ”์•ผํ• ๊นŒ์š”?

๋‚˜๋Š” "์œ ํšจ์„ฑ"๊ณผ "์•ˆ์ „์„ฑ"์ด "์œ ํšจ"ํ•˜๊ฒŒ ๋“ค๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ํ˜ผ๋™๋˜๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” "์œ ํšจ์„ฑ"์„ ๋Œ€์ฒดํ•˜๋Š” "๊ธฐ๊ณ„ ๋ถˆ๋ณ€"๊ณผ "์•ˆ์ „"์„์œ„ํ•œ "์œ ํ˜• ์‹œ์Šคํ…œ ๋ถˆ๋ณ€"์— ๋ถ€๋ถ„์ ์ด์—ˆ๋‹ค.

๋ฟก๋ฟก

๊ทธ๋ž˜์„œ IMO๋Š” ๊ทธ ๋Œ€ํšŒ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„๋ณด๊ณ ์žํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด MaybeUninit API๋ฅผ ์ž์ „๊ฑฐ๋ฅผ ํƒ€๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฐ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํŠ€๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ณผ์ •์˜ ํ•ด๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด ์•ˆ์ •ํ™”๋ฅผ ๋” ์ง€์—ฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. MaybeUninit<T> -> T ๋ณ€ํ™˜์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด ๋ฏธ๋ž˜์˜ Rust ์„ธ๋Œ€๋Š” ์ฒ˜์Œ์— ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด MaybeUninit<Unsafe<T>> ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐํ™” ๋œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์‹œ ์ข‹์€ ์ . MaybeUninit<Unsafe<T>> ; ์œ ํ˜• ์ด๋ฆ„์„ ๋œ ์žฅํ™ฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์œ ํ˜• ๋ณ„์นญ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•, ์ƒ์„ฑ์ž ๋ฐ-> T ํ•จ์ˆ˜์™€ 3 ๋ฐฉํ–ฅ ์ผ๊ด€์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์— -ialized ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์—†์œผ๋ฏ€๋กœ :: uninit () ๋ฐ .assume_init ()๊ฐ€ ์•„๋งˆ๋„ ๊ฐˆ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. into ์ ‘๋‘์‚ฌ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฐ ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์Šฌํ”„์ง€๋งŒ ๊ทธ๊ฒƒ์„ ์œ ์ง€ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด read / read_init ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ptr::read ์™€์˜ ์œ ์‚ฌ์„ฑ์ด "์‹ค์ œ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค"๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ? ์•Š์Šต๋‹ˆ๋‹ค read_init ์— ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ into_init ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋Œ€์‹  ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ๊ฐ™์€ ์†Œ๋ฆฌ, ๊ทธ ๊ฐ€์ •์œผ๋กœ? assume_init ์ด read ) ์ง€๊ธˆ ๊ฐ™์•„์•ผํ•ฉ๋‹ˆ๊นŒ?

ํƒ€๋‹น์„ฑ๊ณผ ์•ˆ์ „์„ฑ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•ด์•ผ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์ •์‹ ์ ์œผ๋กœ ๋” ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…์ด tho๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Vec ์˜ ๋ถˆ๋ณ€์ด ์œ„๋ฐ˜๋˜์—ˆ์„ ๋•Œ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ Vec ์—์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ์ผ์ด ๋งค์šฐ ์žฅํ™ฉํ•˜๊ณ  ์™„์ „ํžˆ ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ „๋‹ฌํ•˜๋Š” ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด .assume_init ()๊ฐ€ "OK; ๋‚˜๋Š” ๋ถˆ๋ณ€์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ–ˆ๊ณ  ์ด์ œ ์ข‹์€ T๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค"๋Š” ์˜๋ฏธ๋ผ๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์‹ค์ˆ˜๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ " 0xFF ๊ฐ€๋“ ์ฐจ์„œ์ด Vec<i32> ๋ฅผ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ‘ธ์‹œ ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค." ๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์‚ฌ๋žŒ๋“ค์ด ์ €์ง€๋ฅด๋Š” ์‹ค์ˆ˜๋ผ๋Š” ํ‘œ์‹œ, ๋” ํ™•์‹คํ•œ ๋ฐ์ดํ„ฐ๋ฅผ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚ด ๊ฒฝํ—˜์ƒ ์‚ฌ๋žŒ๋“ค์€ ์•Œ ์ˆ˜์—†๋Š” ์ฝ”๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์—…์„ ํ˜ธ์ถœ ํ•  ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์•ผํ•œ๋‹ค๋Š” ๋งค์šฐ ํ™•์‹คํ•œ ์ง๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ƒํ™ฉ์ด ์กฐ๊ธˆ ์ง„์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๊ณ„ํš์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

  • MaybeUninit::uninitialized ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก PR์„ ์ค€๋น„ํ•˜๊ณ  ์ด๋ฆ„์„ MaybeUninit::uninit ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ์ผ๋‹จ ๊ทธ๊ฒƒ์ด ๋„์ฐฉํ•˜๋ฉด (stdsimd๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์ด ๊ฐˆ ๊ธธ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์—ฌ๊ธฐ์— ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค) MaybeUninit::{new, uninit, zeroed, as_ptr, as_mut_ptr} ์•ˆ์ •ํ™”๋ฅผ์œ„ํ•œ PR์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด set / write , into_init[ialized] / assume_init[ialized] ๋ฐ read[_init[italized]] ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” assume_init , write ๋ฐ read ์˜์ง€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด์ „์— ์ด์— ๋Œ€ํ•ด ๋งˆ์Œ์„ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ €๋Š” ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

  • ์ผ๋‹จ ์ฐฉ๋ฅ™ํ•˜๋ฉด

์ด๋Š” (a) ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ  ๋˜๋Š” (b) ๋ถˆ์•ˆ์ •ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ƒ์„ฑ ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ง€์† ๊ฐ€๋Šฅํ•œ ๊ด€ํ–‰์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐ ํ•  ๊ณ„ํš์ด์—†๋Š” ํ•ญ๋ชฉ์„ ํ๊ธฐ ํ•  ๋•Œ๋Š” ํ๊ธฐ ๊ฒฝ๊ณ ๊ฐ€ ์ถ”๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์•ˆ์ •์ ์ธ ๊ต์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‚ถ์„ ๊ณ„์†ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์„์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” (a) ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ  ๋˜๋Š” (b) ๋ถˆ์•ˆ์ •ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ƒ์„ฑ ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ถˆ์•ˆ์ •ํ•œ ๋ฐฉ๋ฒ•์„ ๋น„๋‚œํ•˜๊ณ  ๋Œ€์‹  ๋‹ค๋ฅธ ๋ถˆ์•ˆ์ •ํ•œ ๋ฐฉ๋ฒ•์„ ๋„์ž… ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ mem::uninitialized ์•„๋‹ˆ๋ผ MaybeUninit::uninitialized ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.

๋ถˆํ–‰ํžˆ๋„ ์ €๋Š” ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@RalfJung ๋‹ค๋ฅธ ์ด๋ฆ„ ๋ณ€๊ฒฝ PR๊ณผ ํ•จ๊ป˜ ์ด์ „์—ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ (๊ทธ๋ฆฌ๊ณ  ์›ํ•˜๋Š” ๊ฒฝ์šฐ r? ์ €๋ฅผ) ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒฝ์šฐ FCP์—์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. :)

๋‹ค๋ฅธ ์ด๋ฆ„ ๋ณ€๊ฒฝ PR์— ๋Œ€ํ•ด ์ด์ „์—ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ (๊ทธ๋ฆฌ๊ณ  ์›ํ•˜๋Š” ๊ฒฝ์šฐ r? me) ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒฝ์šฐ FCP์—์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. :)

๊ธ€์Ž„, ๋‚˜๋Š” ์ด๊ฒƒ๋“ค์ด ์ดˆ๊ธฐ ์•ˆ์ •ํ™”์˜ ์ผ๋ถ€๊ฐ€ ๋  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆ์•ˆ์ •ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ๊ธฐํ•˜๊ณ  ๋Œ€์‹  ๋‹ค๋ฅธ ๋ถˆ์•ˆ์ •ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋„์ž…ํ•˜์‹ญ์‹œ์˜ค.

์•„, ์žก์•˜๋‹ค. ๊ทธ๋Ÿผ ๊ณ„์†ํ•ด.

์ข‹์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/pull/59284 ์—์„œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ-> ์ดˆ๊ธฐํ™” ํ•ด์ œ
into_initialized-> ๊ฐ€์ • _ ์ดˆ๊ธฐํ™”
read_initialized-> ์ฝ๊ธฐ
์„ค์ •-> ์“ฐ๊ธฐ

์ƒˆ๋กœ ์ œ์•ˆ ๋œ ์ด๋ฆ„์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. read ์ด ์˜ค์šฉ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๊ฑฑ์ •๋˜์ง€๋งŒ, ์ฃผ๋กœ ptr::read ์™€์˜ ์—ฐ๊ด€์„ฑ ๋•Œ๋ฌธ์— into_initialized ๊ฐ€ ์˜ค์šฉ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์ด๋ฆ„์€ ์•ˆ์ •ํ™”๋ฅผ ์œ„ํ•ด ์™„์ „ํžˆ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

MaybeUninit :: {new, uninit, zeroed, as_ptr, as_mut_ptr}๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด 1.35- ๋ฒ ํƒ€ (์•ฝ 2 ์ฃผ ํ›„)๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” https://github.com/rust-lang/rfcs/pull/2582๊ฐ€ ์—ฌ์ „ํžˆ ์–ผ๋งˆ๋‚˜ ๊ณต์ค‘์— ์žˆ๋Š”์ง€๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์„ ๋ฐ€์–ด๋‚ด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. : / RFC ์—†์ด๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ ์ง„์ ์ธ ์ดˆ๊ธฐํ™”๋Š” ์—ฌ์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
OTOH, MaybeUninit ์€ (๋Š”) ์ถฉ๋ถ„ํžˆ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ ์ž‘์„ฑํ•˜๋Š” ์ ์ง„์  ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ MaybeUninit ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, https://github.com/rust-lang/rust/pull/59284 ๋Š” ์•„์ง ์ฐฉ๋ฅ™ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ 1.35๋กœ ์„œ๋‘˜๋Ÿฌ์•ผํ•ฉ๋‹ˆ๋‹ค. TBH ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ• ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ๋†€๋ฉด์„œ ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋Š๋ผ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ ์–ด๋„ ํ•œ ๋ฒˆ์˜์ฃผ๊ธฐ๋ฅผ ๋” ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

MaybeInit ์˜ ๊ตฌ์„ฑ ํ•จ์ˆ˜๊ฐ€ const ์žˆ์Šต๋‹ˆ๊นŒ?

init ๋ฐ new ๋Š” const ์ž…๋‹ˆ๋‹ค. zeroed ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. const ๋˜๊ธฐ ์ „์— const ํ•จ์ˆ˜๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

MaybeUninit ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ https://github.com/Thomasdezeeuw/mio-st/pull/71 ์—์„œ . ์ „๋ฐ˜์ ์œผ๋กœ API์— ๋Œ€ํ•œ ๋‚˜์˜ (์ œํ•œ๋œ) ๊ฒฝํ—˜์€ ๊ธ์ •์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฐœ๊ฒฌํ•˜๋Š” ์œ ์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋Š” ๋Œ์•„ ์˜ค๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค &mut T ์—์„œ MaybeUninit::set ์žˆ๋Š”์— ๋ฆฌ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ let _ = ... (https://github.com/Thomasdezeeuw/mio-st/pull/๋ฅผ 71 / files # diff-1b9651542d08c6eca04e6025b1c6fd53R116) ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•˜์ง€๋งŒ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž์ฃผ C์™€ ํ•จ๊ป˜ ํ†ตํ•ฉ ๋ฐฐ์—ด๋กœ ์ž‘์—… ํ•  ๋•Œ ์›ํ•˜๋Š” API๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  1. &mut [MaybeUninit<T>] ์—์„œ &mut [T] ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์Šฌ๋ผ์ด์Šค์˜ ๋ชจ๋“  ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. uninitialized_array ์™€ ๊ฐ™์€ ๊ณต๊ฐœ ๋ฐฐ์—ด ์ด๋‹ˆ์…œ ๋ผ์ด์ € ํ•จ์ˆ˜ ๋˜๋Š” ๋งคํฌ๋กœ๋„ ์ •๋ง ์ข‹์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

MaybeUninit์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

MaybeUninit :: set์—์„œ & mut T๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด let _ = ...

์™œ ๊ทธ๋Ÿด๊นŒ์š”? ๋ฐ˜ํ™˜ ๊ฐ’์„ "๋ฒ„๋ฆด"์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฌธ์„œ ์˜ ์˜ˆ์ œ๋Š” let _ = ... ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ( write / set ์—๋Š” ์•„์ง ์˜ˆ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” read ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋งํฌ ๋งŒ ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค.)

foo.write(bar); ๋Š” let ์—†์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผํ™” ๋ฐฐ์—ด ์ž‘์—…

๋„ค, ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ๋ฏธ๋ž˜์˜ ๊ด€์‹ฌ ๋ถ„์•ผ์ž…๋‹ˆ๋‹ค.

๋ฟก๋ฟก

MaybeUninit :: set์—์„œ & mut T๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด let _ = ...

์™œ ๊ทธ๋Ÿด๊นŒ์š”? ๋ฐ˜ํ™˜ ๊ฐ’์„ "๋ฒ„๋ฆด"์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฌธ์„œ ์˜ ์˜ˆ์ œ๋Š” let _ = ... ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ( write / set ์—๋Š” ์•„์ง ์˜ˆ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” read ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋งํฌ ๋งŒ ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค.)

unused_results ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ํ™œ์„ฑํ™” ํ–ˆ์œผ๋ฏ€๋กœ let _ = ... ์—†์ด๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹˜์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„, ๊ทธ ๊ฒฝ๊ณ ์— ๋Œ€ํ•ด ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ ๋กญ๊ตฐ.

์ด๋Š” write ๊ฐ€ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋กํ•˜๋Š” ์ธ์ˆ˜ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋” ๋งŽ์€ ์ˆ˜์š”๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

uninitialized_array ์™€ ๊ฐ™์€ ๊ณต๊ฐœ ๋ฐฐ์—ด ์ด๋‹ˆ์…œ ๋ผ์ด์ € ํ•จ์ˆ˜ ๋˜๋Š” ๋งคํฌ๋กœ๋„ ์ •๋ง ์ข‹์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ [MaybeUninit::uninit(); EVENTS_CAP] ์ž…๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/49147์„ ์ฐธ์กฐ

๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹˜์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” write ๊ฐ€ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋กํ•˜๋Š” ์ธ์ˆ˜ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋” ๋งŽ์€ ์ˆ˜์š”๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ‹ˆ์ƒˆ ์‹œ์žฅ ๊ฐ™๋‚˜์š”? ์•ž์œผ๋กœ ๋” ๋งŽ์€ ์ˆ˜์š”๊ฐ€์žˆ์„ ๊ฒฝ์šฐ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹ˆ์ƒˆ ์‹œ์žฅ ๊ฐ™๋‚˜์š”?

์˜ˆ, ๊ฐ’์„ ์„ค์ • ํ•œ ๋‹ค์Œ ์ด์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆ˜๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@Centril Heh, ๋‹ค๋ฅธ ๊ณณ์—์„œ์ด ๊ธ€์„ ์ผ์„ ๋•Œ ์—ฌ๊ธฐ์—์„œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ณด์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/issues/54542#issuecomment -478261027

https://github.com/rust-lang/rust/pull/59912 ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์ „ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค

๊ทธ ํ›„ ๋‹ค์Œ์œผ๋กœ ํ•  ์ผ์€ ์•ˆ์ •ํ™”๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ... : tada :

๋‚˜๋Š” Rust-lang / rfcs # 2582๊ฐ€ ์—ฌ์ „ํžˆ ๊ณต๊ธฐ์—์„œ ์–ผ๋งˆ๋‚˜ ์ „์ ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ์ง€ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์„ ๋ฐ€์–ด ๋ถ™์ด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. : / RFC ์—†์ด๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ ์ง„์ ์ธ ์ดˆ๊ธฐํ™”๋Š” ์—ฌ์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
OTOH, MaybeUninit ์€ (๋Š”) ์ถฉ๋ถ„ํžˆ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ˜„์žฌ ์ž‘์„ฑํ•˜๋Š” ์ ์ง„์  ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ MaybeUninit ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ํ›„ ๋‹ค์Œ์œผ๋กœ ํ•  ์ผ์€ ์•ˆ์ •ํ™”๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š” ... ๐ŸŽ‰

@RalfJung ์—ฌ๊ธฐ ๋ฌธ์„œ์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋” ๋‚˜์€ ์ˆ˜๋ฉด์— ๋„์›€์ด๋˜๋Š” ๋ช…ํ™•ํ•œ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "์‚ฌ๋žŒ๋“ค์€ ์–ด์จŒ๋“  ํ•  ๊ฒƒ"์„ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ... :)

MaybeUninit , ํŠนํžˆ assume_init ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋ณด๋ฉด "์•ˆ์ „"์„น์…˜์—์„œ mu.assume_init() ํ˜ธ์ถœ ํ•œ ๋‹ค์Œ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ fn ์—์„œ ์•ˆ์ „ ๋ถˆ๋ณ€๋„ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  MaybeUninit ์‚ฌ์šฉํ•  ๋•Œ๋„ ์œ ์ง€๋˜์–ด์•ผํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๊ณต ์•ˆ์ „ ๋ถˆ๋ณ€์˜ ์Šค ๋‹ˆํŽซ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋ฌธ์„œ์˜ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋” ๋‚˜์€ ์ˆ˜๋ฉด์— ๋„์›€์ด๋˜๋Š” ๋ช…ํ™•ํ•œ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "์‚ฌ๋žŒ๋“ค์€ ์–ด์จŒ๋“  ํ•  ๊ฒƒ"์„ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ... :)

ํ˜„์žฌ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ์˜ ์ ์ง„์  ์ดˆ๊ธฐํ™”์— ๋Œ€ํ•œ ์„น์…˜์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ฝ๋Š” ์‚ฌ๋žŒ๋“ค์€ "WTF, ์ •๋ง๋กœ?"์™€ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TBH ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค์†Œ ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. :( ์ง€๊ธˆ ์ฏค์ด๋ฉด ๊ทธ์— ๋Œ€ํ•œ ์กฐ์–ธ์„ ๋‚ด๋†“๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์–ด์„œ ์Šฌํ”„๋‹ค.

"์•ˆ์ „"์„น์…˜์—์„œ๋Š” mu.assume_init ()๋ฅผ ํ˜ธ์ถœ ํ•œ ๋‹ค์Œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์•ˆ์ „ํ•œ fn์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ์ „ ๋ถˆ๋ณ€๋„ ์œ ์ง€ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  MaybeUninit๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์œ ์ง€๋˜์–ด์•ผํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๊ณต ์•ˆ์ „ ๋ถˆ๋ณ€์˜ ์Šค ๋‹ˆํŽซ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ถˆ๋ณ€์˜ ์ „์ฒด ๊ฐœ๋…๊ณผ Rust์—์„œ ์–ด๋–ป๊ฒŒ ์ „๊ฐœ๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๋กœ ๋ฐ”๊พธ๋ผ๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” MaybeUninit ์ด ์ž˜๋ชป๋œ ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” MaybeUninit ์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ Nomicon๊ณผ ๊ฐ™์€ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์žฅ์†Œ์—์„œ ์„ค๋ช…๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์˜ ํ•ต์‹ฌ ๋ฌธ์ œ์— MaybeUninit ๋ฌธ์„œ๋ฅผ ์ง‘์ค‘ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์ž์œ ๋กญ๊ฒŒ ํ™•์žฅํ•˜์‹ญ์‹œ์˜ค. :)

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋ถˆ๋ณ€์˜ ์ „์ฒด ๊ฐœ๋…๊ณผ Rust์—์„œ ์–ด๋–ป๊ฒŒ ์ „๊ฐœ๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๋กœ ๋ฐ”๊พธ๋ผ๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค ... ์ €๋Š” MaybeUninit<T> ์˜ ๋ฌธ์„œ์˜ ์ „๋žต์  ์œ„์น˜์—์„œ "์˜ค, __ ๊ทธ๋Ÿฐ๋ฐ __, ์•ˆ์ „ ๋ถˆ๋ณ€ ๋ฌธ์ œ๋„ MaybeUninit<T> ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ์™€ ์ธํ„ฐํŽ˜์ด์Šค ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”, ์ €๋Š”์ด ๋ชจ๋“  ๊ฒƒ์„ ์•ˆ์ •ํ™” PR์— ํ†ตํ•ฉํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/pull/60445

๋‚œ ๊ทธ๋ƒฅ์˜ ์‚ฌ์šฉ ์šฐ์—ฐํžˆ mem::uninitialized ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์„œ์—, ์ •๋ง ์–ด๋”” ๋‹ค๋ฅธ ๊ฒƒ์„ ์ฐธ๊ณ  ๋ชฐ๋ž๋‹ค ์˜ ๋งˆ์ง€๋ง‰ ์˜ˆ๋ฅผ ๋“ค์–ด core::ptr::drop_in_place ์š”๊ตฌ ์•„์ด๋Ÿฌ๋‹ˆ์˜ ์ข…๋ฅ˜๋„ (์—…๋ฐ์ดํŠธ ํ•  https://github.com/rust-lang/rfcs/pull/2582์— ์˜ํ•ด์„œ๋งŒ ์Šน์ธ๋˜๋Š” ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ UB๋ฅผ ๋ณด์—ฌ ์ฃผ๋ฏ€๋กœ ๊ฐœ์ธ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค).

@HeroicKatora ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ https://github.com/rust-lang/rust/pull/60445์— ํ†ตํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ref-to-unaligned-field์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ฌธ์„œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” PartialUninit (๋˜๋Š” PartialInit ) ํŠน์„ฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ : MODULEENTRY32W .
์ฒซ ๋ฒˆ์งธ ํ•„๋“œ ( dwSize )๋Š” ๊ตฌ์กฐ ํฌ๊ธฐ ( size_of::<MODULEENTRY32W>() )๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

pub trait PartialUninit: Sized {
    fn uninit() -> MaybeUninit<Self>;
}

impl<T> PartialUninit for T {
    default fn uninit() -> MaybeUninit<Self> {
        MaybeUninit::uninit()
    }
}

impl PartialUninit for MODULEENTRY32W {
    unsafe fn uninit() -> MaybeUninit<MODULEENTRY32W> {
        let uninit = MaybeUninit { uninit: () };
        uninit.get_mut().dwSize = size_of::<MODULEENTRY32W>();
        uninit
    }
}

๋‹น์‹ ์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

@kgv ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์ œ์•ˆ ๋œ ์†”๋ฃจ์…˜์˜ ๋” ์™„์ „ํ•œ ์˜ˆ์ผ๊นŒ์š”?

@scottjmaddox ๊ณ ์ • . ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๊นŒ?

@kgv ์ด๊ฒƒ์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ (์ด์— ๋Œ€ํ•œ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๊ณผ ๋ฐ˜๋Œ€๋กœ)? ์™œ libstd๊ฐ€ ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์ผ์„ํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด์˜ ํ• ๋‹น ๊ธฐ๋ฐ˜ ๋ถ€๋ถ„ ์ดˆ๊ธฐํ™”๋Š” ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด uninit.get_mut().foo = bar ๋Š” UB ์ธ foo ๋–จ์–ด ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

@RalfJung ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ self ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( Self ์—๋งŒ ์˜์กดํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์˜์กดํ•˜์ง€ ์•Š์Œ (์ƒ์ˆ˜)), ์˜ˆ๋ฅผ ๋“ค์–ด-ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๋Š” Self ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.

@kgv ์—ฌ๊ธฐ์„œ @RalfJung ๊ณผ ๋™์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋„์šฐ๋ฏธ ๋ชจ๋“ˆ์ด๋‚˜ ์ƒ์ž์—์„œ ๋” ์ž˜ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ •ํ™” PR์€ ๋ฒ ํƒ€์‹œ๊ธฐ์— ๋งž์ถฐ ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. :) ๋…ธ์กฐ์™€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ธฐ์–ต์— ๊ด€ํ•œ ์ƒํ™ฉ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ง€ ์•ฝ 8 ๊ฐœ์›”์ด ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด 6 ์ฃผ ์•ˆ์— ๋ฐฐ์†ก ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์–ผ๋งˆ๋‚˜ ์—ฌํ–‰! ๋„์›€์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. :๋””

๋ฌผ๋ก  ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•ด์•ผ ํ•  https://github.com/rust-lang/rfcs/pull/2582 ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. libstd๋Š” ์—ฌ์ „ํžˆ ์ด์‹์ด ํ•„์š”ํ•œ mem::uninitialized (๋Œ€๋ถ€๋ถ„ ํ”Œ๋žซํผ ๋ณ„ ์ฝ”๋“œ)๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์•ˆ์ •์ ์ธ API๋Š” ๋งค์šฐ ๋ฏธ๋ฏธํ•ฉ๋‹ˆ๋‹ค. read ๋ฐ write ๋ฌด์—‡์„ํ•ด์•ผํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผํ•˜๋ฉฐ read ๋ฐฐ์—ด ๋ฐ ์ƒ์ž ์ž‘์—…์„ ๋•๋Š” API๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค MaybeUninit ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ „์ฒด ์ƒํƒœ๊ณ„๋ฅผ mem::uninitialized ์—์„œ ์ฒœ์ฒœํžˆ ์ด๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ดํ•ด์•ผ โ€‹โ€‹ํ•  ์ผ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ฑฐ๊ธฐ์— ๋„๋‹ฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์˜€์Šต๋‹ˆ๋‹ค. :)

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” MaybeUninit ๋ฐฐ์—ด๊ณผ ์ƒ์ž ์ž‘์—…์„ ๋•๋Š” API๋ฅผ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ๋๊นŒ์ง€; ์ด์ œ https://github.com/rust-lang/rust/issues/49147์—์„œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ๊ฐ€

๋˜ํ•œ ๋‚˜๋จธ์ง€ ๋น„ํŠธ์— ๋Œ€ํ•ด ๋” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์„ ํ˜ธํ•˜์—ฌ์ด ์ถ”์  ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋‹ซ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰๊นŒ์ง€; ์ง€๊ธˆ์ด # 49147 ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ์ผ๊นŒ์š”? = P

๋ฐฉ๊ธˆ ์ž์› ํ–ˆ์Šต๋‹ˆ๊นŒ? ;) (๋‚˜๋Š” ๊ทธ๋Ÿด ์‹œ๊ฐ„์ด ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

๋‚˜๋จธ์ง€ ๋น„ํŠธ์— ๋Œ€ํ•ด ๋” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์„ ํ˜ธํ•˜์—ฌ์ด ์ถ”์  ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋‹ซ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ž์› ํ–ˆ์Šต๋‹ˆ๊นŒ? ;) (๋‚˜๋Š” ๊ทธ๋Ÿด ์‹œ๊ฐ„์ด ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

๋‚ด๊ฐ€ ํ•œ ์ผ ... = D-์ด๋ฏธ ์ž‘์—…์ค‘์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ด€์‹ฌ์„ ๊ฐ€์งˆ๊นŒ์š”? (์žˆ๋Š” ๊ฒฝ์šฐ ์ถ”์  ๋ฌธ์ œ๋กœ ์ด๋™)

ํ”„๋กœ์„ธ์Šค ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋‚˜ ์ผ๊ฑฐ์•ผ ...;) ์กฐ๋งŒ๊ฐ„ ์ชผ๊ฐœ์„œ ๋‹ซ์•„ ๋ณด๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@RalfJung let x: bool = mem::uninitialized(); ๊ฐ€ UB๋ผ๋Š” ๊ท€ํ•˜์˜ ์ง„์ˆ ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์™œ ์ž˜๋ชป๋œ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„์ฃผ ๋˜๋Š”๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋“ฏ์ด UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ๊ด€์ฐฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ์ฝ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ์ง€ ์•Š์œผ๋ฉด ์–ด๋–กํ•˜์ฃ ?

๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๋‚˜์œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์™œ ๋…น์ด ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”์ง€ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ๊ด€์ฐฐํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋Ÿฐ ํ•ด๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์˜ค๋ฅ˜๋ฅผ์œ„ํ•œ ๊ฒƒ์ผ๊นŒ ์š” ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์ผ๊นŒ ์š”?

์ด๋Ÿฌํ•œ ๊ฐ€์ •์— ์˜์กด ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์‹ค์ œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด, x ๊ฐ€ ์œ ํšจํ•œ ๋ถ€์šธ์ž„์„ LLVM์— ์•Œ๋ฆฌ๋Š” foo(x: bool) ์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ์ฃผ์„์„ ๋‹ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•จ์ˆ˜๊ฐ€ ์›๋ž˜ x ๋ณด์ง€ ์•Š์•˜๋”๋ผ๋„ true ๋˜๋Š” false ์ด ์•„๋‹Œ bool ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด UB๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋•Œ๋•Œ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์ „์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์„ ๋„์ž…ํ•˜๋ ค๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค (ํŠนํžˆ ๋ฃจํ”„๊ฐ€ ํ•œ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์„ ๋ฃจํ”„ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค).

AFAIK ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ํ•จ์ˆ˜ ๊ฒฝ๊ณ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ด๋Ÿฌํ•œ ์ฃผ์„ ์ค‘ ์ผ๋ถ€๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์„ค์ •ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ์ •๋ณด๊ฐ€ ์œ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๋” ๋งŽ์€ ์žฅ์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ณ€์ˆ˜ ์‚ฌ์šฉ"์ด๋ผ๋Š” ์˜๋ฆฌํ•œ ์ •์˜ (์ •์˜ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•œ ์šฉ์–ด์ด๋ฉฐ ์‹ค์ œ๋กœ ์ •์˜ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์Œ)๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ UB์— ๊ด€ํ•ด์„œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋„ ์ฝ”๋“œ์˜ ์œ ํ˜•์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ฑฐ์ง“๋ง์„ํ•˜๋Š” ์ž„์‹œ "yolo"์ ‘๊ทผ ๋ฐฉ์‹ ๋Œ€์‹  ์ „์šฉ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ( "๋‚˜๋Š” ์ด๊ฒƒ์ด bool ๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ,ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ").

์˜ˆ๋ฅผ ๋“ค์–ด, LLVM์— x๊ฐ€ ์œ ํšจํ•œ ๋ถ€์šธ์ž„์„ ์•Œ๋ฆฌ๋Š” foo (x : bool)๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๊ฐ€ ์›๋ž˜ x๋ฅผ ๋ณด์ง€ ์•Š์•˜๋”๋ผ๋„ true ๋˜๋Š” false๊ฐ€ ์•„๋‹Œ bool์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด UB๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋•Œ๋•Œ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์ „์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์„ ๋„์ž…ํ•˜๋ ค๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค (ํŠนํžˆ ๋ฃจํ”„๊ฐ€ ํ•œ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์„ ๋ฃจํ”„ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค).

์ด๊ฒƒ์€ ์‚ฌ์šฉ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌป๊ณ  ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ ๋ฎ์–ด ์“ฐ๊ธฐ ์ „์— ์•„๋ฌด๋ฐ๋„ ์ฝ๊ฑฐ๋‚˜ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฏธ๋ฌ˜ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์—†์ง€๋งŒ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์š”์ปจ๋Œ€, ๋‚ด ์งˆ๋ฌธ์€์ด ์ฝ”๋“œ๊ฐ€ UB์ธ์ง€ (๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด), ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ฃผ์ œ ์ž์ฒด์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ : ํž™์— ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜์žˆ๋Š” box ๊ตฌ๋ฌธ์ด ์žˆ์œผ๋ฉฐ ๋•Œ๋กœ๋Š” stackalloc ๋ฉ”๋ชจ๋ฆฌ ์ธ Box::new() ์™€๋Š” ๋‹ฌ๋ฆฌ ํ•ญ์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ box MaybeUninit::new() ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์ฑ„์šฐ๋ฉด ์–ด๋–ป๊ฒŒ Box<MaybeUninit<T>> ๋ฅผ Box<T> ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๋ณ€ํ™˜์ด๋‚˜ ๋ฌด์—‡์„ ์จ์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๋ฌธ์„œ์—์„œ์ด ์ ์„ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Pzixel ์šฐ๋ฆฌ๋Š” ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฏธ Box ์™€ MaybeUninit ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Centril ์€

๋„ค, ๊ทธ ํ† ๋ก ์€ ๊ธฐ์–ตํ•˜์ง€๋งŒ ํŠน์ • API๋Š” ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๊ณ  ์‹ถ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋Ÿฐ API๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์–ธ์–ด ์ง„ํ™”์˜์ด ์‹œ์ ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› ์—†์ด๋Š” ๊ตฌํ˜„ ๋  ์ˆ˜์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ–ˆ๊ณ  ์–ด๋–ค ์ˆ˜์ค€์˜ ์ค‘์ฒฉ์—์„œ๋„ ์ž‘๋™ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Vec<Result<Option<MaybeUninit<u8>>>> ์žˆ์–ด์•ผํ•œ๋‹ค into_inner ๋ฐ˜ํ™˜ ๋ฐฉ๋ฒ•์„ Vec<Result<Option<u8>>>

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

์—ฌ๊ธฐ ๋ฐ˜ํ™˜์ด ์šฉ๋„์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งค์šฐ ๋ฏธ๋ฌ˜ ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ค˜์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋Œ€๋‹ต์€ ๋ชจ๋“  ํ• ๋‹น (MIR๋กœ ๋‚ด๋ฆฐ ํ›„์˜ ๋ชจ๋“  ํ• ๋‹น์—์„œ์™€ ๊ฐ™์ด ์‹ค์ œ๋กœ ๋ชจ๋“  ์‚ฌ๋ณธ)์ด ์‚ฌ์šฉ์ด๊ณ , ์—ฌ๊ธฐ์—๋Š” let x: bool = mem::uninitialized() ์˜ ํ• ๋‹น์ด ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


get_ref์™€ get_mut์ด ๋™์‹œ์— ์•ˆ์ •ํ™” ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค (๋ชจ๋“  ๊ธฐ๋Šฅ์ด์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด). ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ํ›Œ๋ฅญํ•˜๊ณ  ๊ทธ๋“ค์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค๋Š” ์œ ์ผํ•œ ํ‘œ์‹œ์ž…๋‹ˆ๋‹ค (๋ถ„๋ช…ํžˆ ์‚ฌ์‹ค์ด์–ด์•ผ ํ•จ).

์ด๊ฒƒ์€ https://github.com/rust-lang/unsafe-code-guidelines/issues/77 ํ•ด๊ฒฐ์‹œ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค : ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” &mut bool ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๋‹ต์€ "์˜ˆ"๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ rust-lang / unsafe-code-guidelines # 77 ํ•ด๊ฒฐ์‹œ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฐจ๋‹จ์ด ์ผ์–ด๋‚  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ  "๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด UB์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ๊ดœ์ฐฎ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ํ›„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜์ค‘์— ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ

์ฆ‰, ํ–ฅํ›„ ๋ฒ„์ „์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ (API ํ˜ธํ™˜ ๊ฐ€๋Šฅ!) ์ด์ „ ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ์ด์ œ UB๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@Gankro

๋‚˜๋Š” ์ฐจ๋‹จ์ด ์ผ์–ด๋‚  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ  "๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด UB์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ๊ดœ์ฐฎ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ํ›„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ํ’‹๊ฑด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์™œ &mut *foo.as_mut_ptr() ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ๊ฒƒ์ด ์ดˆ๊ธฐํ™”๋˜๋ฉด ์™œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? IOW, ๋‚˜๋Š” ์ง€๊ธˆ ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ ์ผํ•œ ํ‘œ์‹œ

๊ทธ๊ฒƒ์ดํ•˜์ง€ ์•Š์„ ์ด์œ  ๋•Œ๋ฌธ์—? ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•œ ํ›„ ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ผผ๊ผผํžˆ ๋‚˜์—ดํ•˜๋ฉด ๊ธด ๋ชฉ๋ก์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ^^

๋ฟก๋ฟก

์ฆ‰, ํ–ฅํ›„ ๋ฒ„์ „์˜ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ (API ํ˜ธํ™˜ ๊ฐ€๋Šฅ!) ์ด์ „ ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ์ด์ œ UB๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์‚ฌ๋žŒ๋“ค์ด &mut *foo.as_mut_ptr() ํ•œ๋‹ค๋ฉด ์˜ค๋Š˜๋‚ ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ”ผํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ UB๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ๋ณด์ฆ์„ํ•˜๊ธฐ ์ „์— ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋˜์—ˆ๋‹ค๋ฉด UB๊ฐ€

๋งž์•„์š”, ์ €๋Š” ๊ทธ ๊ณผ์ •์ด

  • ์—„๊ฒฉํ•˜์ง€๋งŒ ๊ตฌํ˜„์˜ ์˜๋ฏธ๊ฐ€์—†๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์•ˆ์ •ํ™”ํ•˜์‹ญ์‹œ์˜ค.
  • ๊ธฐ์–ต ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ๋ฌด์—‡์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋ชจ๋ธ์ด ์™„์„ฑ๋˜๋ฉด

    • UB๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ฉ‹์ง€๊ณ , ๋ฌธ์„œ๋Š” ๊ทธ๋Œ€๋กœ๋‘๊ณ , ์œ ์šฉํ•˜๋‹ค๋ฉด ์ตœ์ ํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

    • UB ์ผ ํ•„์š”๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์„œ์—์„œ ์‚ญ์ œํ•˜๊ณ  ํ•˜๋ฃจ์— ์ „ํ™”ํ•˜์„ธ์š”.

๋ฟก๋ฟก

์—ฌ๊ธฐ ๋ฐ˜ํ™˜์ด ์šฉ๋„์ž…๋‹ˆ๊นŒ?

์˜ˆ, ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด ๊ณณ์— ๋‚˜ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋งค์šฐ ๋ฏธ๋ฌ˜ ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋Œ€๋‹ต์€ ๋ชจ๋“  ํ• ๋‹น (MIR๋กœ ๋‚ด๋ฆฐ ํ›„์˜ ๋ชจ๋“  ํ• ๋‹น๊ณผ ๊ฐ™์ด ์‹ค์ œ๋กœ ๋ชจ๋“  ์‚ฌ๋ณธ)์ด ์šฉ๋„์ด๋ฉฐ let x : bool = mem :: uninitialized ()์˜ ํ• ๋‹น์„ ํฌํ•จํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ํšจํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๊ทธ๊ฒƒ์€ ์ค‘์žฌ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค MaybeUninit ์ค‘์ฒฉ? ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ๋ž˜ํผ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ€ํ™˜์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Pzixel ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ https://github.com/rust-lang/rust/issues/61011 ์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

์—ฌ์ „ํžˆ ๋ถˆ์•ˆ์ •ํ•œ MaybeUninit::write() ๋ฉ”์„œ๋“œ๊ฐ€ unsafe ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” T ์—์„œ drop ํ˜ธ์ถœ์„ ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

forget ๋Š” unsafe ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rust์˜ ์•ˆ์ „ ๋ณด์žฅ์—๋Š” ์†Œ๋ฉธ์ž๊ฐ€ ํ•ญ์ƒ ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ https://github.com/rust-lang-nursery/nomicon/issues/135 ๋„ ์ฐธ์กฐ

MaybeUninit MaybeUninit<T> -> NonNull<T> ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? AFAICT MaybeUninit::as_mut_ptr() -> *mut T ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œ ํฌ์ธํ„ฐ๋Š” null์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ์—์„œ NonNull<T> ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” API์™€ ์ธํ„ฐํŽ˜์ด์Šคํ•ด์•ผํ•˜๋Š” ์ดํƒˆ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์—:

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

MaybeUninit :: as_mut_ptr ()-> * mut T์— ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œ ํฌ์ธํ„ฐ๋Š” ์ ˆ๋Œ€ null์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ (๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” @Gankro ๊ฐ€ ์ด๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์„ NonNull ๋Š” "ํœด์‹ ์ƒํƒœ์—์„œ"์ƒ๋‹นํžˆ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์–ป๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ NonNull ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ญ๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผํ• ๊นŒ์š”? ์šฐ์„ ๊ถŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/rust-lang/rust/issues/47336์— ๋Œ€ํ•œ ์„ ๋ก€๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋ฆ„์ด ์ข‹์ง€ ์•Š์•„์ด ๋ฐฉ๋ฒ•์„ ์•ˆ์ •ํ™” ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/60445#issuecomment -488818677์— ์–ธ๊ธ‰ ๋œ ๋ถ„ํ™”๊ตฌ ์‹คํ–‰์ด ๋ฐœ์ƒ ํ–ˆ์Šต๋‹ˆ๊นŒ?

@centril์ด ์–ธ๊ธ‰ ํ•œ 3 ๊ฐœ์›”์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋Š” ๋ฒ ํƒ€, ์•ˆ์ • ๋ฐ ์•ผ๊ฐ„์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์‹คํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1.36.0์€ 1 ์ฃผ์ผ ์ „์— ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ ์•ผ๊ฐ„์—๋Š” ์ด๋ฏธ ๊ฒฝ๊ณ ๋ฅผ ๋‚ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ง€์› ์ค‘๋‹จ์ด 1.40.0์œผ๋กœ ์—ฐ๊ธฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๊ฐ€์ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ƒ์ž์— ํ•ญ์ƒ ๊ณ ๋ฆฝ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๋ ˆ์ดํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ std::mem::uninitialized ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งคํฌ๋กœ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์‚ฌ ํฌ๋ ˆ์ดํŠธ์˜ ์‚ฌ์šฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋ฐค ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ปดํŒŒ์ผํ–ˆ์„ ๋•Œ ์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์— uninitialized ๋Œ€ํ•œ ๋‹จ์ผ ์–ธ๊ธ‰์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ glium์˜ implement_vertex ๋งคํฌ๋กœ๋ฅผ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

glium master์—์„œ 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) MaybeUninit ์ „์ฒด๋ฅผ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ val: &mut MaybeUninit<T> ๋ฐ new_val: T ๋˜๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ’์„ ์›ํ•œ๋‹ค๋ฉด std::mem::replace .

@ est31 ์ด๊ฒƒ๋“ค์€ ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. ํ•œ๋‘ ๋ฒˆ์˜ ์ถœ์‹œ๋กœ ์ง€์› ์ค‘๋‹จ์„ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

1.36.0 ๋ฆด๋ฆฌ์Šค ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

MaybeUninit๋กœRust 1.38๋ถ€ํ„ฐ ๋” ์•ˆ์ „ํ•œ ๋Œ€์•ˆ์ด๋ฉฐ mem :: uninitialized ํ•จ์ˆ˜๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ์ข‹์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ํ˜ผ๋ž€ ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ”Œ๋ฆฝ ํ”Œ ๋กœํผ๋ฅผ ํ”ผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๋‚ ์งœ๋„ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ์–ธ๊ธ‰๋˜์—ˆ์œผ๋ฏ€๋กœ ๋„๋ฆฌ ์•Œ๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

uninitialized ์˜ ์ง€์› ์ค‘๋‹จ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ๋Šฆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ต์ฒด๊ฐ€ ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ Stable ์ฑ„๋„์—์žˆ๋Š” ์ดํ›„ Nightly์—์„œ๋งŒ ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ •์ฑ…์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์˜ˆ๋ฅผ ๋“ค์–ด, Firefox ๋Š” ์ถœ์‹œ 2 ์ฃผ ํ›„ ์ƒˆ๋กœ์šด Rust ๋ฒ„์ „์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์—์„œ ํƒ€ํ˜‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

1.36.0 ๋ฆด๋ฆฌ์Šค ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ์—์„œ ๋‚ ์งœ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ๊ทธ๋ ‡๊ฒŒ ์ฒ ๋‘์ฒ ๋ฏธ ํ•œ ์ •๋„๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ €์žฅ์†Œ์— ์žˆ์œผ๋ฉฐ ํŽธ์ง‘์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ์ข‹์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ํ˜ผ๋ž€ ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ”Œ๋ฆฝ ํ”Œ ๋กœํผ๋ฅผ ํ”ผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"ํ”Œ๋ฆฝ ํ”Œ๋กœ ํผ๋ฆฌ"๋Š” ๋‚˜์œ ์ผ์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งˆ์Œ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ œ ๊ฒฐ์ •์— ๋Œ€ํ•ด ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ด๋‚˜ ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ณธ ์‚ฌ๋žŒ๋“ค์€ ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€ ๋ฆด๋ฆฌ์Šค์— ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

"ํ”Œ๋ฆฝ ํ”Œ๋กœ ํผ๋ฆฌ"๋Š” ๋‚˜์œ ์ผ์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งˆ์Œ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. "์ด๋ด, ์šฐ๋ฆฌ์˜ ์ง€์› ์ค‘๋‹จ ์ผ์ •์ด ๋„ˆ๋ฌด ๊ณต๊ฒฉ์  ์ด์—ˆ์–ด, ์šฐ๋ฆฌ๋Š” ๋ฆด๋ฆฌ์Šค๋กœ ๋ฌผ๊ฑด์„ ๋‹ค์‹œ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค."๋ผ๋Š” ๋‚˜์œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.
์‚ฌ์‹ค IIRC๋Š” ์•ˆ์ •ํ™” PR์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ 2 ๊ฐœ๊ฐ€ ์•„๋‹Œ ํ–ฅํ›„ 3 ๊ฐœ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ง€์› ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ 2 ๊ฐœ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 3 ๊ฐœ ๋ฆด๋ฆฌ์Šค๋Š” stable-gets-released-with-the -deprecation-announcement ๋ฐ deprecated-on-nightly, ๊ทธ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์•ผ๊ฐ„ ์ถ”์ ์„ ์œ„ํ•ด ๊ณต์ •ํ•œ ์‹œ๊ฐ„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. 6์ฃผ๋Š” ์˜์˜จ ์ด์ฃ ? ;)

๋”ฐ๋ผ์„œ ๋‚ด์ผ ์‚ฌ์šฉ ์ค‘๋‹จ ๋ฒ„์ „์„ 1.39.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” PR์„ ์ œ์ถœํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ œ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด์ผ ์‚ฌ์šฉ ์ค‘๋‹จ ๋ฒ„์ „์„ 1.39.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” PR์„ ์ œ์ถœํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ œ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 1.39์— ๋™์˜ํ•˜์ง€๋งŒ ๊ทธ๋ณด๋‹ค ๋Šฆ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์™ธ์—๋„ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ๋œ ์ง€์› ์ค‘๋‹จ ์ผ์ •์— ๋Œ€ํ•œ PR ์ œ์ถœ : https://github.com/rust-lang/rust/pull/62599.

๋ฟก ๋นต๋€จ

๋‚˜๋จธ์ง€ ๋ฐฉ๋ฒ•์˜ ์•ˆ์ •ํ™”๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ๋‚˜๋จธ์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? * foo.as_mut_ptr ()์„ ํ†ตํ•ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ง€๋ฃจํ•˜๊ณ  ๋•Œ๋กœ๋Š” (์“ฐ๊ธฐ๋ฅผ ์œ„ํ•ด) ํ•„์š” ์ด์ƒ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

as_ref / as_mut ๊ฒฝ์šฐ, ์ฐธ์กฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์•ผํ•˜๋Š”์ง€ ์•Œ ๋•Œ๊นŒ์ง€ ์†”์งํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ๋„ˆ๋ฌด ์˜ˆ๋น„ ์ ์ž…๋‹ˆ๋‹ค.

read / write ๊ฒฝ์šฐ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋ฆ„๊ณผ ์„œ๋ช…์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๋ฉด ์•ˆ์ •ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ManuallyDrop::take/read ์™€ ํ•จ๊ป˜ ์กฐ์ •๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์•„๋งˆ๋„ ManuallyDrop::write ๋„ ์žˆ์–ด์•ผํ• ๊นŒ์š”?

์†”์งํžˆ ์ฐธ์กฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์•ผํ•˜๋Š”์ง€ ์•Œ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ง€์นจ WG์™€ ์–ธ์–ด ํŒ€์ด์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋ช‡ ์ฃผ, ๋ช‡ ๋‹ฌ ๋˜๋Š” ๋ช‡ ๋…„ ํ›„์— ๋” ๋งŽ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ทธ ๋™์•ˆ as_mut ์ด ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๊ณ ํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผํ•ด์•ผ ํ•  ๋•Œ &mut *manually_drop.as_mut_ptr() ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ๋ง‰์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ง€์นจ WG์™€ ์–ธ์–ด ํŒ€์ด์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋ช‡ ์ฃผ, ๋ช‡ ๋‹ฌ ๋˜๋Š” ๋ช‡ ๋…„ ํ›„์— ๋” ๋งŽ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?

๋ช‡ ๋‹ฌ, ์–ด์ฉŒ๋ฉด ๋ช‡ ๋…„.

๊ทธ ๋™์•ˆ as_mut์ด ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๊ณ ํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ & mut * manually_drop.as_mut_ptr () ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ์•Œ์•„์š”. ํฌ๋ง์€ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€๋Šฅํ•œ ํ•œ &mut ๋ถ€๋ถ„์„ โ€‹โ€‹์ง€์—ฐ์‹œํ‚ค๊ณ  ์›์‹œ ํฌ์ธํ„ฐ๋กœ ์ž‘์—…ํ•˜๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  https://github.com/rust-lang/rfcs/pull/2582 ์—†์ด๋Š” ์ข…์ข… ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

MaybeUninit์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์ ์–ด๋„ ์ด๊ฒƒ์ด ์–ธ์–ด์˜ ์˜๋ฏธ๋ก ์—์„œ ๋ชจํ˜ธํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์ˆ˜์ ์œผ๋กœ ๊ทธ๊ฒƒ์ด ์ข‹์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋…ผ์˜ํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณด์ˆ˜์  ์ธ ๊ฐ€์ •์—์„œ๋„ as_mut ๋Š” ๊ฐ’์ด ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” ๋œ ํ›„์— ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์„ ๋ณด์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ MaybeUninit<[MaybeUninit<Foo>; N]> ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ผ uninit() ํ˜ธ์ถœ๋กœ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ƒ๊ฐ [expr; N] ๋ฌธ์ž๊ฐ€ ํ•„์š” Copy ๋‚ด๋ถ€ ๋ž˜ํผ์˜ ํŽธ์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ณด์ˆ˜์  ์ธ ๊ฐ€์ •์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด?) slice::IterMut ๋ฐฐ์—ด์„ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ๋‹ค์Œ Foo ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ์•„๋งˆ๋„ uninit_array! ์ด ๋” ๋‚˜์€ ์ด๋ฆ„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Stargateur ๋ฌผ๋ก , ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ํ˜„์žฌ ์ด๋ฆ„์œผ๋กœ ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/49147์ด ๊ณง ๋ฐœ์ƒํ•˜๋ฉด (TM) ์•ˆ์ •ํ™”๋˜์ง€ ์•Š๊ธฐ๋ฅผ

@RalfJung Ugh , ๊ทธ๊ฒŒ ๋‚ด ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ํฐ ์ด์œ ์—†์ด PR์„ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/pull/61749#issuecomment -512867703

@eddyb ์ด๊ฒƒ์€ libcore์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ liballoc์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋“  ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ด๋„ ์ปดํŒŒ์ผ์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/commit/4c2c7e0cc9b2b589fe2bab44173acc2170b20c09๋ฅผ ์ฐธ์กฐ

Building stage1 std artifacts (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
   Compiling alloc v0.0.0 (/home/r/src/rust/rustc.2/src/liballoc)
error[E0277]: the trait bound `core::mem::MaybeUninit<K>: core::marker::Copy` is not satisfied
   --> <::core::macros::uninit_array macros>:1:32
    |
1   |   ($ t : ty ; $ size : expr) => ([MaybeUninit :: < $ t > :: uninit () ; $ size])
    |   -                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `core::marker::Copy` is not implemented for `core::mem::MaybeUninit<K>`
    |  _|
    | |
2   | | ;
    | |_- in this expansion of `uninit_array!`
    | 
   ::: src/liballoc/collections/btree/node.rs:109:19
    |
109 |               keys: uninit_array![_; CAPACITY],
    |                     -------------------------- in this macro invocation
    |
    = help: consider adding a `where core::mem::MaybeUninit<K>: core::marker::Copy` bound
    = note: the `Copy` trait is required because the repeated element will be copied

error[E0277]: the trait bound `core::mem::MaybeUninit<V>: core::marker::Copy` is not satisfied
   --> <::core::macros::uninit_array macros>:1:32
    |
1   |   ($ t : ty ; $ size : expr) => ([MaybeUninit :: < $ t > :: uninit () ; $ size])
    |   -                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `core::marker::Copy` is not implemented for `core::mem::MaybeUninit<V>`
    |  _|
    | |
2   | | ;
    | |_- in this expansion of `uninit_array!`
    | 
   ::: src/liballoc/collections/btree/node.rs:110:19
    |
110 |               vals: uninit_array![_; CAPACITY],
    |                     -------------------------- in this macro invocation
    |
    = help: consider adding a `where core::mem::MaybeUninit<V>: core::marker::Copy` bound
    = note: the `Copy` trait is required because the repeated element will be copied

error[E0277]: the trait bound `core::mem::MaybeUninit<collections::btree::node::BoxedNode<K, V>>: core::marker::Copy` is not satisfied
   --> <::core::macros::uninit_array macros>:1:32
    |
1   |   ($ t : ty ; $ size : expr) => ([MaybeUninit :: < $ t > :: uninit () ; $ size])
    |   -                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `core::marker::Copy` is not implemented for `core::mem::MaybeUninit<collections::btree::node::BoxedNode<K, V>>`
    |  _|
    | |
2   | | ;
    | |_- in this expansion of `uninit_array!`
    | 
   ::: src/liballoc/collections/btree/node.rs:162:20
    |
162 |               edges: uninit_array![_; 2*B],
    |                      --------------------- in this macro invocation
    |
    = help: the following implementations were found:
              <core::mem::MaybeUninit<T> as core::marker::Copy>
    = note: the `Copy` trait is required because the repeated element will be copied

error: aborting due to 3 previous errors

๋ฏธ์Šคํ„ฐ๋ฆฌ ํ•ด๊ฒฐ : libcore์˜ ๋ฐ˜๋ณต ํ‘œํ˜„์˜ ์‚ฌ์šฉ์ด ์‹ค์ œ๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค ์œ ํ˜•์ด์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  liballoc์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” MaybeUninit::uninit ์ด ํ™๋ณด ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@RalfJung ์–ด์ฉŒ๋ฉด ์™„์ „ํžˆ ๋ถˆํ•„์š”ํ•œ ๋งคํฌ๋กœ ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜๋Š” PR์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@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 ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์„ ๋•Œ : (ํ˜„์žฌ ์•Œ๋ ค์ง„ ์ดˆ๊ธฐํ™” ๋œ) ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด memcpy ( ๋Œ€์‹  assume_init ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š”ํ•˜๋Š” memcpy ).

  • ์ด๊ฒƒ์€ ํŠนํžˆ ํŠน์ •ํ•œ ์ƒํ™ฉ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ๋žŒ๋“ค์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ (์›ํ•˜๋Š”)ํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ €๋ ดํ•œ ๋น„์šฉ ์ ˆ๊ฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋•Œ๋ฌธ์— assume_init_by_ref / assume_init_by_mut ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ( into_inner ์ด assume_init ๋ผ๊ณ  ๋ถˆ๋ ธ ๊ธฐ ๋•Œ๋ฌธ์— ref / ref mut ๊ฒŒํ„ฐ๋„ ์ด๊ฒƒ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ์ด๋ฆ„์„ ์–ป์Šต๋‹ˆ๋‹ค).

Drop ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ๊ด€๋ จ๋œ 2/3 ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. get_ref ๋ฐ get_mut ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ API๋กœ, ๋“œ๋กญ ๊ธ€๋ฃจ๊ฐ€์žˆ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • (๋ณ€ํ˜•) : get_ref / get_mut ์™€ ๋™์ผํ•œ API์ด์ง€๋งŒ Copy ๊ฒฝ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋“œ๋กญ์„ ๋ณด์žฅํ•˜๊ธฐ์œ„ํ•œ ํด๋กœ์ € ์Šคํƒ€์ผ API :

impl<T> MaybeUninit<T> {
    /// # Safety
    ///
    ///   - the contents must have been initialised
    unsafe
    fn assume_init_with_mut<R, F> (mut self: MaybeUninit<T>, f: F) -> R
    where
        F : FnOnce(&mut T) -> R,
    {
        if mem::needs_drop::<T>().not() {
            return f(unsafe { self.get_mut() });
        }
        let mut this = ::scopeguard::guard(self, |mut this| {
            ptr::drop_in_place(this.as_mut_ptr());
        });
        f(unsafe { MaybeUninit::<T>::get_mut(&mut *this) })
    }
}

( scopeguard ์˜ ๋กœ์ง์„ ์‰ฝ๊ฒŒ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜์กด ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)


๋ช…์‹œ์ ์ธ assume_init ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ฃผ์–ด์ง€๋ฉด get_ref / get_mut ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์•ˆ์ •ํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ 

.1 ์˜ต์…˜์˜ ๋ณ€ํ˜•์ด ์„ ํƒ๋˜๊ณ  get_ref / get_mut ๊ฐ€ assume_init ์ƒํ™ฉ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ ํ•ด์ง€๋ฉด์ด API๋Š” ๊ฑฐ์˜ ์—„๊ฒฉํ•˜๊ฒŒ ์—ด๋“ฑ ํ•ด์ง‘๋‹ˆ๋‹ค. (์ œ์•ˆ ๋œ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฐธ์กฐ์—์„œ ์ฝ๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ๋งํ•ฉ๋‹ˆ๋‹ค. get_ref ๋ฐ get_mut ์˜ ๊ฒฝ์šฐ์—๋Š” ์ ˆ๋Œ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค)

@danielhenrymantilla ๊ฐ€ get_{ref,mut} ์— ๋Œ€ํ•ด ์ผ๋˜ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์ €๋Š” read ์ด๋ฆ„์„ read_init ๋˜๋Š” read_assume_init ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ๋งŒ โ€‹โ€‹์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RalfJung ์ด๊ฒƒ์— ๋Œ€ํ•ด ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

fn foo<T>() -> T {
    let newt = unsafe { MaybeUninit::<T>::zeroed().assume_init() };
    newt
}

์˜ˆ๋ฅผ ๋“ค์–ด foo<NonZeroU32> ํ•ฉ๋‹ˆ๋‹ค. foo ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ ํ•  ๋•Œ UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๊นŒ (๋ชจ๋“  T s์— ๋Œ€ํ•ด ์œ ํšจํ•ด์•ผํ•˜๊ฑฐ๋‚˜ UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ํ•  ๋•Œ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ? ์ž˜๋ชป๋œ ์žฅ์†Œ ์ธ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธํ•˜์‹ญ์‹œ์˜ค.

@Pzixel ์ฝ”๋“œ๋Š” ์‹คํ–‰๋  ๋•Œ๋งŒ UB๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ foo::<i32>() ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ foo::<NonZeroU32>() ์€ UB์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์œ ํšจํ•œ ์†์„ฑ์„ "soundness"๋ผ๊ณ  ํ•˜๋ฉฐ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค. Rust์˜ ์ผ๋ฐ˜์ ์ธ ๊ณ„์•ฝ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์•ˆ์ „ํ•œ API ํ‘œ๋ฉด์ด ๊ฑด์ „ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„์„œ๊ด€ ์ด์šฉ์ž๋Š” UB์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Rust์˜ ์ „์ฒด ์•ˆ์ „ ์ด์•ผ๊ธฐ๋Š” ์‚ฌ์šด๋“œ API๊ฐ€์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

@RalfJung ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด์ด ํ•จ์ˆ˜๋Š” ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ์œ ํšจํ•˜์ง€ ์•Š์Œ).ํ•˜์ง€๋งŒ unsafe ๋กœ ํ‘œ์‹œํ•˜๋ฉด์ด ๋ณธ๋ฌธ์ด ์œ ํšจํ•˜๊ณ  ์†Œ๋ฆฌ๊ฐ€๋‚ฉ๋‹ˆ๋‹ค.

@Pzixel์„ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ‘œ์‹œํ•˜๋ฉด ๊ฑด์ „์„ฑ์€ ๋” ์ด์ƒ ์ ์šฉ๋˜๋Š” ๊ฐœ๋…์ด ์•„๋‹™๋‹ˆ๋‹ค. "์ด ์†Œ๋ฆฌ์ธ๊ฐ€"๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์œผ๋กœ ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ผ๋ถ€ ์ž…๋ ฅ์ด UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ unsafe ํ•จ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒํ•˜๋”๋ผ๋„ ํ•ด๋‹น ์ž…๋ ฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋„ UB๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ๊ธฐ๋Šฅ์ด unsafe ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ง์ด๋˜์ง€๋งŒ ๋Œ€๋‹ตํ•˜๊ธฐ ์ „์— ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ์ถ”์  ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด ์ง€๊ธˆ๋„ ๋ถˆ์•ˆ์ •ํ•œ MaybeUninit ์˜ ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ถ”์  ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • maybe_uninit_extra
  • maybe_uninit_ref
  • maybe_uninit_slice

ํ•ฉ๋ฆฌ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/63291 ๋„

๋” ์ผ๋ฐ˜์ ์œผ๋กœ MaybeUninit<T> ์„ ์ถ”์ ํ•˜๋Š” ๋ฉ”ํƒ€ ๋ฌธ์ œ๋ฅผ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. # 63566

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰