Rust: ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ณต์šฉ์ฒด (RFC 1444์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ)

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

rust-lang / rfcs # 1444์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

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

  • [x] ๊ณต์šฉ์ฒด ํ•„๋“œ์— ์ง์ ‘ ํ• ๋‹นํ•˜๋ฉด ์ด์ „ ๋‚ด์šฉ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๊นŒ?
  • [x] ๋…ธ๋™ ์กฐํ•ฉ์˜ ํ•œ ๋ถ„์•ผ์—์„œ ์ด์‚ฌ ํ•  ๋•Œ ๋‹ค๋ฅธ ๋ถ„์•ผ๋Š” ๋ฌดํšจ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ? ( 1 , 2 , 3 , 4 )
  • [] Union์— ๋Œ€ํ•ด Copy ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์กฐ๊ฑด์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ ๋ณ€ํ˜•์ด ๋น„ ๋ณต์‚ฌ ์œ ํ˜•์ด๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ๋ชจ๋“  ๋ณ€์ข…?
  • [] ๊ณต์šฉ์ฒด์™€ ์—ด๊ฑฐ ํ˜• ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๊ฐ„์— ์–ด๋–ค ์ƒํ˜ธ ์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (https://github.com/rust-lang/rust/issues/36394)

๋†’์€ ์ˆ˜์ž…์˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ :

  • [x] https://github.com/rust-lang/rust/issues/47412-MIR ๊ธฐ๋ฐ˜์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋•Œ๋•Œ๋กœ ๋ฌด์ธ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ†ตํ•ฉ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
B-RFC-approved B-unstable C-tracking-issue F-untagged_unions T-lang disposition-merge finished-final-comment-period

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

@nrc
๊ธ€์Ž„, ํ•˜์œ„ ์ง‘ํ•ฉ์€ "FFI ๊ณต์šฉ์ฒด", "C ๊ณต์šฉ์ฒด"๋˜๋Š” "C ++ 11 ์ด์ „ ๊ณต์šฉ์ฒด"์™€ ๊ฐ™์€ ๋‹ค์†Œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค. ์ €์˜ ์ดˆ๊ธฐ ๋ชฉํ‘œ๋Š”์ด ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์•ˆ์ •ํ™”ํ•˜์—ฌ winapi ์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋จธ์ง€ ํ•˜์œ„ ์ง‘ํ•ฉ๊ณผ ๊ทธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ๋ชจํ˜ธํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ "Unions 1.2"RFC ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋ถˆ๋ถ„๋ช… ํ•œ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์˜ ๊ธฐ๋Œ€๋Š” ์ดˆ๊ธฐ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ์•ˆ์ •ํ™” ํ•œ ํ›„ 1, 2 ๋˜๋Š” 3 ์ฃผ๊ธฐ๋กœ ๋‚˜๋จธ์ง€ ๋ถ€ํ’ˆ์„ ์•ˆ์ •ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  210 ๋Œ“๊ธ€

RFC์— ๋Œ€ํ•œ ํ† ๋ก ์—์„œ ๋†“์ณค์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ†ตํ•ฉ ๋ณ€ํ˜•์˜ ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ? ์ด ์˜ˆ์ œ์—์„œ Box::new(1) ๋Œ€ํ•œ ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๊นŒ?

union Foo {
    f: i32,
    g: Box<i32>,
}

let mut f = Foo { g: Box::new(1) };
f.g = Box::new(2);

@sfackler ๋‚ด ํ˜„์žฌ ์ดํ•ด๋Š” f.g = Box::new(2) _will_ ์†Œ๋ฉธ์ž๋ฅผ ์‹คํ–‰ํ•˜์ง€๋งŒ f = Foo { g: Box::new(2) } ๋Š” _not_ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Box<i32> lvalue์— ํ• ๋‹นํ•˜๋ฉด ํ•ญ์ƒ์ฒ˜๋Ÿผ ๋“œ๋กญ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ Foo lvalue์— ํ• ๋‹นํ•˜๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€ํ˜•์— ๋Œ€ํ•œ ํ• ๋‹น์€ ํ•„๋“œ๊ฐ€ ์ด์ „์— "์œ ํšจ"ํ–ˆ๋‹ค๋Š” ์ฃผ์žฅ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@sfackler Drop ์œ ํ˜•์˜ ๊ฒฝ์šฐ, ๋„ค, ๊ทธ๊ฑด ์ œ ์ดํ•ด์ž…๋‹ˆ๋‹ค. ์ด์ „์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Foo ์ƒ์„ฑ์ž ์–‘์‹ ๋˜๋Š” ptr::write ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ grep์—์„œ RFC๊ฐ€์ด ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ Drop lvalue์— ์“ฐ๋Š” ๊ฒƒ์ด ์†Œ๋ฉธ์ž ํ˜ธ์ถœ์„ ์œ ๋ฐœํ•œ๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์˜ ์ธ์Šคํ„ด์Šคํ™”๋กœ ๋ด…๋‹ˆ๋‹ค.

Drop ๋ณ€ํ˜•์ด์žˆ๋Š” & mut ์œ ๋‹ˆ์˜จ์€ ๋ฆฐํŠธ ์—ฌ์•ผํ•ฉ๋‹ˆ๊นŒ?

2016 ๋…„ 4 ์›” 8 ์ผ ๊ธˆ์š”์ผ, Scott Olson [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@sfackler https://github.com/sfackler Drop ์œ ํ˜•์˜ ๊ฒฝ์šฐ
์ดํ•ด. ์ด์ „์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Foo๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ƒ์„ฑ์ž ์–‘์‹ ๋˜๋Š” ptr :: write. ๋น ๋ฅธ grep์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ RFC๋Š”์ด ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/32836#issuecomment -207634431

2016 ๋…„ 4 ์›” 8 ์ผ ์˜คํ›„ 3:36:22 PDT์— Scott Olson [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@sfackler Drop ์œ ํ˜•์˜ ๊ฒฝ์šฐ, ๋„ค, ๊ทธ๊ฑด ์ œ ์ดํ•ด์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋“ค์ด
์ด์ „์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Foo ์ƒ์„ฑ์ž ์–‘์‹์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
ptr::write ๋น ๋ฅธ grep์—์„œ RFC๊ฐ€
์ด ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜, ๊ทธ ์ ‘๊ทผ๋ฒ•์€ ๋‚˜์—๊ฒŒ๋„ ์กฐ๊ธˆ ๋œ ์œ„ํ—˜ ํ•ด ๋ณด์ธ๋‹ค.

์œ ๋‹ˆ์˜จ ํ•„๋“œ์— ํ• ๋‹น ํ•  ๋•Œ ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ฉด f.g = Box::new(2) ์ด let p = &mut f.g; *p = Box::new(2) ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ๋ฅผ _not_ ์‚ญ์ œํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋œ ๋†€๋ผ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋„ ์•„๋‹™๋‹ˆ๋‹ค. unsafe ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” foo ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ foo = bar ๊ฐ€ UB์ด๊ณ  Drop ๋‹ค๋ฅธ ์ƒํ™ฉ์„ ์ด๋ฏธ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ Drop ์œ ํ˜•์„ ๊ณต์šฉ์ฒด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ณ„ํš์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ์˜๋ฏธ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋กœ ์ž‘์—… ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ „์ ์œผ๋กœ ์—ฐ๊ธฐ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ณต์šฉ์ฒด์—์„œ Drop ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค ๊ณ ํ•˜๋ฏ€๋กœ ์ผ๊ด€์„ฑ์ด์žˆ๋Š” ํ•œ ์–ด๋Š ์ชฝ์ด๋“  ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ์•„๋งˆ๋„
Into์™€ ํ•จ๊ป˜ "์ด์ƒํ•˜๊ฒŒ ํƒœ๊ทธ ๋œ"๊ฒƒ๋“ค

2016 ๋…„ 4 ์›” 8 ์ผ ๊ธˆ์š”์ผ์— Peter Atashian [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ณต์šฉ์ฒด์—์„œ Drop ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค ๊ณ ํ•˜๋ฏ€๋กœ ์–ด๋Š ์ชฝ์ด๋“ 
์ผ๊ด€์„ฑ์ด์žˆ๋Š” ํ•œ ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/32836#issuecomment -207653168

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

@nikomatsakis Drop์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ•„๋“œ์˜ ์ด์ „ ์œ ํšจ์„ฑ์„ ์š”๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜•์˜ ๊ณต์šฉ์ฒด ํ•„๋“œ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์–ด์ƒ‰ ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”

๊ทธ๋ฆฌ๊ณ  ์ €๋Š” unsafe ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ a = b ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด drop_in_place(&mut a); ptr::write(&mut a, b) ๋ฅผ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ _ ํ•˜๋‚˜๋งŒ ๋” _ ๋ฐฐ์šธ ์ˆ˜์žˆ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

(์ฃผ์˜ : a ์ด let a; a = b; ์ฒ˜๋Ÿผ ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ a _statically_ ์ธ ๊ฒฝ์šฐ ํ•˜๋ฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด #[allow(..)] ํ•ด์•ผํ•˜๋Š” ์กฐํ•ฉ์˜ Drop ๋ณ€ํ˜•์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ฒฝ๊ณ ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@tsion ์ด๊ฒƒ์€ a = b ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ฉฐ ๋•Œ๋กœ๋Š” a.x = b ๋Œ€ํ•ด์„œ๋„ ์‚ฌ์‹ค์ด์ง€๋งŒ *a = b ์—๋Š” ํ™•์‹คํžˆ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด ๋ถˆํ™•์‹ค์„ฑ ๋•Œ๋ฌธ์— ์ฃผ์ €ํ•˜๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

fn main() {
  let mut x: (i32, i32);
  x.0 = 2;
  x.1 = 3;
}

(๋‚˜์ค‘์— x ๋ฅผ ์ธ์‡„ํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์‹คํŒจํ•˜์ง€๋งŒ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)

@nikomatsakis ๊ทธ ์˜ˆ๋Š” ๋‚˜์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•  ๋•Œ ํ•ด๋‹น ์˜ˆ์ œ๊ฐ€ ์ปดํŒŒ์ผ๋˜๋Š” ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์˜ˆ์˜ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ ๋‚ด๊ฐ€ a = b ๋Œ€ํ•ด ์‚ฌ์‹ค์ด ์•„๋‹ˆ๊ณ  ๊ฐ€๋” a.x = b ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์‹ค์ž…๋‹ˆ๊นŒ?

x.0 ์— ์†Œ๋ฉธ์ž๊ฐ€์žˆ๋Š” ์œ ํ˜•์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

fn main() {
    let mut x: (Box<i32>, i32);
    x.0 = Box::new(2); // x.0 statically know to be uninit, destructor not called
    x.0 = Box::new(3); // x.0 destructor is called before writing new value
}

๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์“ฐ๊ธฐ์— ๋Œ€ํ•ด ๋ณดํ’€์ด ์ƒ๊ธฐ์ง€ ์•Š์„๊นŒ์š”?

๋‚ด ์š”์ ์€ = ๊ฐ€ ์†Œ๋ฉธ์ž๋ฅผ _ ํ•ญ์ƒ _ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ
ํƒ€๊ฒŸ์ด ์•Œ๋ ค ์ง„์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ง€์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2016 ๋…„ 4 ์›” 12 ์ผ ํ™”์š”์ผ ์˜คํ›„ 04:10:39 -0700 Scott Olson์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@nikomatsakis ์ €์—๊ฒŒ ์ƒˆ๋กœ์šด ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•  ๋•Œ ํ•ด๋‹น ์˜ˆ์ œ๊ฐ€ ์ปดํŒŒ์ผ๋˜๋Š” ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์˜ˆ์˜ ๊ด€๋ จ์„ฑ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ ๋‚ด๊ฐ€ a = b ๋Œ€ํ•ด ์‚ฌ์‹ค์ด ์•„๋‹ˆ๊ณ  ๊ฐ€๋” 'ax = b'์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์‹ค์ด ์•„๋‹Œ๊ฐ€?

x.0 ์— ์†Œ๋ฉธ์ž๊ฐ€์žˆ๋Š” ์œ ํ˜•์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

fn main() {
    let mut x: (Box<i32>, i32);
    x.0 = Box::new(2); // x.0 statically know to be uninit, destructor not called
    x.0 = Box::new(3); // x.0 destructor is called
}

๋ฟก ๋นต๋€จ

๋“œ๋กญ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ์†Œ๋ฉธ์ž๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์“ฐ๊ธฐ๋Š” ์–ด์ฐจํ”ผ ํ˜ผ๋ž€ ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, ๊ทธ๋ƒฅ ๊ธˆํ•˜๋Š” ๊ฒŒ ์–ด๋•Œ์š”? ์–ธ์ œ๋“ ์ง€ *(&mut u.var) = val ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์š”์ ์€ = ๊ฐ€ ์†Œ๋ฉธ์ž๋ฅผ _ ํ•ญ์ƒ _ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ์ด ์ดˆ๊ธฐํ™” ๋œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@nikomatsakis ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

(์ฃผ์˜ : let a; a = b;์™€ ๊ฐ™์ด a๊ฐ€ ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ •์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ ๋“œ๋กญ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋“œ๋กญ ํ”Œ๋ž˜๊ทธ์˜ ๋™์  ๊ฒ€์‚ฌ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ๋ณด๋‹ค ํ™•์‹คํžˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

@tsion

๋“œ๋กญ ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐ˜๋™์  ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์ œ๋กœํ™” ๋“œ๋กญ์ด ์‚ฌ๋ผ์ง„ ํ›„์—๋Š” codegen์˜ ์ผ๋ถ€๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ข‹์€ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ํ˜ผ๋ž€์„์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์“ฐ๊ธฐ๋ฅผ ๊ธˆ์ง€ํ•œ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

Drop ์œ ํ˜•๋„ ๊ณต์šฉ์ฒด์—์„œ ํ—ˆ์šฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, Rust์—์„œ ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๊ณต์šฉ์ฒด๊ฐ€์žˆ๋Š” C ์ฝ”๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šคํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋ฉฐ C์—๋Š” ์†Œ๋ฉธ์ž์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ชฉ์ ์œผ๋กœ๋Š” Rust ์ฝ”๋“œ์—์„œ enum ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋“œ๋กญ์„ ๊ธˆ์ง€ํ•˜๋Š” NoDrop ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

drop_in_place ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์˜ต์…˜ ์œ ํ˜•์ด ์ •์˜๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์ค‘์— ํ•„๋“œ ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

๋…ผ์˜๋ฅผ ์œ„ํ•ด, ๋‚˜๋Š” ์กฐํ•ฉ์˜ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ณ  _ ๊ทธ๋ฆฌ๊ณ  _ ์ž„์˜ ( Drop ) ์œ ํ˜•์„ ๊ทธ ์•ˆ์— ๋„ฃ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ๊ณต๊ฐ„ ํšจ์œจ์ ์ธ ์—ด๊ฑฐ ํ˜•์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

union SlotInner<V> {
    next_empty: usize, /* index of next empty slot */
    value: V,
}

struct Slot<V> {
    inner: SlotInner<V>,
    version: u64 /* even version -> is_empty */
}

@nikomatsakis ํ˜„์žฌ ์—ฌ๊ธฐ์— ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜์—ด๋œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋‹ต๋ณ€์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

์ด ๋™์ž‘์„ ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์œ„ํ•ด RFC1444๋ฅผ ์ˆ˜์ •ํ•˜๋Š” RFC ํ’€ ์š”์ฒญ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ?

@joshtriplett @nikomatsakis ๊ฐ€ ํœด๊ฐ€

@aturon ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด RFC PR https://github.com/rust-lang/rfcs/issues/1663 ์„ ์ด๋Ÿฌํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ RFC1444์— ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

( @aturon ์ง€๊ธˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

https://github.com/petrochenkov/rust/tree/union์— ์˜ˆ๋น„ ๊ตฌํ˜„์ด

์ƒํƒœ : ๊ตฌํ˜„ ๋จ (๋ชจ๋“ˆ๋กœ ๋ฒ„๊ทธ), PR ์ œ์ถœ ๋จ (https://github.com/rust-lang/rust/pull/36016).

@petrochenkov ๋Œ€๋‹จํ•ด! ์ง€๊ธˆ๊นŒ์ง€ ๋ฉ‹์ ธ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋™ ๊ฒ€์‚ฌ๊ธฐ์—์„œ Copy ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์œ ๋‹ˆ์˜จ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
u ๊ฐ€ union U { a: A, b: B } ์˜ ์ดˆ๊ธฐํ™” ๋œ ๊ฐ’์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด์ œ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

1) A: !Copy, B: !Copy, move_out_of(u.a)
์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. u.b ๋„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค.
์˜จ ์ „์„ฑ ๊ฒ€์‚ฌ : union U { a: T, b: T } ๋Š” struct S { a: T } + ํ•„๋“œ ๋ณ„์นญ๊ณผ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

2) A: Copy, B: !Copy, move_out_of(u.a)
u.b ๋Š” ์—ฌ์ „ํžˆ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. move_out_of(u.a) ๋Š” ๋‹จ์ˆœํžˆ memcpy ์ด๊ณ  u.b ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2) A: !Copy, B: Copy, move_out_of(u.a)
์ด๊ฒƒ์€ ๊ฐ€์žฅ ์ด์ƒํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. u.b ๋Š” Copy ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ „ํ™˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. Copy ๊ฐ’์€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ (์˜ˆ : let a: u8; ) ์ดˆ๊ธฐํ™” ๋จ์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด AFAIK์ž…๋‹ˆ๋‹ค.

๋ฟก๋ฟก
๋‚˜๋Š” ์ด๊ฒƒ์ด FFI ์š”๊ตฌ์™€ ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :)
์ข‹์€ ์†Œ์‹์€ ์ด๊ฒƒ์ด ์ฐจ๋‹จ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ๋ง์— ๋” ๊ฐ„๋‹จํ•œ ํ–‰๋™์„ ๊ตฌํ˜„ํ•˜๊ณ  PR์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@petrochenkov ๋‚ด ๋ณธ๋Šฅ์€ ๋…ธ๋™ ์กฐํ•ฉ์ด ๋ณธ์งˆ์ ์œผ๋กœ "๋น„ํŠธ ๋ฒ„ํ‚ท"์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ์‹ค์ œ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์ถ”์ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›์‹œ ํฌ์ธํ„ฐ์˜ ์ง€์‹œ ๋Œ€์ƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜์—†๋Š” ์ด์œ ์™€ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ ์ด๊ธฐ๋„

์ด ๊ทœ์น™์— ๋”ฐ๋ผ ๋ณต์‚ฌ๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ๊ณต์šฉ์ฒด๊ฐ€ Copy ๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ structs / enums์™€ ๋‹ฌ๋ฆฌ ๋‚ด๋ถ€ ์˜จ ์ „์„ฑ ๊ฒ€์‚ฌ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ ๊ณต์šฉ์ฒด ์œ ํ˜•์— ๋Œ€ํ•œ ์‚ฌ๋ณธ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

union Foo { ... } // contents don't matter

Copy ๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ณต์šฉ์ฒด๋Š” ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

union Bar { x: Rc<String> }
impl Copy for Bar { }
impl Clone for Bar { fn clone(&self) -> Self { *self } }

Copy ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฏ€๋กœ์ด ๊ณต์šฉ์ฒด ์œ ํ˜• Bar ๋Š” ๋ณต์‚ฌ์ž…๋‹ˆ๋‹ค.

Bar ๊ฐ€ ๊ตฌ์กฐ์ฒด ์ธ ๊ฒฝ์šฐ x ํ•„๋“œ์˜ ์œ ํ˜•์œผ๋กœ ์ธํ•ด Copy ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€๋ฉ๋‹ˆ๋‹ค.

ํ—ˆ, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์งˆ๋ฌธ์— ์‹ค์ œ๋กœ ๋Œ€๋‹ตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์‹œ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. =)

์ข‹์•„์š”, ์ €๋Š” ๋‹น์‹ ์˜ ์งˆ๋ฌธ์— ์ „ํ˜€ ๋Œ€๋‹ตํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. "๋น„ํŠธ ๋ฒ„ํ‚ท"์›์น™์— ๋”ฐ๋ผ, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ๋…ธ์กฐ์—์„œ ๋‚˜๊ฐˆ ์ˆ˜์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ *mut T ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•˜๊ณ  ptr::read ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์‚ฌํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋ฟก ๋นต๋€จ

๋‚ด ๋ณธ๋Šฅ์€ ๋…ธ์กฐ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ "๋น„ํŠธ ๋ฒ„ํ‚ท"์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜, ๋‚˜๋Š” ๋ฐ˜๋Œ€๋กœ ๊ทธ๋Ÿฌํ•œ ์œ„ํ—˜ํ•œ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ์กฐํ•ฉ์˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ณด์ฆ์„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ•ด์„์€ union์€ ์šฐ๋ฆฌ๊ฐ€ ํŒ๋ณ„์ž๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์–ธ์ œ๋“ ์ง€ ์ ์–ด๋„ ํ•˜๋‚˜์˜ union์˜ ๋ณ€ํ˜•์ด ์œ ํšจํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ด€๋ จ๋˜์ง€ ์•Š๋Š” ํ•œ).

ํ˜„์žฌ ๊ตฌํ˜„์˜ ๋ชจ๋“  ์ฐจ์šฉ / ์ด๋™ ๊ทœ์น™์€์ด ๋ณด์žฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ์ด๊ฒƒ์€ ๊ฐ€์žฅ ๋ณด์ˆ˜์  ์ธ ํ•ด์„์œผ๋กœ "์•ˆ์ „ํ•œ"๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๋™์ผํ•œ ์œ ํ˜•์˜ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ณต์šฉ์ฒด์— ์•ˆ์ „ํ•˜๊ฒŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ). ์œ ์šฉํ•จ ) ๋˜๋Š” Rust ์œ ๋‹ˆ์˜จ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ฒฝํ—˜์ด ๋ชจ์ด๋Š” ๋ฏธ๋ž˜์˜ "๋น„ํŠธ ๋ฒ„ํ‚ท"๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ https://github.com/rust-lang/rust/pull/36016#issuecomment -242810887์— ์„ค๋ช… ๋œ๋Œ€๋กœ ๋” ๋ณด์ˆ˜์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

ํ•ด์„์€ union์€ ์šฐ๋ฆฌ๊ฐ€ ํŒ๋ณ„์ž๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์–ธ์ œ๋“ ์ง€ ์ ์–ด๋„ ํ•˜๋‚˜์˜ union์˜ ๋ณ€ํ˜•์ด ์œ ํšจํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ด€๋ จ๋˜์ง€ ์•Š๋Š” ํ•œ).

ํ†ตํ•ฉ์œผ๋กœ ์ž‘์—… ํ•  ๋•Œ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์•ก์„ธ์Šค๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ some_union.field ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํšจํ•œ ๋ณ€ํ˜• ์„ธํŠธ์— ํ˜„์žฌ field ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์•”์‹œ ์  (๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€) ์ฃผ์žฅ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฐจ์ž… ๊ฒ€์‚ฌ๊ธฐ ํ†ตํ•ฉ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. x ํ•„๋“œ๋ฅผ ๋นŒ๋ฆฐ ๋‹ค์Œ y ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ x ๋ฐ y ๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋นŒ ๋ ธ์Šต๋‹ˆ๋‹ค). (๋ฐ˜๋Œ€๋กœ ์ผ๋ฐ˜ ์—ด๊ฑฐ ํ˜•์—์„œ๋Š” ํ•œ ๋ฒˆ์— ๋‘˜ ์ด์ƒ์˜ ๋ณ€ํ˜•์— ์„œ์‹ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ,์ด ๊ทœ์น™์ด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .)

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

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

์šฐ๋ฆฌ๋Š” ๋…ธ์กฐ์—์„œ Copy ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ˆ์ •ํ™” ์ „์— ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฌธ์„œํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ„์— ๋‚˜์—ด๋œ ์ด๋Ÿฌํ•œ ํšŒ์ƒ‰ ์˜์—ญ์˜ ์ „์ฒด ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

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

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

์ด๋Ÿฌํ•œ ํšŒ์ƒ‰ ์˜์—ญ์˜ ์ „์ฒด ๋ชฉ๋ก์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฉ€์ง€ ์•Š์€ ๋ฏธ๋ž˜์— ๋…ธ์กฐ RFC๋ฅผ ์ˆ˜์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! "์—ด๊ฑฐ ํ˜•"ํ•ด์„์€ ๊ฝค ์žฌ๋ฏธ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ผ์ข…์˜ ๋ถ€๋ถ„ ๋Œ€์ƒ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ”๊พธ๋ ค๊ณ ํ•˜์ง€ ์•Š๋Š” ํ•œ).

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

๊ทธ๋ฆฌ๊ณ  @eddyb ์€ rustc ์ƒ์ˆ˜ ํ‰๊ฐ€๋ฅผ Miri ๋ฒ„์ „์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

"๋‘˜ ์ด์ƒ์˜ ๋ณ€ํ˜•"ํ•ด์„์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์ฃผ์žฅ์€ ๊ฒฐํ•ฉ์ด ์ƒ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

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

๋‚ด ํ•ด์„์€ ๋Ÿฐํƒ€์ž„์— ๋น„ํ™œ์„ฑ ๋ณ€ํ˜•์ด ์—ฌ์ „ํžˆ ๋น„ํ™œ์„ฑ ์ƒํƒœ์ด์ง€๋งŒ ์กฐํ•ฉ์˜ ํ™œ์„ฑ ๋ณ€ํ˜•๊ณผ ๋ ˆ์ด์•„์›ƒ์ด ํ˜ธํ™˜๋˜๋Š” ๊ฒฝ์šฐ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ , ๋…ธ์กฐ๊ฐ€ ๋ชจ๋“  ๋ณ€ํ˜•์— ๋™์‹œ์— ์†ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ƒ๊ฐํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ์ฐจ์ด๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. :)

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

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

๋‚˜๋Š” ๋ฉ€์ง€ ์•Š์€ ๋ฏธ๋ž˜์— ๋…ธ์กฐ RFC๋ฅผ ์ˆ˜์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! "์—ด๊ฑฐ ํ˜•"ํ•ด์„์€ ๊ฝค ์žฌ๋ฏธ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ž์‹ ๊ฐ! ๋‹น์‹ ์€ ์‹œ๋„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค;)

์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋” ์ž์„ธํžˆ ์„ค๋ช… ํ•ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋” ์ž์„ธํžˆ ์„ค๋ช… ํ•ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ตฌํ˜„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… (์˜ˆ : ๋” ๋‚˜์€ ๋ฌธ์„œ), ์ผ๋ถ€ ์ž‘์€ ํ™•์žฅ (์˜ˆ : ๋นˆ ๊ณต์šฉ์ฒด ๋ฐ ๊ณต์šฉ์ฒด ํŒจํ„ด์˜ .. ), ๊ณต์šฉ์ฒด ์ง„ํ™”์˜ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” (๋ชจ์ˆœ๋˜๋Š”) ๋Œ€์•ˆ-๋” ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ๋œ ์ œํ•œ์ ์ธ "์Šคํฌ๋ž˜์น˜ ๊ณต๊ฐ„" ํ•ด์„ ๋ฐ ๋” ์•ˆ์ „ํ•˜๊ณ  ๋” ์ œํ•œ์ ์ธ "์•Œ ์ˆ˜์—†๋Š” ํŒ๋ณ„์ด์žˆ๋Š” ์—ด๊ฑฐ"ํ•ด์„-์ด๋™ / ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ๊ธฐ, Copy impls, unsafe ty ํ•„๋“œ ์•ก์„ธ์Šค ๋“ฑ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ

๋น„ํ™œ์„ฑ ํ†ตํ•ฉ ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ๋•Œ UB๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ :

union U { a: u8, b: () }
let u = U { b: () };
let a = u.a; // most probably an UB, equivalent to reading from `mem::uninitialized()`

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฌดํ•œํžˆ ๊นŒ๋‹ค๋กœ์šด ์˜์—ญ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ต์ฐจ ํ•„๋“œ ์˜๋ฏธ๋ก ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌ์ธํ„ฐ ์บ์ŠคํŠธ ๋งž์Šต๋‹ˆ๊นŒ?
_ (_ () as * u8)

2016 ๋…„ 9 ์›” 1 ์ผ ๋ชฉ์š”์ผ, Vadim Petrochenkov [email protected]
์ผ๋‹ค :

๋น„ํ™œ์„ฑ ํ†ตํ•ฉ ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ๋•Œ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ : UB

union U {a : u8, b : ()}
let u = U {b : ()};
let a = ua; // mem::uninitialized() ์—์„œ ์ฝ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ UB ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฌดํ•œํžˆ ๊นŒ๋‹ค๋กœ์šด ์˜์—ญ์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/32836#issuecomment -244154751,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABxXhi68qRITTFW5iJn6omZQQBQgzweNks5qlw4qgaJpZM4IDXsj
.

ํ˜„์žฅ ์ ‘๊ทผ์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

2016 ๋…„ 9 ์›” 1 ์ผ ๋ชฉ์š”์ผ, Vadim Petrochenkov [email protected]
์ผ๋‹ค :

์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋” ์ž์„ธํžˆ ์„ค๋ช… ํ•ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ตฌํ˜„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… (์˜ˆ :
๋ฌธ์„œ), ์ผ๋ถ€ ์ž‘์€ ํ™•์žฅ (์˜ˆ : ๋นˆ ๊ณต์šฉ์ฒด ๋ฐ .. ๊ณต์šฉ์ฒด
ํŒจํ„ด), ๊ฒฐํ•ฉ ์ง„ํ™”์˜ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” (๋ชจ์ˆœ๋˜๋Š”) ๋Œ€์•ˆ-๋”
์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ๋œ ์ œํ•œ์ ์ธ "์Šคํฌ๋ž˜์น˜ ๊ณต๊ฐ„"ํ•ด์„ ๋ฐ ๋” ์•ˆ์ „ํ•จ
๋” ์ œํ•œ์ ์ธ "์•Œ ์ˆ˜์—†๋Š” ํŒ๋ณ„์ด์žˆ๋Š” ์—ด๊ฑฐ ํ˜•"ํ•ด์„-๋ฐ
์ด๋™ / ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ๊ธฐ, Copy impls, unsafety์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ
ํ˜„์žฅ ์ ‘๊ทผ ๋“ฑ

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/32836#issuecomment -244151164,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABxXhuHStN8AFhR3KYDU27U29MiMpN5Bks5qlws9gaJpZM4IDXsj
.

ํ˜„์žฅ ์ ‘๊ทผ์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋•Œ๋กœ๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์†Œํ•˜๊ฒŒ ํŒŒ๊ดด ํ•  ์ˆ˜์žˆ๋Š” ๊ณต์šฉ์ฒด ํ•„๋“œ์— ๋Œ€ํ•œ ํ• ๋‹น์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • union U { f1: T, f2: T, ..., fN: T } ํ•„๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์•ก์„ธ์Šค (์ฆ‰, ๋ชจ๋“  ํ•„๋“œ์˜ ์œ ํ˜•์ด ๋™์ผ ํ•จ)๋Š” "์•Œ ์ˆ˜์—†๋Š” ํŒ๋ณ„์ด์žˆ๋Š” ์—ด๊ฑฐ ํ˜•"ํ•ด์„์—์„œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ํŠน๋ณ„ํ•œ ์กฐ๊ฑด์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋ถ€๋ฅด์„ธ์š”.

ํ˜„์žฌ git์˜ ์ตœ์‹  rustc์—์„œ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ์ง€์›์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐ๋“œ ํ•„๋“œ ๊ฒ€์‚ฌ๊ธฐ์—์„œ ํฅ๋ฏธ๋กœ์šด ์‚ฌ๊ฑด์„ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

#![feature(untagged_unions)]

union U {
    i: i32,
    f: f32,
}

fn main() {
    println!("{}", std::mem::size_of::<U>());
    let u = U { f: 1.0 };
    println!("{:#x}", unsafe { u.i });
}

์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

warning: struct field is never used: `f`, #[warn(dead_code)] on by default

dead_code ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(์ด๋ฏธ "struct field"์‚ฌ์šฉ์— ๋Œ€ํ•ด PR # 36252๋ฅผ ์ œ์ถœํ•˜์—ฌ "field"๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.)

์œ ๋‹ˆ์˜จ์€ ํ˜„์žฌ ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์กฐ์ • ๋œ ํ•„๋“œ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์—†์ง€๋งŒ RFC๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ์ด ๋™์ž‘์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

#![feature(untagged_unions)]

union Foo<T: ?Sized> {
  value: T,
}

์‚ฐ์ถœ:

error[E0277]: the trait bound `T: std::marker::Sized` is not satisfied
 --> <anon>:4:5
  |
4 |     value: T,
  |     ^^^^^^^^ trait `T: std::marker::Sized` not satisfied
  |
  = help: consider adding a `where T: std::marker::Sized` bound
  = note: only the last field of a struct or enum variant may have a dynamically sized type

์ปจํ…์ŠคํŠธ ํ‚ค์›Œ๋“œ๋Š” ๋ชจ๋“ˆ / ํฌ๋ ˆ์ดํŠธ ๋ฃจํŠธ ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

fn main() {
    // all work
    struct Peach {}
    enum Pineapple {}
    trait Mango {}
    impl Mango for () {}
    type Strawberry = ();
    fn woah() {}
    mod even_modules {
        union WithUnions {}
    }
    use std;

    // does not work
    union Banana {}
}

๊ฝค ๋ถˆ์พŒํ•œ ์ผ๊ด€์„ฑ ์‚ฌ๋งˆ๊ท€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๊ธฐ์‚ฌ
์‹ค์ˆ˜๋กœ ์ด์ „ ๋ฒ„์ „์˜ rustc๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
๋ฐฉ๊ธˆ playpen์—์„œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ–ˆ๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (๋ชจ๋“ˆ๋กœ "๋นˆ ์œ ๋‹ˆ์˜จ"์˜ค๋ฅ˜).
์ด ํŠน์ • ์ƒํ™ฉ์— ๋Œ€ํ•œ ์‹คํ–‰ ํ†ต๊ณผ ํ…Œ์ŠคํŠธ ๊ฒ€์‚ฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค-https: //github.com/rust-lang/rust/blob/master/src/test/run-pass/union/union-backcomp.rs.

@petrochenkov ์•„, stable ๋˜ ๋Œ๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ

๊ฒฐ๊ตญ ๋…ธ์กฐ๋Š” ์ด ์ œ์•ˆ ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ถ„์•ผ์˜ ์‚ฌ์•…ํ•œ ์Œ๋‘ฅ์ด ์ธ _ ์•ˆ์ „ํ•œ ๋ถ„์•ผ _๋ฅผ ์ง€์›ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
cc https://github.com/rust-lang/rfcs/issues/381#issuecomment -246703410

๋‹ค์–‘ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ "์•ˆ์ „ํ•œ ์กฐํ•ฉ"์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ์˜ Copy non-Drop ํ•„๋“œ๋ฅผ ๋…์ ์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ณต์šฉ์ฒด๋Š” ์•ˆ์ „ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ๋ฌธ์ œ ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์€ ๋ฐœ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@joshtriplett ๋˜ํ•œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜์žˆ๋Š” ์œ ํ˜•์— "๊ตฌ๋ฉ"์ด ์—†๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งํ•˜๊ณ  ์‹ถ์€๋Œ€๋กœ : "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋Š” ์˜ˆ์ธกํ•  ์ˆ˜์—†๋Š” ์ž„์˜์˜ ๋ฐ์ดํ„ฐ์ด๊ฑฐ๋‚˜ SSH ๊ฐœ์ธ ํ‚ค ์ค‘ ๋” ๋‚˜์œ ๊ฒƒ์ž…๋‹ˆ๋‹ค."

&T Copy ๋ฐ Non-Drop์ด ์•„๋‹Œ๊ฐ€์š”? usize ์™€ ํ•จ๊ป˜ "์•ˆ์ „ํ•œ"๊ณต์šฉ์ฒด์— ๋„ฃ์œผ๋ฉด ๋ถˆ๋Ÿ‰ ์ฐธ์กฐ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทœ์น™์€ ๊ทธ๊ฒƒ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์—„๊ฒฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ์˜ Copy non-Drop ํ•„๋“œ๋ฅผ ๋…์ ์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ณต์šฉ์ฒด๋Š” ์•ˆ์ „ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ๋ฌธ์ œ ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์€ ๋ฐœ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ง„์ง€ํ•œ ์ œ์•ˆ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœํ•œ ์˜ˆ์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๊นŒ๋‹ค๋กœ์šด ์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

  • u8 ๋ฐ bool ์˜ ํฌ๊ธฐ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ u8 ๊ฐ’์€ bool ๋Œ€ํ•ด ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉฐ์ด ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด UB
  • &T ๋ฐ &U ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ–๊ณ ์žˆ๋‹ค Copy + !Drop ๋ชจ๋“  T ๋ฐ U ๋งŒํผ ๋ชจ๋‘ ๋˜๋Š” ์–ด๋Š๋งŒํผ ( Sized )
  • uN / iN ์™€ fN ์€ ํ˜„์žฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™˜์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์•ˆ์ „ํ•œ ์–ธ์–ด๋ฅผ ํ™•๋Œ€ํ•˜๋ฏ€๋กœ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์ƒํ™œ ์นจํ•ด (์˜ˆ : struct Foo(Bar); ~ Bar )๋Š” ์•ˆ์ „๊ณผ ๊ด€๋ จ๋œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์ƒํ™œ ๋ณดํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

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

@cuviper ์ œ๋กœ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด "์ผ๋ฐ˜์ ์ธ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ"๋ฅผ ์ •์˜ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹  ๋ง์ด ๋งž์Šต๋‹ˆ๋‹ค. ์ •์˜๋Š” ์ฐธ์กฐ๋ฅผ ์ œ์™ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ์œ ํ˜• ์ง‘ํ•ฉ๊ณผ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์กฐํ•ฉ์„ ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฟก๋ฟก

u8๊ณผ bool์˜ ํฌ๊ธฐ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ u8 ๊ฐ’์€ bool์— ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉฐ์ด ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด UB๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ง€์ ; ์—ด๊ฑฐ ํ˜•์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

& T ๋ฐ & U๋Š” ํฌ๊ธฐ๊ฐ€ ๊ฐ™๊ณ  ๋ชจ๋“  T ๋ฐ U์— ๋Œ€ํ•ด Copy +! Drop์ž…๋‹ˆ๋‹ค (๋‘˜ ๋‹ค ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ).

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์žŠ์—ˆ๋‹ค.

uN / iN๊ณผ fN ๊ฐ„์˜ ๋ณ€ํ™˜์€ ํ˜„์žฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™˜์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์•ˆ์ „ํ•œ ์–ธ์–ด๋ฅผ ํ™•๋Œ€ํ•˜๋ฏ€๋กœ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ์  ๋ชจ๋‘์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ—ˆ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ”„๋ผ์ด๋ฒ„์‹œ ์œ„๋ฐ˜ (์˜ˆ : struct Foo (Bar)๊ณผ Bar ์‚ฌ์ด์˜ punning)์€ ์•ˆ์ „๊ณผ ๊ด€๋ จ๋œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ผ์ด๋ฒ„์‹œ๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

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

uN / iN๊ณผ fN ๊ฐ„์˜ ๋ณ€ํ™˜์€ ํ˜„์žฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™˜์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์•ˆ์ „ํ•œ ์–ธ์–ด๋ฅผ ํ™•๋Œ€ํ•˜๋ฏ€๋กœ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž์—๋Š” UB๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŠธ๋žฉ ํ‘œํ˜„ ์ธ ์‹ ํ˜ธ NaN์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@ retep998 Rust๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ํŠธ๋žฉ ๋น„ํ™œ์„ฑํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๊นŒ? (์ด๊ฒƒ์€ UB ๋ฌธ์ œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋ก ์ ์œผ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

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

ํ•ด์„์€ union์€ ํŒ๋ณ„์ž๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์–ธ์ œ๋“ ์ง€ ์กฐํ•ฉ์˜ ๋ณ€ํ˜• ์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ํ•ด์„์— ๋‹ค๊ฐ€ ์™”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”. ๋‚˜๋Š” ํ•ญ์ƒ ๊ทธ๋žฌ๋“ฏ์ด ์ €์žฅํ•˜๋Š” ์ง€์ ์—์„œ ๊ฒฐ์ •๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฒ•์  ๋ณ€ํ˜•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ’์„ "์–‘์ž ์ƒํƒœ"์— ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ฒฐํ•ฉ์— ์ €์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ž ์žฌ์ ์œผ๋กœ ๋งŽ์€ ๋ฒ•์  ํ•ด์„ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณ€ํ™˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋Ÿฌํ•œ ๋ณ€์ข…๋“ค ์ค‘ ํ•˜๋‚˜์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด ๊ทธ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜์— "๊ฐ•์ œ"ํ•˜๊ณ  ๊ทธ ๊ฐ€์น˜๋ฅผ ์†Œ๋น„ํ•œ๋‹ค๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ด๊ฑฐ ํ˜•์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (ํ•ด๋‹น ์œ ํ˜•์ด Copy ์ด ์•„๋‹Œ ๊ฒฝ์šฐ). ๊ทธ๋ž˜์„œ ๐Ÿ‘, ๊ธฐ๋ณธ์ ์œผ๋กœ.

#[repr(C)] ์— ๋Œ€ํ•œ ์งˆ๋ฌธ : @pnkfelix๊ฐ€ ์ตœ๊ทผ ๋‚˜์—๊ฒŒ ์ง€์ ํ–ˆ๋“ฏ์ด ํ˜„์žฌ ์‚ฌ์–‘์— ๋”ฐ๋ฅด๋ฉด union์ด #[repr(C)] ์ด ์•„๋‹Œ ๊ฒฝ์šฐ x ํ•„๋“œ์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜๊ณ  ์ฝ๋Š” ๊ฒƒ์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค. y ํ•„๋“œ ํฌํ•จ. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋™์ผํ•œ ์˜คํ”„์…‹์—์„œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์‹œ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

์ƒ๊ฐ?

๋ฟก ๋นต๋€จ

ํ•ด์„์€ union์€ ํŒ๋ณ„์ž๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์–ธ์ œ๋“ ์ง€ ์กฐํ•ฉ์˜ ๋ณ€ํ˜• ์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์•…์˜ ๋ถ€๋ถ„์€ ๊ฒฐํ•ฉ์— ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ๋ณ€ํ˜• / ํ•„๋“œ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.
์ด ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

union U {
    a: (u8, bool),
    b: (bool, u8),
}
fn main() {
    unsafe {
        let mut u = U { a: (2, false) };
        u.b.1 = 2; // turns union's memory into (2, 2)
    }
}

๋ชจ๋“  ํ•„๋“œ๋Š” Copy ์ด๊ณ  ๊ด€๋ จ๋œ ์†Œ์œ ๊ถŒ์ด ์—†์œผ๋ฉฐ ์ด๋™ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋งŒ์กฑ ์Šค๋Ÿฝ์ง€๋งŒ ๋น„ํ™œ์„ฑ ํ•„๋“œ b ๋Œ€ํ•œ ๋ถ€๋ถ„ ํ• ๋‹น์€ 0 ์œ ํšจํ•œ ๋ณ€ํ˜•์ด์žˆ๋Š” ์ƒํƒœ๋กœ Union์„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ง ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ณผ์ œ๋ฅผ UB๋กœ ๋งŒ๋“œ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํ•ด์„์„ ๋ณ€๊ฒฝ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฒƒ?

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

๊ทธ๋Ÿฐ ๊ณผ์ œ๋ฅผ UB๋กœ ๋งŒ๋“œ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚˜์˜ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. a ํ• ๋‹นํ•˜๋ฉด b ๋ณ€ํ˜•์ด ์œ ํšจํ•œ ๋ณ€ํ˜• ์ง‘ํ•ฉ์— ์—†์œผ๋ฏ€๋กœ ๋‚˜์ค‘์— u.b.1 (์ฝ๊ธฐ ๋˜๋Š” ํ• ๋‹น ์—ฌ๋ถ€)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

# [repr (C)]์— ๋Œ€ํ•œ ์งˆ๋ฌธ : @pnkfelix๊ฐ€ ์ตœ๊ทผ ์ €์—๊ฒŒ ์ง€์ ํ–ˆ๋“ฏ์ด ํ˜„์žฌ ์‚ฌ์–‘์—์„œ๋Š” ๊ณต์šฉ์ฒด๊ฐ€ # [repr (C)]๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ•„๋“œ x์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜๊ณ  ํ•„๋“œ y๋กœ ์ฝ๋Š” ๊ฒƒ์€ ๋ถˆ๋ฒ•์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. . ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋™์ผํ•œ ์˜คํ”„์…‹์—์„œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์‹œ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ ์ ˆํ•œ ํ‘œํ˜„์€ 1) ์ด์ „์— ์ž‘์„ฑ๋œ ํ•„๋“œ / ํ•„๋“œ ์กฐ๊ฐ๊ณผ "๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜"(๋ชจํ˜ธํ•จ)์ด ์•„๋‹Œ ํ•„๋“œ์—์„œ ์ฝ๋Š” ๊ฒƒ์ด UB์ž…๋‹ˆ๋‹ค. 2) #[repr(C)] ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ๋ ˆ์ด์•„์›ƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (ABI ๋ฌธ์„œ์—์„œ) UB์™€ ๋น„ UB๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก 3) #[repr(Rust)] ๊ณต์šฉ์ฒด ๋ ˆ์ด์•„์›ƒ์ด ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” UB๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•„๋‹Œ์ง€ ๋งํ•  ์ˆ˜ ์—†์ง€๋งŒ WE (rustc / libstd + their ํ…Œ์ŠคํŠธ)์ด ์‹ ์„ฑํ•œ ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ€๊ณผ ์™•๊ฒจ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋น„ UB ๋ฐฉ์‹์œผ๋กœ #[repr(Rust)] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4) ํฌ๊ธฐ / ์ŠคํŠธ๋ผ์ด๋“œ ๋ฐ ํ•„๋“œ ์žฌ์ •๋ ฌ ์งˆ๋ฌธ์ด ๊ฒฐ์ •๋œ ํ›„ ๊ตฌ์กฐ์ฒด ๋ฐ ๊ณต์šฉ์ฒด ๋ ˆ์ด์•„์›ƒ์ด ๋Œ๋กœ ์„ค์ •๋˜๊ณ  ์ง€์ • ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” ๋ ˆ์ด์•„์›ƒ๋„ ์•Œ๊ณ  #[repr(Rust)] ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #[repr(C)] ๋งŒํผ ์ž์œ ๋กญ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@nikomatsakis ์œ ๋‹ˆ์˜จ RFC์— ๋Œ€ํ•œ ๋…ผ์˜์—์„œ ์‚ฌ๋žŒ๋“ค์€ ์œ ๋‹ˆ์˜จ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒฉํŠธ ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ Rust ์ฝ”๋“œ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

#[repr(C)] ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด #[repr(Rust)] ๋Œ€ํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ณด์ฆ๋„ ์ œ๊ณต ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "here be dragons"๋กœ ๋‘์‹ญ์‹œ์˜ค. ์•„๋งˆ๋„ #[repr(C)] ๊ฐ€ ์•„๋‹Œ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๊ณ ๋˜๋Š” lint๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

@ retep998 repr(Rust) ๊ฐ€ ํŠน์ • ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ๊ฒน์นจ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ repr(Rust) ์ด ์‹ค์ œ๋กœ ๋…ธ๋™ ์กฐํ•ฉ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๊ฐ€์ •์„ ๊นจ์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค ( "๊ฐ€์žฅ ํฐ ๊ตฌ์„ฑ์›๋ณด๋‹ค ํฌ์ง€ ์•Š์Œ").

Rust๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ํŠธ๋žฉ ๋น„ํ™œ์„ฑํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ์œ ํšจํ•œ ์งˆ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ์„ , ์˜ตํ‹ฐ ๋งˆ์ด์ € ์ž์ฒด๋Š” ํŠธ๋žฉ ํ‘œํ˜„์˜ UB-ness์— ์˜์กดํ•˜๊ณ  ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Rust๋Š” ์‹ค์ œ๋กœ FP ํ™˜๊ฒฝ ๋ณ€๊ฒฝ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ํ’‹๊ฑด์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, ๋˜ํ•œ ๊ทธ๋Ÿฌํ•œ ์žฌํ˜„ ์ค‘ ํ•˜๋‚˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•ผ์ƒ์—์„œ ๊ทธ๊ฒƒ์— ์˜์กด ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์—ด๊ฑฐ ํ˜•์ด ๋‹ค๋ฅธ ํ•„๋“œ์—์„œ ์ž…์ฆ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ์„ ๋•Œ ํ•„๋“œ์—์„œ ์ฝ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•˜๋Š” ๋ฆฐํŠธ ๋˜๋Š” ์ผ๋ถ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์ด ๊ธฐ๋Šฅ์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค ยน. MIR ๊ธฐ๋ฐ˜ ๋ฆฐํŠธ๋Š” ์งง์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. CFG๊ฐ€ ํ†ตํ•ฉ ํ•„๋“œ๋กœ๋“œ์˜ ํ•ฉ๋ฒ•์„ฑ์— ๋Œ€ํ•œ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜๋ฅผํ•˜๋Š” ๊ฒฝ์šฐ, ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์€ Rust repr ์ž์ฒด IMO๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ง€์ •ํ•  ์ˆ˜์žˆ๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ยน : ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ์ด์œ ๋กœ ๋…ธ์กฐ๋ฅผ ๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ์˜ ๋ณ€ํ™˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ํŠนํžˆ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

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

๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, repr(Rust) ์„ ์ผ๋ถ€ ์•„ํ‚คํ…์ฒ˜์˜ ๊ธฐ๊ณ„์–ด ํฌ๊ธฐ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ •ํ™” ์ „์— ๊ณ ๋ คํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” https://github.com/rust-lang/rust/issues/37479์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ LLDB ๋””๋ฒ„๊น… ๊ณต์šฉ์ฒด๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alexcrichton GDB์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. Linux ๋ด‡์ด ํ…Œ์ŠคํŠธ๋ฅผ ์ž˜ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

1.17์ฃผ๊ธฐ (3 ์›” 16 ์ผ ๋ฒ ํƒ€) ๋™์•ˆ์ด ๊ธฐ๋Šฅ์„ FCP์— ์ ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์šฐ๋ฆฌ๊ฐ€ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ๊ณผ ๊ธฐ๋Šฅ์˜ ํ˜„์žฌ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์š”์•ฝ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”.
๋‚ด ๊ณ„ํš์€

  • ๋‹ค๊ฐ€์˜ค๋Š” ๋ฆด๋ฆฌ์Šค (2 ์›” 3 ์ผ)๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.
  • Copy ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ณต์šฉ์ฒด์˜ ์•ˆ์ •ํ™”๋ฅผ ์ œ์•ˆํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋ชจ๋“  FFI ์š”๊ตฌ๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค-FFI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” stable์—์„œ ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "POD"๊ณต์šฉ์ฒด๋Š” C / C ++์—์„œ ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ž˜ ์ดํ•ด๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๋ชจ๋“ˆ๋กœ ์œ ํ˜• ๊ธฐ๋ฐ˜ ์•จ๋ฆฌ์–ด์‹ฑ์ด์ง€๋งŒ Rust์—๋Š” ์—†์Šต๋‹ˆ๋‹ค). ์•Œ๋ ค์ง„ ์ฐจ๋‹จ๊ธฐ๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • 2 ์›” 3 ์ผ๊นŒ์ง€ "Unions 1.2"RFC๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ํ˜„์žฌ ํ†ตํ•ฉ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ํ–ฅํ›„ ๋ฐฉํ–ฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋น„ Copy ํ•„๋“œ๊ฐ€์žˆ๋Š” ์œ ๋‹ˆ์˜จ์˜ ๋ฏธ๋ž˜๋Š”์ด RFC๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ManuallyDrop ๋˜๋Š” NoDrop ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋…ธ์ถœํ•˜๋Š” ๋ฐ๋Š” ํ†ตํ•ฉ ์•ˆ์ •ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ์—…๋ฐ์ดํŠธ (2 ์›” 4 ์ผ) : RFC๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์ง€๋งŒ, ํ‰์†Œ์™€ ๊ฐ™์ด ๊ฐ ๋ฌธ์žฅ ๋’ค์— ์ž‘๊ฐ€ ๋ธ”๋ก์ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฒˆ ์ฃผ๋ง์ด ์•„๋‹Œ ๋‹ค์Œ ์ฃผ๋ง (2 ์›” 11-12 ์ผ)์— ์™„๋ฃŒ ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (2 ์›” 4 ์ผ ~ 5 ์ผ).
์ƒํƒœ ์—…๋ฐ์ดํŠธ (2 ์›” 11 ์ผ) : ํ…์ŠคํŠธ๊ฐ€ 95 % ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์ผ ์ œ์ถœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@petrochenkov ๋Š” ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ํ–‰๋™ ๊ณผ์ •์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@petrochenkov ์ €์—๊ฒŒ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ท€ํ•˜์˜ ๋…ธ์กฐ 1.2 ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜์—๊ฒŒ ์ข‹์•„ ๋ณด์ธ๋‹ค.

@joshtriplett ์ €๋Š” @ rust-lang / lang ํšŒ์˜์—์„œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๋™์•ˆ ์‹ค์ œ๋กœ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ ์š”์ ์— ๋Œ€ํ•ด ๊ธ์ •์  ์ธ ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. (์ฆ‰, ์ด์ƒ์ ์œผ๋กœ @rfcbot ์‚ฌ์šฉ). ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋šœ๋ ทํ•œ ๋ฌธ์ œ (๋˜๋Š” RFC ์ˆ˜์ •)๋ฅผ ์•”์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋•Œ๊นŒ์ง€๋Š” ๊ณต๊ฐœ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ํ™•์‹คํžˆ "์ •์ฐฉ"ํ•œ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋งฅ๋ฝ์—์„œ ๊ด€๋ จ ๋Œ€ํ™”๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ˆ˜์ • RFC ๋˜๋Š” ์—ฌ๊ธฐ์—์„œ ๋งํฌ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ๋กœ ์š”์•ฝํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ํŽ˜์ด์ง€์— ์žˆ๊ณ  ๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ํ•  ์ˆ˜์žˆ๋Š” ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ›Œ๋ฅญํ•œ ๋‹จ๊ณ„ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. , ๋ฌผ๋ก  @ rust-lang / lang ํšŒ์›์ด๋‚˜ ๋ชฉ์ž๋“ค๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ "Unions 1.2"RFC- https ://github.com/rust-lang/rfcs/pull/1897์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค

์ด์ œ ๋‚˜๋Š” ์กฐํ•ฉ์˜ ๋ณด์ˆ˜์  ์ธ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ์•ˆ์ •ํ™”๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค-์กฐํ•ฉ์˜ ๋ชจ๋“  ํ•„๋“œ๋Š” Copy ์ด์–ด์•ผํ•˜๊ณ , ํ•„๋“œ์˜ ์ˆ˜๋Š” 0์ด ์•„๋‹ˆ์–ด์•ผํ•˜๋ฉฐ, ์กฐํ•ฉ์€ Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. .
(๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์ง€๋ง‰ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ณต์šฉ์ฒด๋ฅผ ๊ตฌ์กฐ์ฒด๋กœ ๋ž˜ํ•‘ํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด Drop ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์šฐํšŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)
์ด๋Ÿฌํ•œ ๊ณต์šฉ์ฒด๋Š”์ด ์–ธ์–ด ๊ธฐ๋Šฅ์˜ ์ฃผ์š” ์†Œ๋น„์ž๋กœ ๊ฐ„์ฃผ๋˜๋Š” FFI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

"Unions 1.2"RFC์˜ ํ…์ŠคํŠธ๋Š” ์œ ํ˜• punning์ด ํ—ˆ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œ ์ ์œผ๋กœ ํ™•์ธํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” FFI ์Šคํƒ€์ผ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘ : "Unions 1.2"RFC๋Š” ๋˜ํ•œ ์‚ฌ์†Œํ•˜๊ฒŒ ํŒŒ๊ดด ๊ฐ€๋Šฅํ•œ Copy ํ•„๋“œ์— ์•ˆ์ „ํ•˜๊ฒŒ ํ• ๋‹น ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (https://github.com/rust-lang/rust/issues/32836#issuecomment-281296416, https ์ฐธ์กฐ). : //github.com/rust-lang/rust/issues/32836#issuecomment-281748451), ์ด๋Š” FFI ์Šคํƒ€์ผ ๊ณต์šฉ์ฒด์—๋„ ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.

์ด ํ…์ŠคํŠธ๋Š” ์•ˆ์ •ํ™”์— ํ•„์š”ํ•œ ๋ฌธ์„œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
"๊ฐœ์š”"์„น์…˜์€ ์ฑ…์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์ฐธ์กฐ์— "์ƒ์„ธ ๋””์ž์ธ"์„ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ping @nikomatsakis

์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ •๋ง๋กœ ์–ธ์–ด์˜ ์ผ๋ถ€๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•ฝ๊ฐ„์˜ unsafe ๋ฐ ptr::write() ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋™ ์กฐํ•ฉ ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์•ฝ 20 ๋ถ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

use std::mem;
use std::ptr;


/// A union of `f64`, `bool`, and `i32`.
#[derive(Default, Clone, PartialEq, Debug)]
struct Union {
    data: [u8; 8],
}

impl Union {
    pub unsafe fn get<T>(&self) -> &T {
        &*(&self.data as *const _ as *const T)
    }

    pub unsafe fn set<T>(&mut self, value: T) {
        // "transmute" our pointer to self.data into a &mut T so we can 
        // use ptr::write()
        let data_ptr: &mut T = &mut *(&mut self.data as *mut _ as *mut T);
        ptr::write(data_ptr, value);
    }
}


fn main() {
    let mut u = Union::default();
    println!("data: {0:?} ({0:#p})", &u.data);
    {
        let as_i32: &i32 = unsafe { u.get() };
        println!("as i32: {0:?} ({0:#p})", as_i32);
    }

    unsafe {
        u.set::<f64>(3.14);
    }

    println!("As an f64: {:?}", unsafe { u.get::<f64>() });
}

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

๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

union! { Foo(u64, Vec<u8>, String) };

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

@ Michael-F-Bryan ์•„์ง size_of ์ƒ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@ Michael-F-Bryan [u8] ๋ฐฐ์—ด์„ ๊ฐ–๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ์ •๋ ฌ ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ด๋ฏธ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์šฉ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ์ƒ์ˆ˜ size_of ๋ฐ align_of ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์˜ฌ๋ฐ”๋ฅธ ๊ณต๊ฐ„์„ ์ˆ˜๋™์œผ๋กœ ํ• ๋‹นํ•ด์•ผํ•˜๋ฉฐ ์„ ์–ธ์  ๋งคํฌ๋กœ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ident ์—ฐ๊ฒฐ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— I ๊ฒŒํ„ฐ์™€ ์„ธํ„ฐ ๋ชจ๋‘์— ๋Œ€ํ•œ ์ด๋ฆ„์„ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ์ง‘ํ•ฉ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ๋„ ์ง€๊ธˆ์€ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ ๋‹ค์Œ ๊ฐ’์„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ณ€ํ˜•์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋กœ์„œ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค (๋˜๋Š” ์ •์˜์—์„œ ํ›จ์”ฌ ๋” ์ž์„ธํ•œ ์กฐํ•ฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ). ๋…ธ์กฐ์˜). ์ „์ฒด์ ์œผ๋กœ ๋…ธ๋™ ์กฐํ•ฉ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…๊ณผ ์˜ค๋ฅ˜ ๋ฐ ์ถ”์•…ํ•œ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก RFC์™€ ๊ด€๋ จ ํ† ๋ก ์„ ์ฝ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •๋ ฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ด์ œ syn ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ ident ์—ฐ๊ฒฐ์ด ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ ๋œ AST์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ Ident๋ฅผ ๊ฐ€์ ธ Ident ๊ตฌํ˜„ AsRef<str> )์„ ์ถ”์ถœํ•œ ๋‹ค์Œ ์ƒˆ Ident ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Ident::From<String>() ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜์„ ์—ฐ๊ฒฐ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RFC๋Š” ๊ธฐ์กด ๋งคํฌ๋กœ ๊ตฌํ˜„์ด ์‚ฌ์šฉํ•˜๊ธฐ ์–ผ๋งˆ๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์šด ์ง€์— ๋Œ€ํ•ด ๋งŽ์ด ์–ธ๊ธ‰ํ•˜์ง€๋งŒ, ์ตœ๊ทผ syn ๋ฐ quote ์™€ ๊ฐ™์€ ์ƒ์ž๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด์„œ ์ด์ œ๋Š” proc ๋งคํฌ๋กœ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฒด ๊ณตํ•™์„ ๊ฐœ์„ ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ๋‹ˆ์˜จ์˜ ๋‚ด๋ถ€ ๋ฒ„ํผ๊ฐ€ 0 ์ธ MyUnion::default() ์™€ fn MyUnion::new<T>(value:T) -> MyUnion ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. T ์—๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์œผ๋กœ ๋งŒ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ํŠน์„ฑ ๊ฒฝ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .

์ •๋ ฌ ๋ฐ ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ : std :: mem :: align_of () ๋ฐ ์นœ๊ตฌ)์˜ mem ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋งคํฌ๋กœ ํ™•์žฅ ์‹œ๊ฐ„์— ํ•„์š”ํ•œ ํฌ๊ธฐ์™€ ์ •๋ ฌ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋‹ฌ๋ ค ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 99.9 %์˜ ์กฐํ•ฉ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์–ด์จŒ๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์œ ํ˜•์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์œ ํ˜•์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ ์™€์„œ ์ •๋ ฌ ๋˜๋Š” ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ).

๋‚˜๋Š” ์ธ์ •ํ•œ๋‹ค. ๋‚ด์žฅ ๋œ ํŒจํ„ด ๋งค์นญ์€ ๋งค์šฐ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ FFI์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์œ ๋‹ˆ์˜จ์€ ์–ด์จŒ๋“  ์–‡์€ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋กœ ๋ž˜ํ•‘ ๋  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ช‡ ๊ฐœ์˜ if / else ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ ๋ฐ ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ : std :: mem :: align_of () ๋ฐ ์นœ๊ตฌ)์˜ mem ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํฌ๋กœ์Šค ์ปดํŒŒ์ผ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ Michael-F-Bryan์ด ๋ชจ๋“  ํ† ๋ก ๊ณผ ๋” ๋งŽ์€ ๋‚ด์šฉ์ด https://github.com/rust-lang/rfcs/pull/1444 ์˜ ์—ญ์‚ฌ์—์„œ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๊ด€์‹ฌ์‚ฌ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์š”์•ฝํ•˜๋ ค๋ฉด ์ด๋ฏธ ์–ธ๊ธ‰ ํ•œ ๊ฒƒ ์™ธ์—๋„ ๋ชจ๋“  ๋Œ€์ƒ ํ”Œ๋žซํผ / ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŒจ๋”ฉ ๋ฐ ์ •๋ ฌ ๊ทœ์น™์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๊ณ  FFI ์ฝ”๋“œ ์ „์ฒด์—์„œ ์–ด์ƒ‰ํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ( @ retep998 ์ด ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ ํ•œ ์ž‘์—…). Windows ๋ฐ”์ธ๋”ฉ์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉ๋˜๋ฉฐ ์–ด์ƒ‰ํ•จ์„ ๋ณด์ฆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋˜ํ•œ proc ๋งคํฌ๋กœ๋Š” ํ˜„์žฌ ํŒŒ์ƒ ์šฉ์œผ๋กœ ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ๊ตฌ๋ฌธ์„ ํ™•์žฅ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ:

์กฐํ•ฉ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์˜ 99.9 %๋Š” ์–ด์จŒ๋“  ์›์‹œ ์œ ํ˜•์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ „ํ˜€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. C ์ฝ”๋“œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ณต์šฉ์ฒด ํ•„๋“œ๊ฐ€ โ€‹โ€‹์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ์กฐ ์œ ํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋œ "๊ตฌ์กฐ์ฒด์˜ ๊ณต์šฉ์ฒด ๊ตฌ์กฐ"ํŒจํ„ด์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์„์˜ '@petrochenkov ๋‹น @rfcbot์˜ FCP ๋ณ‘ํ•ฉ https://github.com/rust-lang/rust/issues/32836#issuecomment -279256434

์ถ”๊ฐ€ ํ•  ํ•ญ๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ด‡๋งŒ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

@withoutboats ํŒ€์›์ด ์ด๊ฒƒ์„ ๋ณ‘ํ•ฉ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์˜ ๊ฒ€ํ† ์ž…๋‹ˆ๋‹ค.

  • [x] @aturon
  • [x] @eddyb
  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @pnkfelix
  • [x] @withoutboats

ํ˜„์žฌ ๋‚˜์—ด๋œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒ€ํ† ์ž๊ฐ€ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๋ฉด ์ตœ์ข… ์˜๊ฒฌ ๊ธฐ๊ฐ„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์•„์ง ์ œ๊ธฐ๋˜์ง€ ์•Š์€ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

ํƒœ๊ทธ ๋œ ํŒ€์›์ด ๋‚˜์—๊ฒŒ ์ค„ ์ˆ˜์žˆ๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

PSA : FFI ์Šคํƒ€์ผ ๊ณต์šฉ์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ "Unions 1.2"RFC๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ ํ• ๋‹น์„ "๋ฏธ๋ž˜ ๋ฐฉํ–ฅ"์—์„œ ์ ์ ˆํ•œ RFC๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํŒŒ๊ดด ํ•  ์ˆ˜์žˆ๋Š” ๊ณต์šฉ์ฒด ํ•„๋“œ๋กœ ์ด๋™ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

union.trivially_destructible_field = 10; // safe

์™œ:

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

@petrochenkov "์‚ฌ์†Œํ•˜๊ฒŒ ํŒŒ๊ดด ๊ฐ€๋Šฅํ•œ ์œ ๋‹ˆ์˜จ ํ•„๋“œ"๋˜๋Š” "์™„์ „ํžˆ ์‚ฌ์†Œํ•˜๊ฒŒ ํŒŒ๊ดด ๊ฐ€๋Šฅํ•œ ํ•„๋“œ๊ฐ€์žˆ๋Š” ์œ ๋‹ˆ์˜จ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ–‰๋™์ด ํ•ด์„์„ ์„ ํƒํ•˜๋Š” ์ฝ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋„๋ก ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, enum ๋ฐ ๊ธฐํƒ€ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ณต์šฉ์ฒด๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๊ณต์šฉ์ฒด ๊ฐ’์— ์œ ํšจํ•˜์ง€ ์•Š์€ ํŒ๋ณ„์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‚˜๋Š” ๊ทธ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ์•ˆ์ •ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ดœ์ฐฎ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ์ด Unions 1.2 RFC์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ์„ ์•„์ง ์ฝ์„ ์‹œ๊ฐ„์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค! ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ•„๋“œ์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•œ "์ตœ์†Œํ•œ"๊ฐœ๋… (ํฌ์ธํ„ฐ ์ฐธ์กฐ๋ฅผ ์—ญ ์ฐธ์กฐ)์„ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ ์šฐ๋ฆฌ์˜ ๋…ธ๋ ฅ์ด ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ์ด์ผœ ๋ณด๋ฉด ์šฐ๋ฆฌ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ (์˜ˆ : ๋งŽ์€ ์บ์ŠคํŠธ)์„ ๋” ๋งŽ์ด ์„ ์–ธํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. LLVM๊ณผ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ง€์นจ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ง„์ „๊ณผ ํ•จ๊ป˜ unsafe ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ฒ ํšŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.
"์‚ฌ์†Œํ•˜๊ฒŒ ํŒŒ๊ดด ํ•  ์ˆ˜์žˆ๋Š” ํ•„๋“œ"๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ–‰๋™์ด ํ•ด์„์„ ์„ ํƒํ•˜๋Š” ์ฝ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋„๋ก ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ. ์“ฐ๊ธฐ๋งŒ์œผ๋กœ๋Š” ํ›„์† ์ฝ๊ธฐ ์—†์ด๋Š” ์œ„ํ—˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:

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

์˜ค.
์•ˆ์ „ํ•œ ์“ฐ๊ธฐ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@nrc
๊ธ€์Ž„, ํ•˜์œ„ ์ง‘ํ•ฉ์€ "FFI ๊ณต์šฉ์ฒด", "C ๊ณต์šฉ์ฒด"๋˜๋Š” "C ++ 11 ์ด์ „ ๊ณต์šฉ์ฒด"์™€ ๊ฐ™์€ ๋‹ค์†Œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค. ์ €์˜ ์ดˆ๊ธฐ ๋ชฉํ‘œ๋Š”์ด ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์•ˆ์ •ํ™”ํ•˜์—ฌ winapi ์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋จธ์ง€ ํ•˜์œ„ ์ง‘ํ•ฉ๊ณผ ๊ทธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ๋ชจํ˜ธํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ "Unions 1.2"RFC ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋ถˆ๋ถ„๋ช… ํ•œ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์˜ ๊ธฐ๋Œ€๋Š” ์ดˆ๊ธฐ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์„ ์•ˆ์ •ํ™” ํ•œ ํ›„ 1, 2 ๋˜๋Š” 3 ์ฃผ๊ธฐ๋กœ ๋‚˜๋จธ์ง€ ๋ถ€ํ’ˆ์„ ์•ˆ์ •ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ ํ˜„์žฅ ํ• ๋‹น์— ๋Œ€ํ•œ ๊ถ๊ทน์  ์ธ ์ฃผ์žฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•„๋“œ ํ• ๋‹น

unsafe {
    u.trivially_destructible_field = value;
}

์•ˆ์ „ํ•œ ์™„์ „ ์กฐํ•ฉ ํ• ๋‹น๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

u = U { trivially_destructible_field: value };

์•ˆ์ „ ๋ฒ„์ „์€ ์—ญ์„ค์ ์œผ๋กœ ๋œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. trivially_destructible_field ์™ธ๋ถ€์—์žˆ๋Š” u ์˜ ๋ฐ”์ดํŠธ๋ฅผ undefs๋กœ ๋ฎ์–ด ์“ฐ๋Š” ๋ฐ˜๋ฉด ํ•„๋“œ ํ• ๋‹น์€ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@petrochenkov ๊ทธ ๊ทน๋‹จ์€ size_of_val(&value) == 0 .

๋‘ ์Šค ๋‹ˆํŽซ ๊ฐ„์˜ ๋™๋“ฑ์„ฑ์€ ํ•ด๋‹น ํ•„๋“œ๊ฐ€
"์‚ฌ์†Œํ•œ ํŒŒ๊ดด ๊ฐ€๋Šฅ", ์•„๋‹ˆ?

๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ์•ˆ์ „ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋งŒ ์ด๋Ÿฌํ•œ ๊ณผ์ œ๋ฅผ
๋‚˜์—๊ฒŒ๋Š” ๋งค์šฐ ์ผ๊ด€์„ฑ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

2017 ๋…„ 2 ์›” 22 ์ผ 14:50, "Vadim Petrochenkov" [email protected]
์ผ๋‹ค :

์•ˆ์ „ํ•œ ํ˜„์žฅ ํ• ๋‹น์— ๋Œ€ํ•œ ๊ถ๊ทน์  ์ธ ์ฃผ์žฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•„๋“œ ํ• ๋‹น

์•ˆ์ „ํ•˜์ง€ ์•Š์€ {
u.trivially_destructible_field = ๊ฐ’;
}

์•ˆ์ „ํ•œ ์™„์ „ ์กฐํ•ฉ ํ• ๋‹น๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

u = U {trivially_destructible_field : ๊ฐ’};

์•ˆ์ „ ๋ฒ„์ „์€ ์—ญ์„ค์ ์œผ๋กœ ๋œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
undefs๋กœ trivially_destructible_field ์™ธ๋ถ€์˜ u์˜ ๋ฐ”์ดํŠธ๋ฅผ ๋ฎ์–ด ์”๋‹ˆ๋‹ค.
ํ•„๋“œ ํ• ๋‹น์€ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ณด์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/32836#issuecomment-281660298 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AApc0lUOXLU5xNTfM5PEfEz9nutMZhXUks5rfC8UgaJpZM4IDXsj
.

@eddyb

๊ทธ ๊ทน๋‹จ์€ size_of_val (& value) == 0, ๋งž์ฃ ?

๋„ค.

๋‚˜๊ธฐ์‚ฌ
์˜คํƒ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ถ”๊ฐ€ ๊ทœ์น™ ํ•˜๋‚˜๊ฐ€ ์™œ ๊ทน๋„๋กœ ์ผ๊ด€์„ฑ์ด ์—†๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. "์ผ๋ถ€ ์‚ฌ๋ก€ ๋งŒ"์€ ํŠนํžˆ ๋ชจ๋“  FFI ์กฐํ•ฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” "๋งค์šฐ ์ผ๊ด€์„ฑ์ด์—†๋Š”"๊ฒƒ์€ ํฐ ๊ณผ๋Œ€ ํ‰๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. " mut ๋ณ€์ˆ˜ ๋งŒ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋”์ฐํ•œ ๋ถˆ์ผ์น˜!"๋งŒํผ ํฌ์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ์ด ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@petrochenkov ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

// Somebody Somewhere in some crate (v 1.0.0)
struct Peach; // trivially destructible
union Banana { pub actually: Peach }

// Somebody Else in their dependent crate
extern some crate;
fn somefn(banana: &mut Banana) {
    banana.actually = Peach;
}

์ด์ œ ํŠน์„ฑ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฏ€๋กœ Somebody Somewhere ์”จ๋Š” ๋‹ค์Œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

impl Drop for Peach { fn drop(&mut self) { println!("Moi Peach!") }

1.1.0 (1.0.0 AFAIK์™€ ํ˜ธํ™˜๋˜๋Š” semver) ๋ฒ„์ „์˜ ์ƒ์ž๋ฅผ ์ถœ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ฐ‘์ž๊ธฐ Mr. Somebody Else์˜ ์ƒ์ž๊ฐ€ ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

fn somefn(banana: &mut Banana) {
    banana.actually = Peach; // ERROR: Something somethingโ€ฆ unsafe assingmentโ€ฆ somewhat somewhat trivially indestructibleโ€ฆ 
}

๋”ฐ๋ผ์„œ ๋•Œ๋กœ๋Š” ํ†ตํ•ฉ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ํ• ๋‹น์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด mut ์ง€์—ญ ์ฃผ๋ฏผ ๋งŒ ๋ณ€ํ˜• ๊ฐ€๋Šฅํ•˜๊ฒŒ๋˜๋Š” ๊ฒƒ๋งŒ ํผ ์‚ฌ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์ด ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์†”์งํžˆ ์–ด๋–ค ์ž…์žฅ์„ ์ทจํ•ด์•ผํ• ์ง€ ํ™•์‹  ์ด

๋‚˜๊ธฐ์‚ฌ
์ด๊ฒƒ์€ ์ข‹์€ ์ฃผ์žฅ์ด๋ฉฐ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ผ๊ด€์„ฑ๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋ถ€์ •์ ์ธ ์ถ”๋ก ์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค. ์ฆ‰, "trivially-destructible"== "๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ Drop ๋ฅผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์–‘์˜ ๊ทผ์‚ฌ๊ฐ’์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ-" Copy ๊ตฌํ˜„ ".
Copy ์œ ํ˜•์€ Copy ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌํ˜„์„ ์ทจ์†Œ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, Copy ์œ ํ˜•์€ ํŠนํžˆ FFI ๊ณต์šฉ์ฒด์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์—ฌ์ „ํžˆ ๋Œ€๋ถ€๋ถ„์˜ "์‚ฌ์†Œํ•œ ํŒŒ๊ดด ๊ฐ€๋Šฅ"์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Drop ๊ตฌํ˜„์€ ์ด๋ฏธ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

// Somebody Somewhere in some crate (v 1.0.0)
struct Apple; // trivially destructible
struct Pineapple { pub actually: Apple }

// Somebody Else in their dependent crate
extern some crate;
fn pineapple_to_apple(pineapple: Pineapple) -> Apple {
    pineapple.actually
}
// some crate v 1.1.0
impl Drop for Pineapple { fn drop(&mut self) { println!("Moi Pineapple!") }
fn pineapple_to_apple(pineapple: Pineapple) -> Apple {
    pineapple.actually // ERROR: can't move out of Pineapple
}

์ฐจ๋ก€๋กœ Drop์„ ๊ตฌํ˜„ํ•˜๋ฉด ์•”์‹œ ์  ๋ณต์‚ฌ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณต์‚ฌ
์˜์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2017 ๋…„ 2 ์›” 22 ์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 10์‹œ 11 ๋ถ„์— jethrogb [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Drop ๊ตฌํ˜„์€ ์ด๋ฏธ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ
์œ ๋‹ˆ์˜จ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

// Somebody Somewhere in some Crate (v 1.0.0)
struct Apple; // ์‚ฌ์†Œํ•˜๊ฒŒ ํŒŒ๊ดด ๊ฐ€๋Šฅ
struct Pineapple {์‹ค์ œ๋กœ pub : Apple}

// ์ข…์† ์ƒ์ž์—์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ
์ƒ์ž๋ฅผ ๊บผ๋‚ด์‹ญ์‹œ์˜ค.
fn pineapple_to_apple (ํŒŒ์ธ์• ํ”Œ : ํŒŒ์ธ์• ํ”Œ)-> Apple {
ํŒŒ์ธ์• ํ”Œ. ์‹ค์ œ๋กœ
}

// ์ผ๋ถ€ ์ƒ์ž v 1.1.0
impl Drop for Pineapple {fn drop (& mut self) {println! ( "Moi Pineapple!")}

fn pineapple_to_apple (ํŒŒ์ธ์• ํ”Œ : ํŒŒ์ธ์• ํ”Œ)-> Apple {
banana.actually // ์˜ค๋ฅ˜ : ํŒŒ์ธ์• ํ”Œ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
}

โ€”
์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/32836#issuecomment-281752949 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABxXhgbFgRNzYOsU4c6Gu1KFfwdjDHn3ks5rfHpYgaJpZM4IDXsj
.

๋ฟก๋ฟก
์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ํŠน๋ณ„ํ•œ ์ „์ œ ์กฐ๊ฑด์ด ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Drop ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์—๋Š” ๊ณต์šฉ ํ•„๋“œ๊ฐ€ ์žˆ์–ด์•ผํ•˜๊ณ  ํ•ด๋‹น ํ•„๋“œ๋Š” Copy ์ด์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ์ผ€์ด์Šค๋Š” ๋ชจ๋“  ๊ตฌ์กฐ์ฒด์— ๋ฌด์กฐ๊ฑด ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

@petrochenkov ๋‚˜๋Š” ์•„๋งˆ๋„ ๋…ธ๋™ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ์ฃผ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :)

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

๋ฟก ๋นต๋€จ
๋‚ด๊ฐ€ ๊ฐ€์ • ํ•œ ๊ฒƒ์€์ด ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด #[feature(untagged_unions)] ์š”๊ตฌ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋‹ค๋ฅธ ๊ด€๋ฃŒ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
FFI ์Šคํƒ€์ผ์˜ ์กฐํ•ฉ์€ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์กฐํ•ฉ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์•ˆ์ •ํ™” ์ง์ „์— ๋ณด์žฅ ๋œ ํŒŒ์†์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ •๋ ฌ ๋ฐ ํŒจํ‚น ์†์„ฑ์ด ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— (์•ˆ์ •ํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ) ์•„์ง ์•ˆ์ •ํ™” ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก
ํฌ์žฅ? #[repr(packed)] ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ align(>1) ์†์„ฑ๊ณผ ๋‹ฌ๋ฆฌ ํ˜„์žฌ ์œ ๋‹ˆ์˜จ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

@petrochenkov #[repr(packed(N))] . winapi์—์„œ๋Š” 1 ์ด์™ธ์˜ ํŒจํ‚น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ์œ ๋‹ˆ์˜จ์—์„œ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์ง€์›ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋™์‹œ์— ๋ชจ๋“  ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋ฉด, ์ตœ์†Œ Rust ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฉ”์ด์ € ๋ฒ„์ „์œผ๋กœ ์ ํ”„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํ”Œ๋ ˆ์ด ์ƒํƒœ๋ฅผ ์•ฝ๊ฐ„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด :

ํ˜„์žฌ FCP ์ œ์•ˆ์€ ์ˆœ์ˆ˜ํ•œ Copy ๊ณต์šฉ์ฒด๋งŒ์„์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ๊ธฐ๋ณธ์ ์œผ๋กœ "์šฐ๋ฆฌ๊ฐ€ ์•ˆ์ •๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?"๋ผ๋Š” ์งˆ๋ฌธ ์™ธ์—๋Š” ๋ณ„๋‹ค๋ฅธ ์งˆ๋ฌธ์ด์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. FCP์— ๋Œ€ํ•œ ๋™์˜ ์ดํ›„ ๋…ผ์˜๋Š” ๋ชจ๋‘ @petrochenkov ์˜ ์ƒˆ๋กœ์šด RFC์— ๊ด€ํ•œ ๊ฒƒ์ด

@nrc ๋ฐ @nikomatsakis , IRC์— ๋Œ€ํ•œ ํ† ๋ก ์—์„œ, ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ์ƒ์ž๋ฅผ ์ฒดํฌ ํ•  ์ค€๋น„๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋งก๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;-)

: bell : ์ง€๊ธˆ์€ ์œ„ ์˜ ์— ๋”ฐ๋ผ ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค . :๋ฒจ:

์•ˆ๋…•ํ•˜์„ธ์š”.
์ตœ๊ทผ์— ๋– ์˜ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (https://internals.rust-lang.org/t/automatic-marker-trait-for-unconditionally-valid-repr-c-types/5054)

๋…ธ์กฐ๋ฅผ ์—ผ๋‘์—๋‘๊ณ  ์ œ์•ˆ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์„ค๋ช… ๋œ Plain ํŠน์„ฑ (์ž์ „๊ฑฐ ํ˜๋ฆผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)์€ Plain ์œ ํ˜•์œผ๋กœ ๋งŒ ๊ตฌ์„ฑ๋œ ๋ชจ๋“  ๋…ธ์กฐ๋ฅผ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ _any_ ๋น„ํŠธ ํŒจํ„ด์ด ๋˜‘๊ฐ™์ด ์œ ํšจํ•˜๋‹ค๋Š” ์†์„ฑ์„ ์ฝ”๋“œํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๋กœํ™”ํ•˜์—ฌ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ๊ธฐ๊ฐ€ UB๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†๋„๋กํ•ฉ๋‹ˆ๋‹ค.

FFI์˜ ๋งฅ๋ฝ์—์„œ ์ •์˜ ๋œ๋Œ€๋กœ Plain ๊ฐ€๋˜๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‚ฌ์šด๋“œ์— ๋Œ€ํ•œ ์‚ฌ์‹ค์ƒ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ฉฐ, ๋น„ Plain ์œ ํ˜•์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๊ณ  ์„ค์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜๊ฒŒ.

๋ช…๋ช… ๋œ ํŠน์„ฑ์˜ ์‹ค์ œ ์กด์žฌ๋Š” ์ œ์ณ๋‘๊ณ ์ด ๊ธฐ๋Šฅ์„ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ํ˜„๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๊ฒฉ์ด์—†๋Š” union ๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๊ณ  unsafe union ๋Š” ์ฝ˜ํ…์ธ  ์š”๊ตฌ ์‚ฌํ•ญ์ด ์™„ํ™”๋˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋” ๋งŽ์€ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฏธ๋ž˜์— ๋‹ค๋ฅธ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธธ์„ ๋ง‰์ง€ ์•Š๊ณ  ์•ˆ์ •ํ™”๋ฅผ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ le-jzr
์ด๊ฒƒ์€ ๋…ธ์กฐ์™€ ์ถฉ๋ถ„ํžˆ ์ง๊ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— Rust๋กœ Plain ๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ์„ ์ถ”์ • ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์—.

@petrochenkov ๋‚˜๋Š” ๋‚ด ์ œ์•ˆ์— ๋Œ€ํ•œ ํ์‡„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋…ธ์กฐ๋ฅผ ์—ฐ๊ธฐ

๋”ฐ๋ผ์„œ ๋‚˜์ค‘์— ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฌด์กฐ๊ฑด ์•ˆ์ „ํ•œ ๋ฒ„์ „์„ ๋„์ž… ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ ์–ธ unsafe union ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์•ˆ์ „ํ•œ ๋ฒ„์ „์ด๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€๋Šฅ์„ฑ์ด ํ˜„์žฌ์™€ ๋ฏธ๋ž˜์˜ ์„ค๊ณ„๋ฅผ ์•Œ๋ฆด ์ˆ˜์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ณณ์€ ์ดˆ๊ธฐํ™”์ž…๋‹ˆ๋‹ค. ๋ฌด์กฐ๊ฑด ์•ˆ์ „ํ•œ ์œ ๋‹ˆ์˜จ์„ ์œ„ํ•ด ์˜ˆ์•ฝ ๋œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŒฌ์ด 0์ด๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ž ์žฌ์  ์ธ UB ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ค„์ด๊ณ  ๊ณต์šฉ์ฒด ์‚ฌ์šฉ์„ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ณ‘ํ•ฉ ํ•  FCP๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 1.19์—์„œ ์ด๊ฒƒ์„ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ @rfcbot ๋ฉ”์‹œ์ง€์— ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ ์†Œ์Šค ์ฝ”๋“œ ). ํ”„๋กœ์„ธ์Šค์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ์ด ๋” ์‰ฝ๊ฒŒ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ 1.19๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ์œ„ํ•œ ๊ฒฝ๋กœ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ์—๊ฒŒ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? cc @joshtriplett

NonZero ์—ด๊ฑฐ ํ˜• ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๊ฐ€ union ํ†ตํ•ด ์ ์šฉ๋˜๋„๋ก ๋ณด์žฅ๋ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, Option<ManuallyDrop<&u32>> ํ‘œํ˜„ ์•ˆ None ๋„ ํฌ์ธํ„ฐ๋กœํ•ฉ๋‹ˆ๋‹ค. Some(ManuallyDrop::new(uninitialized::<[Vec<Foo>; 10]>())).is_some() ๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

https://crates.io/crates/nodrop(https://crates.io/crates/arrayvec ์—์„œ ์‚ฌ์šฉ)์—๋Š”์ด๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ํ•ดํ‚น์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.
์ด๊ฒƒ์€ ํ˜„์žฌ RFC ์—์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๊ตฌํ˜„์—์„œ์ด ํ”„๋กœ๊ทธ๋žจ

#![feature(untagged_unions)]

struct S {
    _a: &'static u8
}
union U {
    _a: &'static u8
}

fn main() {
    use std::mem::size_of;
    println!("struct {}", size_of::<S>());
    println!("optional struct {}", size_of::<Option<S>>());
    println!("union {}", size_of::<U>());
    println!("optional union {}", size_of::<Option<U>>());
}

์ธ์‡„๋ฌผ

struct 8
optional struct 8
union 8
optional union 16

์ฆ‰, ์ตœ์ ํ™”๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
cc https://github.com/rust-lang/rust/issues/36394

์ด๊ฒƒ์€ 1.19๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

@brson

์ด๊ฒƒ์€ 1.19๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์•ˆ์ •ํ™” PR ์ด ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์œ ๋‹ˆ์˜จ์ด ํ˜„์žฌ 1.19๋กœ ์ถœ์‹œ๋จ (์ผ๋ถ€ https://github.com/rust-lang/rust/pull/42068)-์ด ๋ฌธ์ œ์— ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ข…๋ฃŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”.
Copy ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ „์ฒด ์กฐํ•ฉ์˜ ์„ธ๊ณ„๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค!
์ง„ํ–‰ ์ƒํ™ฉ์€ ๋Œ€๋ถ€๋ถ„ ์„ค๋ช… / ๋ฌธ์„œ RFC (https://github.com/rust-lang/rfcs/pull/1897)์—์„œ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

8 ์›” ์ดํ›„ Copy ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์กฐํ•ฉ์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? Unions 1.2 RFC๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (impl ๊ธฐ๊ฐ„์œผ๋กœ ์ธํ•ด ์ถ”์ธกํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?)

๋‹จ์ผ ์œ ํ˜•์˜ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ?Sized ์œ ํ˜•์„ ๊ณต์šฉ์ฒด์— ํ—ˆ์šฉํ•˜๋ฉด https://github.com/rust-lang/rust/issues/47034๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜

```๋…น
์ˆ˜๋™์œผ๋กœ ๊ฒฐํ•ฉ{
๊ฐ’ : T
}

@mikeyhew ์‹ค์ œ๋กœ ์ตœ๋Œ€ ํ•œ ๊ฐ€์ง€ ์œ ํ˜• ๋งŒ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์š”๊ตฌํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

union ์‚ฌ์šฉํ•˜์—ฌ Rust ์ฝ”๋“œ๋ฅผ๋ณด๊ณ  ์žˆ๋Š”๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ [items :: unions] ๋Š” ๋‹ค์Œ ๋งŒ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑ ํ•„๋“œ๋„ ๊ณต์šฉ์ฒด๊ฐ€ ์œ ์ง€ํ•˜๋Š” ํ˜„์žฌ ๊ฐ’๊ณผ ๋ ˆ์ด์•„์›ƒ์ด ์ถฉ๋ถ„ํžˆ ํ˜ธํ™˜๋˜๋Š” ๊ฒฝ์šฐ (๋™์ผํ•œ ๊ตฌ๋ฌธ ์‚ฌ์šฉ) ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ํ•„๋“œ๋ฅผ ์ฝ์œผ๋ฉด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ [items :: unions] ๋‚˜ [type_system :: type_layout] ์—์„œ "๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜"์˜ ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

RFC๋ฅผ ์‚ดํŽด๋ณด๋ฉด "๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜"์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. RFC 1897 : Unions 1.2 (๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์Œ)์—์„œ ์ž‘๋™ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๊ณผ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ์˜ˆ์ œ ๋งŒ ์†์œผ๋กœ โ€‹โ€‹ํ”๋“ค ์—ˆ์Šต๋‹ˆ๋‹ค.

RFC1444 : ์œ ๋‹ˆ์˜จ ์€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•œ ์œ ๋‹ˆ์˜จ์„ ๋ณ€ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๋Ÿด ๋•Œ RFC์—์„œ ์•„๋ฌด ๊ณณ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ด ์–ด๋”˜๊ฐ€์— ๊ธฐ๋ก ๋œ ๋™์ž‘์„ ์ •์˜ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€ (๊ทธ๋ฆฌ๊ณ  ์ •์˜ ๋œ ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€)๋ฅผ ์•Œ๋ ค์ฃผ๋Š” _precise_ ๊ทœ์น™์ž…๋‹ˆ๊นŒ?

@gnzlbg ์ฒซ ๋ฒˆ์งธ ๊ทผ์‚ฌ์น˜ : ํŒจ๋”ฉ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜์—†๊ณ , ์œ ํšจํ•˜์ง€ ์•Š์€ ํŒ๋ณ„์„ ํฌํ•จํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, true ๋˜๋Š” false๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๋ถ€์šธ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  ๊ทธ์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค.

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

์ฒซ ๋ฒˆ์งธ ๊ทผ์‚ฌ๊ฐ’์œผ๋กœ : ํŒจ๋”ฉ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜์—†๊ณ , ์œ ํšจํ•˜์ง€ ์•Š์€ ํŒ๋ณ„์ž๋ฅผ ํฌํ•จํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, true ๋˜๋Š” false๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๋ถ€์šธ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ.

์‹ค์ œ๋กœ ์ตœ๊ทผ์˜ ํ•ฉ์˜๋Š” ์ž„์˜์˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (# 46012).

ํ•œ ๊ฐ€์ง€ ๋” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๊ณต์šฉ์ฒด ๋ณ€ํ˜• ๋ชจ๋‘ #[repr(C)] ์ด๋ฏ€๋กœ ๊ตฌ์กฐ์ฒด ์ธ ๊ฒฝ์šฐ ๋ชจ๋“  ํ•„๋“œ (์žฌ๊ท€ ์ ์œผ๋กœ)๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@Amanieu ๋‚ด๊ฐ€ ์ •์ • ์„œ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทœ์น™์ด ์–ด๋””์—๋„ ์“ฐ์—ฌ ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ stdsimd ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์•ˆ์ •ํ™”ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋ถ€ simd ์œ ํ˜•์œผ๋กœ ์œ ํ˜• punning์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang-nursery/stdsimd/blob/03cb92ddce074a5170ed5e5c5c20e5fa4e4846c3/coresimd/src/x86/test.rs#L17

AFAIK๋Š” ํ•˜๋‚˜์˜ ์œ ๋‹ˆ์˜จ ํ•„๋“œ๋ฅผ ์“ฐ๊ณ  ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ transmute_copy ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋™์ผํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ๋ชจํ˜ธํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋…ธ์กฐ์— ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋งํฌ ํ•œ ํ•จ์ˆ˜๋Š” transmute::<__m128d, [f64; 2]> ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ๋ฒ„์ „์ด ๋” ์ข‹๊ธดํ•˜์ง€๋งŒ ์ ์–ด๋„ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๋ณ€ํ™˜์ด ์ œ๊ฑฐ ๋œ ๊ฒฝ์šฐ : A { a }.b[idx] ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rkruppe ๋‚˜๋Š” ๊ทธ lint๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด clippy ๋ฌธ์ œ๋ฅผ ์ฑ„์› ๋‹ค : https://github.com/rust-lang-nursery/rust-clippy/issues/2361

๋งํฌ ํ•œ ํ•จ์ˆ˜๋Š” transmute๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :: <__ m128d i = "8">

๋‚˜๋Š” ๋‚ด๊ฐ€ ์ฐพ๊ณ ์žˆ๋Š” ๊ทœ์น™์ด ์–ธ์ œ transmute๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•˜๋Š”์ง€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ฐพ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค).

์กฐํ•ฉ์— ๋Œ€ํ•œ ์–ธ์–ด ์ฐธ์กฐ๊ฐ€ "๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜์„ฑ"์„ ์–ธ๊ธ‰ํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๋Œ€์‹  transmute (๋ณ€ํ™˜ ๊ทœ์น™์ด ์•„์ง 100 % ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„) ์ธก๋ฉด์—์„œ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ๋„์›€์ด๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์—. "๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜์„ฑ"์—์„œ "๋ณ€ํ™˜์ด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์œ ํ˜•์ด ๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์œ ํ˜• punning์„ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Œ"์œผ๋กœ์˜ ๋„์•ฝ์€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด transmute [_copy]๋Š” ๊ณต์šฉ์ฒด๋ณด๋‹ค "๋” ์›์‹œ์ "์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค transmute_copy๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํฌ์ธํ„ฐ as ์บ์ŠคํŠธ์™€ ptr::read ์ž…๋‹ˆ๋‹ค. transmute ์ถ”๊ฐ€๋กœ mem::uninitialized (๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ) ๋˜๋Š” MaybeUninitialized (์œ ๋‹ˆ์˜จ) ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ํ•„์š”ํ•˜๋ฉฐ, ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ๋‚ด์žฌ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์ง€๋งŒ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. punning memcpy. ๋‚ด๊ฐ€ transmute์™€ ์—ฐ๊ฒฐ์„ ๊ทธ๋ฆฐ ์ฃผ๋œ ์ด์œ ๋Š” ๊ทธ๊ฒƒ์ด ์˜ค๋ž˜๋˜๊ณ  ์—ญ์‚ฌ์ ์œผ๋กœ ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•์กฐ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ํŠนํžˆ transmute์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋” ๋งŽ์€ ๊ธ€๊ณผ ๋ฏผ์† ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์œ ํšจํ•˜๊ณ  ๋ฌด์—‡์ด ์œ ํšจํ•˜์ง€ ์•Š์€์ง€ (๊ทธ๋ฆฌ๊ณ  ์‚ฌ์–‘์ด ์„ค๋ช… ํ•  ๊ฒƒ)์„ ์ง€์‹œํ•˜๋Š” ์‹ค์ œ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ”์ดํŠธ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์–ด๋–ค ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์–ด๋–ค ์œ ํ˜•์œผ๋กœ ์ฝ์„ UB์ธ์ง€์ž…๋‹ˆ๋‹ค.

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

fn transmute<T, U>(x: T) -> U {
    assert!(size_of::<T>() == size_of::<U>());
    let mut bytes = [0u8; size_of::<U>()];
    ptr::write(bytes.as_mut_ptr() as *mut T, x);
    mem::forget(x);
    ptr::read(bytes.as_ptr() as *const U)
}

transmute์˜ ์œ ์ผํ•œ "๋งˆ๋ฒ•์ ์ธ"๋ถ€๋ถ„์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋™์ผํ•œ ํฌ๊ธฐ

์ฐธ์กฐ ๋ฐ Unions 1.2 RFC๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€ํ™˜ ๊ทœ์น™์ด ์ •ํ•ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์˜๋„์ ์œผ๋กœ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.
์˜๋„๋Š” " repr(C) ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ ํƒ€์‚ฌ ABI ์‚ฌ์–‘์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. repr(Rust) ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ ๋ ˆ์ด์•„์›ƒ ํ˜ธํ™˜์„ฑ์€ ๋Œ€๋ถ€๋ถ„ ์ง€์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ)."

๋“œ๋กญ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ณต์šฉ์ฒด์˜ ๋“œ๋กญ ๊ฒ€์‚ฌ ์˜๋ฏธ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๊นŒ?

์›๋ž˜ ๋ฌธ์ œ๋Š” ManuallyDrop ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์กฐ์„ธํ•€์ด ๋ถˆ๊ฑด์ „ ํ•ด์กŒ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์†Œ๋ฉธ์ž๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ์—… ์ €์žฅ์†Œ๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ์•Š๊ณ  ์˜๊ตฌ ์ฐจ์šฉ ๋œ ๊ฐ’์— ์˜์กดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์š”์•ฝ ๋œ ์˜ˆ์ œ๋Š” https://play.rust-lang.org/?gist=607e2dfbd51f4062b9dc93d149815695&version=nightly์— ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” Pin<'a, T> ์œ ํ˜•์ด ์žˆ๊ณ , pin(&'a self) -> &'a T ๋ฉ”์†Œ๋“œ๋Š” ์•ˆ์ „์— ์˜์กดํ•˜๋Š” " pin.pin() ํ˜ธ์ถœ ํ•œ ํ›„ ํ•€์„ ์ง€์›ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšŒ์ˆ˜ ๋œ ๊ฒฝ์šฐ ํ•€์˜ ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "

์ด ๋ถˆ๋ณ€์„ฑ์€ #[allow(unions_with_drop_fields)] ๊ฐ€ ์ถ”๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ Rust์— ์˜ํ•ด ์œ ์ง€๋˜์—ˆ๊ณ  ManuallyDrop https://doc.rust-lang.org/src/core/mem.rs.html#949์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋“œ๋กญ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ๋“œ๋กญ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ณต์šฉ์ฒด๊ฐ€ Drop impl์„ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ฉด ๋ถˆ๋ณ€์ด ๋ณต์›๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด์ง€๋งŒ ์•ผ์ƒ์˜ ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ์˜๋ฏธ ์ฒด๊ณ„์— ์˜์กดํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

IRC ๋Œ€ํ™” : https://botbot.me/mozilla/rust-lang/2018-02-01/?msg=96386869&page=3

Josephine ๋ฌธ์ œ : https://github.com/asajeffrey/josephine/issues/52

cc : @nox @eddyb @pnkfelix

์›๋ž˜์˜ ๋ฌธ์ œ๋Š” ManualDrop์„ ์ถ”๊ฐ€ํ•˜๋ฉด Josephine์ด ๋ถˆ๊ฑด์ „ ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์†Œ๋ฉธ์ž๋Š” ์‹คํ–‰์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rust๋Š” ๊ทธ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•˜์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด std::mem::forget ๋Š” ์•ˆ์ „ํ•œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋“œ๋กญ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ๋“œ๋กญ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ณต์šฉ์ฒด๊ฐ€ Drop impl์„ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ฉด ๋ถˆ๋ณ€์ด ๋ณต์›๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด์ง€๋งŒ ์•ผ์ƒ์˜ ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ์˜๋ฏธ ์ฒด๊ณ„์— ์˜์กดํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ์— : ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ œ๊นŒ์ง€์™€ ๋…ธ์กฐ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค Drop ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ณ„ ๊ธฐ๋ณธ ๋ณดํ’€, ์ ์–ด๋„ ๊ฒฝ๊ณ -์— ์˜ํ•ด ๊ธฐ๋ณธ ๋ณดํ’€์—†์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„๋“œ๋ฅผ. unions_with_drop_fields ๋Š” ์•ˆ์ •ํ™” ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, "๋‹ซ๊ธฐ ๋ฐ ์˜๊ฒฌ"์„ ๋ˆ„๋ฅด๋ผ๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค.

@joshtriplett ์˜ˆ, Rust๋Š” ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š์ง€๋งŒ mem::forget ์ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Joephine์ด ๋‹ค์†Œ ์žฅ๋‚œ์Šค๋Ÿฝ๊ฒŒ ์˜์กด ํ•œ ๊ฒƒ์ด์ง€๋งŒ ๋“œ๋กญ ์ฒด์ปค๊ฐ€ unions_with_drop_fields ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.

allow(unions_with_drop_fields) ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฃผ์„์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธ‰๊ฒฉํ•œ ๋ณ€๊ฒฝ์ด ์•„๋‹™๋‹ˆ๋‹ค. AFAICT, allow(unions_with_drop_fields) ํ™•์ธํ•˜๋Š” ๋ฐ deny(unsafe_code) ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค.

@asajeffrey ๋‚˜๋Š” ์—ฌ์ „ํžˆ Pin ์ผ์„ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์ด "์ž‘๋™"ํ•˜๋Š” ์ด์œ ๋Š” fn pin(&'a Pin<'a, T>) -> &'a T ๊ฐ€ ์ฐจ์ž…์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์†๋˜๋„๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์— ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์ˆ˜๋ช… 'a ์ˆ˜๋ช…๊ณผ ๊ทธ ์ˆ˜๋ช…์€ ๋”์šฑ ๋ถˆ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ๊ด€์ฐฐ์ž…๋‹ˆ๋‹ค! ๋‚˜๋Š”์ด ์†์ž„์ˆ˜๋ฅผ ๋ชฐ๋ž๋‹ค. ๋‚ด ์ง๊ฐ์€ ์ด๊ฒƒ์ด "์šฐ์—ฐํžˆ"์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์•ˆ์ „ํ•œ Rust๊ฐ€ ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์ง€๋งŒ "๊ณ„์•ฝ"์˜์ด ๋ถ€๋ถ„์„ ๋งŒ๋“ค์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html ์€ ๋ˆ„์ถœ์„ ๋‚˜์—ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

IMO๋Š” ์šฐ์—ฐํžˆ ๋˜๋Š” ์˜๋„์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ManuallyDrop ๊ธฐ์กด (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ) ์ด์ „์—์ด ํŠธ๋ฆญ์œผ๋กœ ์‹คํ–‰๋˜๋Š” Drop ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์œผ๋ฉฐ ์ด์ œ๋Š” ๋” ์ด์ƒ์ด๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ManuallyDrop ์˜ ์ถ”๊ฐ€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Rust์˜ ๊น”๋”ํ•œ ํ–‰๋™์„ ์ฃฝ์˜€๊ณ , ์ฒ˜์Œ๋ถ€ํ„ฐ ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๋ง์€ ์ˆœํ™˜ ์ถ”๋ก ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ManuallyDrop Pin::pin ์ „ํ™”๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Pin::pin ๊ฑด์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์–ดํœ˜ ์ˆ˜๋ช…์ด ๋น„ ์–ดํœ˜ ์ˆ˜๋ช…์— ์˜ํ•ด ๊นจ์ง€๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋“  ์ˆ˜๋ช…์ด ์ž˜ ์ค‘์ฒฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€์ด๋ฅผ ์•…์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋น„ ์–ดํœ˜ ์ˆ˜๋ช…์—๋งŒ ๊ฒน์น˜๋Š” ์ˆ˜๋ช…์ด์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ˆ˜๋ช…์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด NLL์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ํ•˜์ง€ ํฌ๋ง!

ManualDrop์ด Pin :: pin ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Pin :: pin ํ˜ธ์ถœ์ด ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

unsafe ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด Pin ํŠธ๋ฆญ ์‚ฌ์šด๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉด ManuallyDrop ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ unsound ๋ฅผ ์„ ์–ธ ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์„ค๋ช…ํ•œ ๊ฒƒ์€ Rust๋ฅผ GC์™€ ํ†ตํ•ฉํ•˜๋Š” ๋งค์šฐ ์ธ์ฒด ๊ณตํ•™์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€์ด์ด ์ผ์„ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์‚ฌ๊ณ ๋ผ๊ณ  ์šฐ๋ฆฌ์—๊ฒŒ ์–˜๊ธฐ๋ฅผ ๋‚˜์—๊ฒŒ ์ž˜๋ชป ์†Œ๋ฆฌ์ด๋‹ค ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋…ธ๋™ ์กฐํ•ฉ ์ œ์•ฝํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์žŠ์ง€ํ•ด์•ผ Drop ํ•„๋“œ๋Š” @asajeffrey๊ฐ€ ์—ฌ๊ธฐ์— ์„ค๋ช…ํ–ˆ๊ณ  ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์กฐ์„ธํ•€์„ ํŒŒ๊ดดํ•˜๋Š” ์œ ์ผํ•œ ์‚ฌ๋งˆ๊ท€ ์ผ ๋•Œ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ManuallyDrop ์—†์ด๋„ ๋ถˆ๊ฑด์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์žŠ์–ด ๋ฒ„๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋˜ ์‚ฌ๊ณ ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ํŠธ๋ฆญ์ด "์„ค๊ณ„"๋˜์—ˆ๋‹ค๋Š” ์ง•ํ›„๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์„ ์‚ฌ๊ณ ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ๊ณต์ •ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์žŠ์–ด์•ผํ•œ๋‹ค๊ณ 

๋‚˜๋Š”์ด ๋ถ€๋ถ„์ด ๋‚ด ๊ฐœ์ธ์ ์ธ ์ง๊ฐ์ด๋ผ๋Š” ๊ฒƒ์„ ๋” ๋ถ„๋ช…ํžˆํ•ด์•ผํ–ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ "ํ–‰๋ณตํ•œ ์‚ฌ๊ณ "๋ผ๊ณ  ์„ ์–ธํ•˜๊ณ  ์‹ค์ œ๋กœ ๋ณด์ฆํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์  ํ–‰๋™ ์ง€์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  unsafe ์ฝ”๋“œ๊ฐ€์ด ๋ณด์ฆ์„ ์กด์ค‘ํ•œ๋‹ค๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํ™•์‹ ํ•œ๋‹ค๋ฉด ์ด ๋ณด์ฆ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ManuallyDrop ์‚ฌ์šฉ ์‚ฌ๋ก€๋ณด๋‹ค ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ leakpocalypse์™€ ๋น„์Šทํ•œ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ€์ดํฌ๋ฅผ ๋จน์„ ์ˆ˜์—†๊ณ  ๋จน์„ ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค (ํ˜„์žฌ API์™€ drop ๋ชจ๋‘ Rc ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค- ๊ธฐ๋ฐ˜ ๋ฒ”์œ„ ์Šค๋ ˆ๋“œ; ManuallyDrop ๋ฐ Pin ) ๋‘˜ ๋‹ค ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์–ด๋Š ์ชฝ์ด๋“  ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์—ฌ๊ธฐ์— ์ œ๊ณต๋œ ์‹ค์ œ ๋ณด์ฆ์„ ์ •ํ™•ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ " ManuallyDrop ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์ธก๋ฉด์— ๋” ์˜์ง€ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  unsafe ์ฝ”๋“œ๊ฐ€์ด ๋ณด์ฆ์„ ์กด์ค‘ํ•˜๊ณ ์ด ๋ณด์ฆ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ManuallyDrop ์‚ฌ์šฉ ์‚ฌ๋ก€๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ. ์ด๊ฒƒ์€ leakpocalypse์™€ ๋น„์Šทํ•œ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ€์ดํฌ๋ฅผ ๋จน์„ ์ˆ˜์—†๊ณ  ๋จน์„ ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค (ํ˜„์žฌ API์™€ drop ๋ชจ๋‘ Rc ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค- ๊ธฐ๋ฐ˜ ๋ฒ”์œ„ ์Šค๋ ˆ๋“œ; ManuallyDrop ๋ฐ Pin ) ๋‘˜ ๋‹ค ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์–ด๋Š ์ชฝ์ด๋“  ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์ง„์‹ฌ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. @asajeffrey ๊ฐ€ ๊ฒฐ๊ตญ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์œผ๋กœ ์„ค๋ช…ํ•œ ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ฉด drop ๊ธฐ๋ฐ˜ ๋ฒ”์œ„ ์Šค๋ ˆ๋“œ API๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ Alan์˜ ์ œ์•ˆ์€ ManuallyDrop ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. dropck์ด (๋ฐ Drop ํ•„๋“œ๊ฐ€์žˆ๋Š” ๋‹ค๋ฅธ ์œ ๋‹ˆ์˜จ) ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ ์†Œ๋ฉธ์ž๋Š” ์•„๋ฌด ์ผ๋„ํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ ๋‹จ์ˆœํ•œ ์กด์žฌ๋Š” dropck์ด ๋ฐ›์•„๋“ค์ด๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.)

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ManualDrop ์—†์ด๋„ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์žŠ์–ด ๋ฒ„๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž๊ฒฉ์ด๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ๊ธฐ์— ์ฒซ ๋ฒˆ์งธ ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ManuallyDrop ์ด์ „์— union Rust์—์„œ ์ž‘๋™ํ•˜๋Š” ManuallyDrop ์™€ ๊ฐ™์€ ์–ด๋ฆฌ์„์€ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

pub mod manually_drop {
    use std::mem;
    use std::ptr;
    use std::marker::PhantomData;

    pub struct ManuallyDrop<T> {
        data: [u8; 32],
        phantom: PhantomData<T>,
    }

    impl<T> ManuallyDrop<T> {
        pub fn new(x: T) -> ManuallyDrop<T> {
            assert!(mem::size_of::<T>() <= 32);
            let mut data = [0u8; 32];
            unsafe {
                ptr::copy(&x as *const _ as *const u8, &mut data[0] as *mut _, mem::size_of::<T>());
            }
            mem::forget(x);
            ManuallyDrop { data, phantom: PhantomData }
        }

        pub fn deref(&self) -> &T {
            unsafe {
                &*(&self.data as *const _ as *const T)
            }
        }
    }
}

(์˜ˆ, ์ •๋ ฌ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ž‘์—…์„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ผ๋ถ€ ๋ฐ”์ดํŠธ๋ฅผ ํฌ์ƒํ•˜์—ฌ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)
ํœด์‹ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๋Š” ๋†€์ดํ„ฐ Pin : https://play.rust-lang.org/?gist=fe1d841cedb13d45add032b4aae6321e&version=nightly

์ด๊ฒƒ์ด ์ œ๊ฐ€ ์œ„์˜ ์–‘๋‚  ๊ฒ€์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ ์ œ ManuallyDrop ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‚ด๋†“์€ ๋ชจ๋“  ๊ทœ์น™์„ ์กด์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ManuallyDrop ๋ฐ Pin ๋‘ ๊ฐ€์ง€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ "๋งž์•„"? Pin ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•œ ๋ฒˆ๋„ํ•˜์ง€ ์•Š์€ ๋ณด์ฆ์— ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” "์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํŒ๋‹จ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

์ด์ œ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๊ณ ์ • ํ•ญ๋ชฉ์˜ ์ผ๋ถ€ ๋ฒ„์ „์—์„œ Pin::pin ๋Š” &'this mut Pin<'this, T> ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ManuallyDrop ์— DerefMut impl์ด์žˆ๋Š” ๊ฒƒ์€ ๋ถ€๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ?

๋‹ค์Œ์€ @RalfJung ์˜ (๋‹น์—ฐํžˆ) &mut -taking pin ๋ฉ”์„œ๋“œ๋กœ Pin ์„ (๋ฅผ) ์—ฌ์ „ํžˆ ๊นจ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋†€์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

https://play.rust-lang.org/?gist=5057570b54952e245fa463f8d7719663&version=nightly

ManualDrop์ด DerefMut impl์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋ถ€๋‹นํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ,์ด ์˜ˆ์ œ์— ํ•„์š”ํ•œ API๋ฅผ ๋ฐฉ๊ธˆ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ deref_mut ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ Alan์˜ ์ œ์•ˆ์€ ManualDrop์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ dropck์ด (๋ฐ Drop ํ•„๋“œ๊ฐ€์žˆ๋Š” ๋‹ค๋ฅธ ๊ณต์šฉ์ฒด) ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ ์†Œ๋ฉธ์ž๋Š” ์•„๋ฌด ์ผ๋„ํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ ๋‹จ์ˆœํ•œ ์กด์žฌ๋Š” dropck์ด ๋ฐ›์•„๋“ค์ด๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.)

์•„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†“์ณค๋‹ค. ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์ œ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    unsafe impl<#[may_dangle] T> Drop for ManuallyDrop<T> {
        fn drop(&mut self) {}
    }

#[may_dangle] ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ Rust๊ฐ€ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์ ์–ด๋„, ์šฐ๋ฆฌ๋Š” ์œ„์˜ ์ฝ”๋“œ ์œ„๋ฐ˜ ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋งˆ๋ จ ํ•  ๊ฒƒ - ๊ทธ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ "์šฐ๋ฆฌ๋Š”์ด์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์‚ฌ์šด๋“œ๊ฐ€๋˜๊ณ  ์‹ถ์–ด์š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค"๋ผ๋Š” ์ž˜๋ชป๋œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ๋ณด๊ณ  ์†Œ๋ฆฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


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

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

์‹œ๊ฐ„๋Œ€๋Š” ์žฌ๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ผ์–ด ๋‚ฌ์–ด์š”! ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ (์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๋ณ€, ํŠนํžˆ dropck)๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ๋ณ„๋„์˜ ์ฃผ์„์— ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค.

@RalfJung : ์˜ˆ, ์ด๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ Rust์— ์˜ํ•ด ์œ ์ง€๋˜๋Š” ๋ถˆ๋ณ€์„ฑ์— ๊ด€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Rust + std์˜ ๋ชจ๋“  ๋ฒ„์ „์— ๋Œ€ํ•ด ์‹ ๋ขฐ ๋ณด์žฅ ์ถ”๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋˜๋Š” ๋ถˆ๋ณ€ I ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ L1 ๋ฐ L2 ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” I1 ๋ฐ I2 ํ•˜์—ฌ Rust + L1 ๊ฐ€ ์•ˆ์ „ํ•˜๊ณ  Rust + L2 ๋Š” ์•ˆ์ „ํ•˜์ง€๋งŒ Rust + L1 + L2 ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ L1 ๋Š” ManuallyDrop ์ด๊ณ  L2 ๋Š” Josephine ์ด๋ฉฐ ManuallyDrop ๋Š” ์ง€๊ธˆ๋ถ€ํ„ฐ ์ด๊ธธ ๊ฒƒ์ž„์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. std ์—์„œ๋Š” Josephine๋ณด๋‹ค ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ์ œ์•ฝ์ด ํ›จ์”ฌ ๋” ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html ์˜ ์ง€์นจ์€ "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ... "์ฆ‰, ์ปจํ…์ŠคํŠธ ์†์„ฑ (๋ชจ๋“  ์•ˆ์ „ํ•œ ์ปจํ…์ŠคํŠธ C์— ๋Œ€ํ•ด C [P]๋Š” ์ž˜๋ชป ๋  ์ˆ˜ ์—†์Œ)์ด๋ฏ€๋กœ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (Rust + std์˜ v1.20์ด ๋” ์•ˆ์ „ํ•˜๋ฏ€๋กœ v1.18๋ณด๋‹ค ์ปจํ…์ŠคํŠธ). ํŠนํžˆ, ์•ˆ์ „ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 1.20 ์ด์ „์—๋Š” ๊ณ ์ •์ด Rust์— ๋Œ€ํ•œ์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์‹ค์ œ๋กœ ๋งŒ์กฑํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. C st C [Pinning]์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋‹ค๋ฉด, ๊ณ ์ •์€ ์šฐ์—ฐํ•œ ๋ถˆ๋ณ€์„ฑ์ด ์ž˜๋ชป๋˜๋Š” ํฅ๋ฏธ๋กœ์šด ์˜ˆ๋ฅผ ๋ณด์—ฌ ์ฃผ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์œ ๋‹ˆ์˜จ (๋ฐ ๋”ฐ๋ผ์„œ ManuallyDrop )์ด ์ˆ˜ํ–‰ ํ•œ ํŠน์ • ์ž‘์—…์€ ๋“œ๋กญ ๊ฒ€์‚ฌ๊ธฐ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ManualDrop ๋Š” defn์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

unsafe impl<#[may_dangle] T> Drop for ManuallyDrop<T> { ... }

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ๋Œ€ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :) ์‹ค์ œ๋กœ์ด ๋Œ€ํ™”๋Š” https://github.com/rust-lang/rust/issues/ ์—์„œ ์‹œ์ž‘ํ•˜๋Š” may_dangle ์Šค๋ ˆ๋“œ์—์„œ ์ง„ํ–‰ ๋ฉ๋‹ˆ๋‹ค. 34761 # issuecomment -362375924

@RalfJung ์ฝ”๋“œ๋Š” data ์˜ ๋Ÿฐํƒ€์ž„ ์œ ํ˜•์ด T ์ด์ง€๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜•์€ [u8; N] ์ธ ํฅ๋ฏธ๋กœ์šด ์ฝ”๋„ˆ ์ผ€์ด์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. may_dangle ์— ๊ด€ํ•œ ํ•œ ์–ด๋–ค ์œ ํ˜•์ด ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ?

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html ์˜ ์ง€์นจ์€ "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ... "์ฆ‰, ์ปจํ…์ŠคํŠธ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

์•„, ํฅ๋ฏธ ๋กญ๊ตฐ์š”. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถ„๋ช…ํžˆ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค-์ด๊ฒƒ์€ ์›๋ž˜ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ์Šค๋ ˆ๋“œ๋ฅผ ์†Œ๋ฆฌ๋กœ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜๋ฏธ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด์„œ๋Š” (์ ์–ด๋„) ์•ˆ์ „ ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ง‘ํ•ฉ์„ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์œ ์ง€ ๋  ๋ถˆ๋ณ€์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Rust์— ๋Œ€ํ•ด ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด ๊ทธ๋Ÿฌํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ๋ถ„๋ช…ํžˆ ํŽธํ–ฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ;)

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

์˜ˆ๋ฅผ ๋“ค์–ด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์˜ ํ•œ๊ณ„์™€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์€ ๋™์ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•œ ์ตœ๊ทผ ํ† ๋ก ์€ https://github.com/nikomatsakis/rust-memory-model/issues/44 ๋ฅผ ์ฐธ์กฐ &mut T ๋Œ€ํ•ด mem::size_of::<T>() == 0 &mut T ๋ฅผ ๋ณต์ œํ•ด๋„ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง์ ‘์ ์ด์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋ถˆ๋ฒ•์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค๋ฅธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์†Œ์œ ๊ถŒ ๊ทœ์œจ์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๊ทœ์œจ์„ ์œ„๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋‹ค๋ฉด, ๊ณ ์ •์€ ์šฐ์—ฐํ•œ ๋ถˆ๋ณ€์„ฑ์ด ์ž˜๋ชป๋˜๋Š” ํฅ๋ฏธ๋กœ์šด ์˜ˆ๋ฅผ ๋ณด์—ฌ ์ฃผ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„, ํ™•์‹คํžˆ. ๊ทธ๋ฆฌ๊ณ  ์•ž์œผ๋กœ ์ด๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html์— "๋ถˆ๋ณ€์ด rustc + libstd์— ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๊ณ ํ•ด์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ถˆ๋ณ€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. "?

@RalfJung ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋ˆ„๊ตฌ๋„ "์ •ํ™•์„ฑ"์ด๋ผ๋Š” ๋งฅ๋ฝ ์  ์ •์˜๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋งฅ๋ฝ์˜ ๊ด€์ฐฐ๋ ฅ์ด ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ถˆ๋ณ€์„ฑ ์ธก๋ฉด์—์„œ ์˜๋ฏธ ๋ก ์  defn์œผ๋กœ ํ›จ์”ฌ ๋” ํ–‰๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ ์ž์‹ ์—๊ฒŒ ์•ฝ๊ฐ„์˜ ํ”๋“ค๋ฆผ์„ ์ค„ ์ˆ˜ ์žˆ๊ณ  ์‹ ๋ขฐ ๋ณด์žฅ ์ถ”๋ก ์„ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ฝ”๋“œ๋Š” R์— ์˜์กด ํ•  ์ˆ˜ ์žˆ๊ณ  G๋ฅผ ๋ณด์žฅํ•ด์•ผํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ G๋Š” R์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด R์„ ๊ฐ•ํ™”ํ•˜๊ณ  G๋ฅผ ์•ฝํ™”์‹œํ‚ฌ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ถˆ๋ณ€ (์ฆ‰, R = G) ๋งŒ ์žˆ์œผ๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

์ƒ์ˆ˜ ๊ฒ€์‚ฌ๋Š” ํ˜„์žฌ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ํ†ตํ•ฉ ํ•„๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. (cc @solson @ oli-obk)

union Transmute<T, U> { from: T, to: U }

const SILLY: () = unsafe {
    (Transmute::<usize, Box<String>> { from: 1 }.to, ()).1
};

fn main() {
    SILLY
}

์œ„ ์ฝ”๋“œ๋Š” miri ํ‰๊ฐ€ ์˜ค๋ฅ˜ "calling non-const fn std::ptr::drop_in_place::<(std::boxed::Box<std::string::String>, ())> - shim(Some((std::boxed::Box<std::string::String>, ()))) "๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

.to ์œ ํ˜•์„ const ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ๊ด€์ฐฐํ•˜๋„๋ก ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

const fn id<T>(x: T) -> T { x }

const SILLY: () = unsafe {
    (id(Transmute::<usize, Box<String>> { from: 1 }.to), ()).1
};

๊ฒฐ๊ณผ๋Š” "์ปดํŒŒ์ผ ํƒ€์ž„์— ์†Œ๋ฉธ์ž๋ฅผ ํ‰๊ฐ€ํ•  ์ˆ˜ ์—†์Œ"์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (ํŠนํžˆ restrict ํ˜ธ์ถœ).
https://github.com/rust-lang/rust/blob/5e4603f99066eaf2c1cf19ac3afbac9057b1e177/src/librustc_mir/transform/qualify_consts.rs#L557

# 41073์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ๋ถ„์„์„ ํ†ตํ•ด ๊ณต์šฉ์ฒด์˜ ํ•˜์œ„ ํ•„๋“œ์— ํ• ๋‹น ํ•  ๋•Œ ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋  ๋•Œ์˜ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์•ˆ์ •ํ™”๋ฅผ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋ถˆ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ณต์šฉ์ฒด์—์„œ Drop ์œ ํ˜•์„ ์™„์ „ํžˆ ๋ฐฐ์ œํ•˜๊ณ  ManuallyDrop (lang-item์œผ๋กœ) ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ManuallyDrop ๋Š” ๋…ธ๋™ ์กฐํ•ฉ์—์„œ Drop ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ๋™๊ธฐ ์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋งค์šฐ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๊ธ์ •์  ์ธ "no drop"ํŠน์„ฑ์ด ์—†์œผ๋ฉด ๋ชจ๋“  ํ•„๋“œ๊ฐ€ Copy ์ด๊ฑฐ๋‚˜ ManuallyDrop<T> ํ˜•์‹์ด๋ฉด ๊ณต์šฉ์ฒด๊ฐ€ ์ž˜ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์œ ๋‹ˆ์˜จ ํ•„๋“œ๋ฅผ ํ• ๋‹น ํ•  ๋•Œ (๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์ด ๋†€๋ผ์šด ํ’‹ ๊ฑด์œผ๋กœ ๊ฐ€๋“ ์ฐฌ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”) ๋“œ๋กญ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ํ•ฉ๋ณ‘์ฆ์„ ์™„์ „ํžˆ ํšŒํ”ผ ํ•  ๊ฒƒ์ด๋ฉฐ, ManuallyDrop ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ Drop ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ช…ํ™•ํ•œ ๋งˆ์ปค์ž…๋‹ˆ๋‹ค. Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๊ธ์ •์  ์ธ ๋ฐฉ์‹์œผ๋กœ ๋งํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋” ์ข‹์•„.)


์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์—๋Š” ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ณต์šฉ์ฒด ๋‚˜ RFC๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹จ์ผ ๋ณ€ํ˜• ๊ณต์šฉ์ฒด๋กœ ์ œํ•œ ๋˜๋Š” ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹จ์ผ ๋ณ€ํ˜• ๊ฒฐํ•ฉ์ด ์–ด๋–ค ์˜๋ฏธ์—์„œ "์œ ํšจ"ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ „์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์–‡์€ ํฌ์ธํ„ฐ DST๊ฐ€ ๊ทธ๋ฆผ์— ๋“ค์–ด๊ฐ€๋ฉด) (์‚ญ์ œ ๋  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ทธ๋Ÿด ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค). ๋ชจ๋“  ํ™€์ˆ˜ ๋น„ํŠธ ํŒจํ„ด).

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

์ˆ˜ํ‘œ๋Š” ๋” ์Šค๋งˆํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œํ’ˆ ์œ ํ˜•๊ณผ ๋™์ผํ•œ ์ƒ์ž์— ์„ ์–ธ ๋œ ๋ช…๋ชฉ ์œ ํ˜•์„ ํ†ตํ•ด ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ˆ ์–ด๋Š” ์ด๋ฏธ ์กด์žฌํ•˜์ง€๋งŒ ๋ฐ”์ธ๋”ฉ ํ•  ํŠน์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ์—์„œ ๋ณด์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
std::mem::needs_drop ( rustc ๊ตฌํ˜„ํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ)์„ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@eddybํ•ฉ๋‹ˆ๋‹ค needs_drop ์ž์‹ ์˜ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์ •์œผ๋กœ ์ƒ์œ„ ํ˜ธํ™˜์„ฑ์„ํ•˜๊ฑฐ๋‚˜ ์ฆ๊ฒ๊ฒŒ ๊ธฐํƒ€๋กœ ๋ชจ์–‘์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด Drop ? ์—ฌ๊ธฐ์„œ์˜ ๋ชฉํ‘œ๋Š” semver ํ˜ธํ™˜ ๋ณ€๊ฒฝ์—์„œ ์ ˆ๋Œ€ ๊นจ์ง€์ง€ ์•Š๋Š” ๊ฒ€์‚ฌ๋ฅผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ˜• ๋˜๋Š” ์ˆ˜๋ช… ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€์—†๋Š” ๊ตฌ์กฐ์ฒด์— impl Drop ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ „์šฉ ํ•„๋“œ ๋งŒ semver ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก

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

๊ทธ๊ฒƒ์€ ๋งค์šฐ ํŠน์ •ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
C ํ—ค๋”์—์„œ ์ƒ์„ฑ ๋œ C ์Šคํƒ€์ผ ๊ณต์šฉ์ฒด์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค (์†Œ๋ฉธ์ž๊ฐ€์—†๊ณ  ๋ชจ๋“  ๊ฒƒ์ด Copy , ์ •ํ™•ํžˆ ์•ˆ์ •์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํ•˜์œ„ ์ง‘ํ•ฉ).
_dummy: () ๋˜๋Š” _future: () ํ•„๋“œ๋ฅผ ์ด๋Ÿฌํ•œ ๊ณต์šฉ์ฒด์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ์•ˆ์ „ํ•œ "enum"๋ชจ๋ธ์˜ ์ด์ ์„ ๊ณ„์† ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "ํ™•์žฅ ์ง€์ "์ธ FFI ์œ ๋‹ˆ์˜จ์€ ์–ด์จŒ๋“  ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2018 ๋…„ 4 ์›” 17 ์ผ ์˜ค์ „ 10:08:54 PDT์— Vadim Petrochenkov [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

_dummy: () ๋˜๋Š” _future: () ํ•„๋“œ๋ฅผ ์ด๋Ÿฌํ•œ ๊ณต์šฉ์ฒด์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ์•ˆ์ „ํ•œ "์—ด๊ฑฐ ํ˜•"๋ชจ๋ธ์˜ ํ˜œํƒ์„ ๊ณ„์† ๋ˆ„๋ฆฌ์‹ญ์‹œ์˜ค.

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

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

FFI ์—ฐํ•ฉ
"ํ™•์žฅ ์ "์ด๋˜๋Š” ๊ฒƒ์€ ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์–ด์จŒ๋“ .

์˜๋ฏธ๋ก ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ •ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ์•„๋‹ˆ์š”, auto trait ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์—ฌ ๋ชจ๋“  ๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ https://github.com/rust-lang/rust/issues/41073#issuecomment -380291471์—์„œ "ํ™œ์„ฑ ํ•„๋“œ"์™€ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ๋‹ˆ์˜จ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์ ‘๊ทผ ํ•  ๋•Œ๊นŒ์ง€ ๋Ÿฌ์ŠคํŠธ๊ฐ€ ์–ด๋–ค ๊ฒƒ์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์—์„œ ๊ณ„์†ํ•ด์„œ ๋น„ํŠธ ๊ฐ€๋ฐฉ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋ฅผ ์œ„ํ•ด, ๋งŒ์•ฝ ๋‹น์‹ ์ด ์œ ๋‹ˆ์˜จ์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ~ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. drop ~์€ ๋“œ๋กญ์ด ํ•„์š”ํ•œ ํ•„๋“œ์— ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ ์™€์„œ std::ptr::drop_in_place ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋…ธ์กฐ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชฐ๋ž๋‹ค๋ฉด ๋…ธ์กฐ๊ฐ€ ์ผํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ- mem::uninitialized ๋ฅผ ๊ณต์šฉ์ฒด๋กœ ํ‘œ์‹œ

pub union MaybeValid<T> {
    valid: T,
    invalid: ()
}

impl<T> MaybeValid<T> {
    #[inline] // this should optimize to a no-op
    pub fn from_valid(valid: T) -> MaybeValid<T> {
        MaybeValid { valid }
    }

    pub fn invalid() -> MaybeValid<T> {
        MaybeValid { invalid: () }
    }

   pub fn zeroed() -> MaybeValid<T> {
        // do whatever is necessary here...
        unimplemented!()
    }
}

fn example() {
    let valid_data = MaybeValid::from_valid(1_u8);
    // Destructor of a union always does nothing, but that's OK since our 
    // data type owns nothing.
    drop(valid_data);
    let invalid_data = MaybeValid::invalid();
    // Destructor of a union again does nothing, which means it needs to know 
    // nothing about its surroundings, and can't accidentally try to free unused memory.
    drop(invalid_data);
    let valid_data = MaybeValid::from_valid(String::from("test string"));
    // Now if we dropped `valid_data` we would leak memory, since the string 
    // would never get freed. This is already possible in safe rust using e.g. `Rc`. 
    // `union` is a similarly advanced feature to `Rc` and so new users are 
    // protected by the order in which concepts are introduced to them. This is 
    // still "safe" even though it leaks because it cannot trigger UB.
    //drop(valid_data)
    // Since we know that our union is of a particular form, we can safely 
    // move the value out, in order to run the destructor. I would expect this 
    // to fail if the drop method had run, even though the drop method does 
    // nothing, because that's the way stuff works in rust - once it's dropped
    // you can't use it.
    let _string_to_drop = unsafe { valid_data.valid };
    // No memory leak and all unsafety is encapsulated.
}

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜๊ณ  ํŽธ์ง‘ํ•˜์—ฌ ๋‚ด ์ž‘์—…์„ ์žƒ์ง€ ์•Š๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” @SimonSapin ๋ฐฉ๋ฒ•์„ ํŽธ์ง‘

๊ณต์šฉ์ฒด์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•˜๋ ค๋ฉด, ์‚ญ์ œํ•˜๋ ค๋Š” ์œ ํ˜•์œผ๋กœ ์บ์ŠคํŒ… / ๋ณ€ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋‹ค๋ฅธ ๋ณ€ํ˜•์˜ ๋์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋น„ํŠธ๊ฐ€ ๋” ํด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Œ). ๋˜๋Š” ํ•„๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ถ”์ถœํ•˜์‹ญ์‹œ์˜ค.

(๋งŒ์•ฝ ๋†“์•„๋‘๊ธฐ ๋งŒํ•˜๋ฉด ๊ฐ’์„ ์ด๋™ํ•˜๋Š” ์˜๋ฏธ์—์„œ ์ถ”์ถœ ํ•  ํ•„์š”๊ฐ€์—†๋Š” ๊ฒฝ์šฐ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์— ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ ๊ฐ€์„œ std::ptr::drop_in_place ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ด€๋ จ : ์ƒ์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์ƒ์ˆ˜ ๋‚ด๋ถ€์˜ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์œ ๋‹ˆ์˜จ ํ•„๋“œ๊ฐ€ ์ •ํ™•ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/pull/51361 (ZST ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ์‚ฌ์‹ค)

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜๊ณ  ํŽธ์ง‘ํ•˜์—ฌ ๋‚ด ์ž‘์—…์„ ์žƒ์ง€ ์•Š๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@derekdreery (๋ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ) https://internals.rust-lang.org/t/pre-rfc-unions-drop-types-and-manuallydrop/8025์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ : ์ƒ์ˆ˜์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์ƒ์ˆ˜ ๋‚ด๋ถ€์˜ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์œ ๋‹ˆ์˜จ ํ•„๋“œ๊ฐ€ ์ •ํ™•ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. # 51361

๋‚˜๋Š” ๊ตฌํ˜„์„ ๋ณด์•˜์ง€๋งŒ ๋…ผ์Ÿ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ;)

๊ธ€์Ž„์š” .. "์ „ํ˜€ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ด์ƒํ•ด ๋ณด ์˜€์–ด์š”."

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

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณต์šฉ์ฒด๋Š” ํŠน์ • ํฌ๊ธฐ์™€ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ์˜ˆ์œ ๋ฐฉ๋ฒ• ์ผ ๋ฟ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ณ ์ • ๋œ ์œ ํ˜• ์„ธํŠธ ๊ฐ„ ๋ณ€ํ™˜์„์œ„ํ•œ ํŽธ์˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋…ธ์กฐ๊ฐ€ ๊ทธ๋“ค์— ์ ‘๊ทผํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง„ "ํ•ด์„๋˜์ง€ ์•Š์€ ๋น„ํŠธ์˜ ๊ฐ€๋ฐฉ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ „ํ˜€ ์ด์ƒํ•œ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

AFAIK ์‹ค์ œ๋กœ ๋ฒ ๋ฅผ๋ฆฐ ์ „์ฒด์—์„œ ์–ธ๊ธ‰ ํ•œ @joshtriplett ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋…ธ์กฐ์˜ ์ „๋ฐ˜๋ถ€๋Š” ํ•œ ํ•„๋“œ์™€ ์ผ์น˜ํ•˜๊ณ  ํ›„๋ฐ˜๋ถ€๋Š” ๋‹ค๋ฅธ ํ•„๋“œ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋…ธ์กฐ๊ฐ€ ๊ทธ๋“ค์— ์ ‘๊ทผํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง„ "ํ•ด์„๋˜์ง€ ์•Š์€ ๋น„ํŠธ์˜ ๊ฐ€๋ฐฉ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ „ํ˜€ ์ด์ƒํ•œ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•ญ์ƒ์ด ํ•ด์„์ด ์–ธ์–ด์˜ ์ •์‹ ์— ๋‹ค์†Œ ์œ„๋ฐฐ๋˜์ง€๋งŒ.
๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์ •์  ๋ถ„์„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’‹๊ฑด์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋นŒ๋ฆฐ ๊ฐ’์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์ง€๋งŒ ๊ฐ‘์ž๊ธฐ ๋ถ„์„์ด ๋น„ํ™œ์„ฑํ™” ๋œ ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ ์ดฌ์˜ํ•˜์‹ญ์‹œ์˜ค.

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

๋˜ํ•œ ์ด๊ฒƒ์€ union ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•จ์ด ์ค‘์š”ํ•˜๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ด€๋ จ ๋  ๋•Œ ๋”์šฑ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ•ญ์ƒ ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ). ์—ฌ๊ธฐ์—์„œ ๊ฐ€์‹œ์  ์ธ ์ด์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์„ ๋ฐ›์•„ ๋“ค์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

bag-of-bits ๋ชจ๋ธ์€ unknown-variant๊ฐ€์žˆ๋Š” ์—ด๊ฑฐ ํ˜• ๋ชจ๋ธ์— ๋น„ํ•ด ์ƒˆ๋กœ์šด ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ๋‹ˆ์˜จ์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ์žฌ์‚ฐ์€ ์ตœ์†Œํ•œ ์•ˆ์ „ ์žฅ์น˜ ์ธ๋งŒํผ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์œ ์ง€ ํ•ด์•ผํ•˜๋Š” ๋ถ€๋‹ด ์ด๋ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์œ ํ˜• punning 1์— ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์†์„ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜์žˆ๋Š” ์ •์  ๋ถ„์„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "enum with unknown variant"๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ ์ฒ˜๋ฆฌ ๊ณต์šฉ์ฒด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋งค์šฐ์ฃผ์˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋™ ์กฐํ•ฉ ๋˜๋Š” ์œ„ํ—˜ ์ธ์Šคํ„ดํŠธ UB๋Š” ์ •๋ง ์ด๋ฏธ ์ฝ๊ธฐ ๋•Œ๋ฌธ์—, ๋…ธ์กฐ์—์„œ ์ฝ๊ธฐ์— ๊ด€๋ จ๋œ unsafety ๊ฐ์†Œ์—†์ด ๋น„ํŠธ๊ฐ€ ๋ณ€ํ˜• ๋‹น์‹ ์—๊ฒŒ์žˆ๋Š” ๊ฑฐ ์ฝ๊ธฐ์— ์œ ํšจํ•œ์ง€ (์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฑ„๋„์„ ํ†ตํ•ด) ์•Œ๊ณ  ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ miri์—์„œ ์‹คํ–‰๋  ๋•Œ ๋ณ€ํ˜•์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž

1 ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠœํ”Œ์ด ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด repr (C)๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด union Foo { a: (bool, u8), b: (u8, bool) } ์‚ฌ์šฉํ•˜๋ฉด ํ•„๋“œ ํ• ๋‹น๋งŒ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

union Foo {a : (bool, u8), b : (u8, bool)}

์ด๋ด, ๊ทธ๊ฒŒ ๋‚ด ์˜ˆ์ž…๋‹ˆ๋‹ค :)
๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ RFC 1897์˜ ๋ชจ๋ธ์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค ( "๋ฆฌํ”„"์กฐ๊ฐ bool -1, u8 -1, u8 -2, bool -2๋Š” ๋ถ€๋ถ„ ํ• ๋‹น ํ›„์— ์œ ํšจํ•ฉ๋‹ˆ๋‹ค).

์ฝ”๋“œ ํ•ธ๋“ค๋ง ์œ ๋‹ˆ์˜จ์€ ์œ ๋‹ˆ์˜จ์— ์“ฐ๋Š” ๋ฐฉ๋ฒ•์— ๋งค์šฐ ์กฐ์‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰ RFC 1897์˜ ๋ชจ๋ธ์˜ ์š”์  (ํ• ๋‹น ๋˜๋Š” ๋ถ€๋ถ„ ํ• ๋‹น ๋“ฑ) ์•ˆ์ „ํ•œ ์ž‘์—…์ด ๋ชจ๋“  ์‹œ๊ฐ„ ์Šˆํผ์ฃผ์˜ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค, ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์กฐํ•ฉ์„ ์ผค ์ˆ˜ ๋ฐ ์ธ์Šคํ„ดํŠธ UB์„ํ•˜์ง€ ์•Š๋Š” ์ •์  ๊ฒ€์‚ฌ ๋ณด์žฅํ•˜์ง€๋งŒ .
์™€์ผ๋“œ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ์“ฐ๊ธฐ์™€ ๊ฐ™์ด ํ†ตํ•ฉ๊ณผ ๊ด€๋ จ์ด์—†๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—… ๋งŒ ํ†ตํ•ฉ์„ ๋ฌดํšจํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ด๋™ ํ™•์ธ ์—†์ด ์œ ๋‹ˆ์˜จ์€ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋ฌดํšจ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let u: Union;
let x = u.field; // UB

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

์–ด๋–ค ์ข…๋ฅ˜์˜ ์“ฐ๊ธฐ๋Š” ๊ณต์šฉ์ฒด์— ๋ถ€๊ณผ ๋œ ์ถ”๊ฐ€ ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ž๋™์œผ๋กœ ์ธ์‹ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘์„ฑ์ž๊ฐ€ ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ์ถ”๊ฐ€ ๋ถˆ๋ณ€์ž…๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ฝ์€ ๋ณ€ํ˜•์— ๋Œ€ํ•ด ๋น„ํŠธ๊ฐ€ ์œ ํšจํ•œ์ง€ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ฝ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š๊ณ  ์ž‘์„ฑ์ž์˜ ์‚ถ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. "Bag of bits"๋‚˜ "enum with unknown variant"๋Š” ๊ณต์šฉ์ฒด์˜ ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ฝ๊ณ  ์žํ•˜๋Š” ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋” ๋ฉ‹์ง„ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ Dropping์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ๊นŒ์š”? ๋งŒ์•ฝ ๋‹น์‹ ์ด ํ•ฉ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๋ฉด ๊ทธ๊ฒƒ์„ C์—๊ฒŒ ๋„˜๊ฒจ ์ฃผ๋ฉด ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง€๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๋…น์ด ์Šฌ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ํ’€์–ด ์ฃผ๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ํ•ญ์ƒ Drop ์ง์ ‘ ๊ตฌํ˜„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์กฐํ•ฉ์ด "์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ •์ ์œผ๋กœ ๋ณ€ํ˜•์ด ํ™•์ธ๋˜๋Š” ์—ด๊ฑฐ ํ˜•"๊ณผ ๊ฐ™์œผ๋ฉด ํŽธ์ง‘ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„ ์ดํ•ดํ–ˆ๋‹ค๋ฉด

ํŽธ์ง‘ 2 ๋Š” ์œ ๋‹ˆ์˜จ์ด ๋น„ํŠธ ๊ฐ€๋ฐฉ์œผ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋™์•ˆ ์•ˆ์ „ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ RFC 1897์˜ ๋ชจ๋ธ ํ•˜์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค (๋ถ€๋ถ„ ํ• ๋‹น ํ›„์— "๋ฆฌํ”„"์กฐ๊ฐ bool-1, u8-1, u8-2, bool-2 ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค).

์™€ - ์šฐ๋ฆฌ๊ฐ€์ด ์œ ํšจ ํ•  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—, ๋‚˜๋Š” @๊ฐ€ OLI-OBK ๋ฏธ๋ฆฌ ์ˆ˜ํ‘œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ์ด ๋ฐ˜์˜ ์ƒ๊ฐ https://github.com/rust-lang/rust/pull/51361์ด ํ•ฉ๋ณ‘์ด ๊ฑฐ๋ถ€ ๋  ๊ฒƒ์ด๋‹ค miri.

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

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

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๊ทผ๋ณธ์ ์ธ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @rkruppe์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
๋…ธ์กฐ์˜ ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” ๋…ธ์กฐ๊ฐ€ ํ˜„์žฌ
ํ”„๋กœ๊ทธ๋žจ์ด ์ฝ๊ณ  ์žํ•˜๋Š” ๋ฐ์ดํ„ฐ.

๊ทธ๋Ÿฌ๋‚˜ AFAIK์ด ๋ฌธ์ œ๋Š” ์ •์  ๋ถ„์„์œผ๋กœ "๋กœ์ปฌ"๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ
์ ์–ด๋„ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„์„ ๋งˆ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ
ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ...์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ํ…Œ์ด๋ธ”์— ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ๋ฌด์—‡์„
์ œ์•ˆ ๋œ ์ •ํ™•ํ•œ ์†”๋ฃจ์…˜์ด ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋ฅผ ์‚ฌ๋‚˜์š”? C์—์„œ ๋…ธ์กฐ๋ฅผ๋ฐ›๋Š”๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Rust ๋ฐ C ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š๊ณ 
์ •์  ๋ถ„์„์€ ์‹ค์ œ๋กœ ๋…์ž๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๊นŒ?

@gnzlbg ์šฐ๋ฆฌ๊ฐ€ ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ณด์žฅ์€ @petrochenkov ๊ฐ€ ์œ„์— ์“ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •์  ๊ฒ€์‚ฌ๋Š” ์•ˆ์ „ํ•œ ์ž‘์—… (์˜ˆ : ํ• ๋‹น ๋˜๋Š” ๋ถ€๋ถ„ ํ• ๋‹น)์ด ๊ณต์šฉ์ฒด๋ฅผ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ด๋™ ํ™•์ธ์—†์ด ์œ ๋‹ˆ์˜จ์€ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋ฌดํšจ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ œ์•ˆ์€ ๋‚˜์œ ์ฝ๊ธฐ๋กœ๋ถ€ํ„ฐ๋„ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋ฟก ๋นต๋€จ

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

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

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

๋ฟก๋ฟก

๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” 1) ๋…ธ์กฐ 2) ๋น„ ๋…ธ์กฐ์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

let x: T;
let y = x.field;

์ €์—๊ฒŒ ๋Œ€๋‹ต์€ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ช…๋ฐฑํ•œ "์•„๋‹ˆ์˜ค"์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ T ์˜ "union"-ness์— ๊ด€๊ณ„์—†์ด Rust๊ฐ€ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฐฉ์ง€ํ•˜๊ณ ์žํ•˜๋Š” ์˜ค๋ฅ˜์˜ ์ „์ฒด ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋™ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ฒด๊ณ„๋ฅผ ๊ฐ€์ ธ์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋™ ๊ฒ€์‚ฌ๊ธฐ (๋ฐ ์ฐจ์šฉ ๊ฒ€์‚ฌ๊ธฐ)๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„๋“œ ๋ณ„ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ณ„ํš์€ "๊ตฌ์กฐ์ฒด + (de) ์ดˆ๊ธฐํ™” / ๋นŒ๋ ค์˜จ ํ•„๋“œ์™€ ๋™์ผํ•œ ๊ทœ์น™๋„ (de) ์ดˆ๊ธฐํ™” / ๋นŒ๋ ค์ฃผ๋Š” ํ•„๋“œ ".
์ด ๊ฐ„๋‹จํ•œ ๊ทœ์น™์€ ๋ชจ๋“  ์ •์  ๊ฒ€์‚ฌ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

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

์ด ์‚ฌ๋ก€๋Š” @joshtriplett์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

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

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

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

์ด ์ฝ”๋“œ๋Š” 1) ๋…ธ์กฐ 2) ๋น„ ๋…ธ์กฐ์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

let x: T;
let y = x.field;

์ €์—๊ฒŒ ๋Œ€๋‹ต์€ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ช…๋ฐฑํ•œ "์•„๋‹ˆ์˜ค"์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ T ์˜ "union"-ness์— ๊ด€๊ณ„์—†์ด Rust๊ฐ€ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฐฉ์ง€ํ•˜๊ณ ์žํ•˜๋Š” ์˜ค๋ฅ˜์˜ ์ „์ฒด ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ํ™•์ธํ•˜๋Š”์ด ์ˆ˜์ค€์€ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋™ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ฒด๊ณ„๋ฅผ ๊ฐ€์ ธ์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋™ ๊ฒ€์‚ฌ๊ธฐ (๋ฐ ์ฐจ์šฉ ๊ฒ€์‚ฌ๊ธฐ)๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„๋“œ ๋ณ„ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ณ„ํš์€ "๊ตฌ์กฐ์ฒด + (de) ์ดˆ๊ธฐํ™” / ๋นŒ๋ ค์˜จ ํ•„๋“œ์™€ ๋™์ผํ•œ ๊ทœ์น™๋„ (de) ์ดˆ๊ธฐํ™” / ๋นŒ๋ ค์ฃผ๋Š” ํ•„๋“œ ".
์ด ๊ฐ„๋‹จํ•œ ๊ทœ์น™์€ ๋ชจ๋“  ์ •์  ๊ฒ€์‚ฌ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ดํ•ดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ด ์ถ”๊ฐ€ ์กฐ๊ฑด์€ ๊ณต์šฉ์ฒด์— ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ๋ก€๋Š” @joshtriplett์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

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

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

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

์ด๋Ÿฌํ•œ '์•ˆ์ „ํ•˜์ง€ ์•Š์€ "์ œ 3 ์ž"์˜๋ฏธ์—๋Š” "FFI์—์„œ ํ†ตํ•ฉ ์–ป๊ธฐ"๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ์ด๋Š” ์™„์ „ํžˆ ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

union Event {
    event_id: u32,
    event1: Event1,
    event2: Event2,
    event3: Event3,
}

struct Event1 {
    event_id: u32, // always EVENT1
    // ... more fields ...
}
// ... more event structs ...

match u.event_id {
    EVENT1 => { /* ... */ }
    EVENT2 => { /* ... */ }
    EVENT3 => { /* ... */ }
    _ => { /* unknown event */ }
}

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜์žˆ๋Š” ์™„์ „ํžˆ ์œ ํšจํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

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

์ด ์ฝ”๋“œ๋Š” 1) ๋…ธ์กฐ 2) ๋น„ ๋…ธ์กฐ์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
์ €์—๊ฒŒ ๋Œ€๋‹ต์€ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ช…๋ฐฑํ•œ "์•„๋‹ˆ์˜ค"์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ T์˜ "๊ฒฐํ•ฉ"์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด Rust๊ฐ€ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฐฉ์ง€ํ•˜๊ณ ์žํ•˜๋Š” ์˜ค๋ฅ˜์˜ ์ „์ฒด ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„์š”.

์œ ๋‹ˆ์˜จ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ณ„ํš์€ "๊ตฌ์กฐ์ฒด + (de) initialization / borrow of a field also (de) initializes / borrows its sibling fields"์™€ ๋™์ผํ•œ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.)

์™€. ๊ตฌ์กฐ์ฒด ๊ทœ์น™ ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ•„๋“œ๊ฐ€ ๋ถ„๋ฆฌ ๋˜์–ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ

1) ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  2) ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ณต์šฉ์ฒด์— ์†ํ•œ ์˜์—ญ์— ์ž„์˜์˜ ์ž˜๋ชป๋œ ๋ฐ”์ดํŠธ๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๊ณต์šฉ์ฒด "๋ฆฌํ”„"ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ž๋™์œผ๋กœ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋™์  ์ฒดํฌ ๋ถˆ๊ฐ€๋Šฅ (์ตœ์†Œํ•œ 1 ๊ฐœ ์ด์ƒ์˜ ํ•„๋“œ๊ฐ€ ์žˆ๊ณ  const-evaluator ์™ธ๋ถ€์˜ ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ) ๋ณด์žฅ์ด์ง€๋งŒ ์šฐ์„  ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋Œ€์ƒ์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํƒ€๋‹น์„ฑ ๊ฐ€์ •์ด ๋™์ ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•œ (์ฃผ์–ด์ง„ ์œ ํ˜• ์ •๋ณด) ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ miri์—์„œ CTFE๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, "์ „์ฒด"miri ์‹คํ–‰ (์˜ˆ : ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ) ์ค‘์—๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ผ์ข…์˜ ์ƒˆ๋‹ˆ ํƒ€์ด ์ € ๋˜๋Š” Rust๊ฐ€ debug_assert! ๋ฐฉ์ถœํ•˜๋Š” ๋ชจ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์žฅ์†Œ์—์„œ ์œ ํšจ์„ฑ ๋ถˆ๋ณ€์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
C์˜ ์ฒดํฌ ํ•  ์ˆ˜์—†๋Š” ๊ทœ์น™์— ๋Œ€ํ•œ ๊ฒฝํ—˜์€ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ถฉ๋ถ„ํ•œ ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทœ์น™์ด ๋ฌด์—‡์ธ์ง€ ์‹ค์ œ๋กœ ์ดํ•ดํ•˜๊ณ  ๋ช…ํ™•ํžˆํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋™์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ์—๋„ "๋™์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜์žˆ๋Š”"๋ณ€ํ˜• (๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ์ธก๋ฉด์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” ์šด์˜ ์˜๋ฏธ๋ก )์ด ๋‚˜ํƒ€๋‚˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ณต๋ฆฌ์  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์‚ฌ์šฉ ๋œ ๋ชจ๋ธ ( "ouf of thin air problem"์ด ์—ฌ๊ธฐ์„œ ํ‚ค์›Œ๋“œ ์ž„).

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

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

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

๊ทธ ๋ณด์ฆ ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ์‚ฌ๋‚˜์š”? ์‹ค์ œ๋กœ ์–ด๋””์—์„œ ๋„์›€์ด๋ฉ๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋‚ด๊ฐ€ ๋ณด๋Š” ๊ฒƒ์€ ๋ชจ๋‘๊ฐ€ ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ์กฐ์‹ฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์šฐ๋ฆฌ ๊ตญ๋ฏผ์ด ๊ทธ๋กœ๋ถ€ํ„ฐ ์–ป๋Š” ํ˜œํƒ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

์•ž์œผ๋กœ ๋” ๋งŽ์€ ํƒœ๊ทธ๋กœ ๋ช…์‹œ ์ ์œผ๋กœ ํ™•์žฅ ํ•  ์ˆ˜์žˆ๋Š” C ์Šคํƒ€์ผ ํƒœ๊ทธ ๊ฒฐํ•ฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ํ•ด๋‹น ์œ ๋‹ˆ์˜จ์„ ์ฝ๋Š” C ๋ฐ Rust ์ฝ”๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•„๋“œ ์œ ํ˜•์„ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

@petrochenkov๊ฐ€ ์ œ์•ˆํ•œ ๋ชจ๋ธ์€ __non_exhaustive: () ํ•„๋“œ๋ฅผ ์œ ๋‹ˆ์˜จ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

์ด๊ฒƒ์€ ๋™์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์ตœ์†Œํ•œ> 1 ํ•„๋“œ๊ฐ€ ์žˆ๊ณ  const-evaluator ์™ธ๋ถ€์—์žˆ๋Š” ๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ) ๋ณด์žฅ

๊ธฐ๋ณธ ํƒ€๋‹น์„ฑ ๊ฐ€์ •์„ ๋™์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋ฟก๋ฟก

@petrochenkov๊ฐ€ ์ œ์•ˆํ•œ ๋ชจ๋ธ์€ __non_exhaustive : () ํ•„๋“œ๋ฅผ ์œ ๋‹ˆ์˜จ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ

์˜ˆ, ๊ทธ๊ฒƒ์ด ์ œ์•ˆ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“  ๋‹จ์ผ ์กฐํ•ฉ์— ์ฒด๊ณ„์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

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

๊ณต์šฉ์ฒด์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€

์ด๊ฒƒ์ด ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ธ ์ด์œ ๊ฐ€ ์ „ํ˜€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
FFI์—์„œ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๊ณต์šฉ์ฒด / "Rust enum emulation"์— ๋Œ€ํ•œ ๊ณต์šฉ์ฒด์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ด ํ™•์žฅ ์„ฑ์„ ๊ฐ€์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด repr(C) ๊ณต์šฉ์ฒด์— ๋Œ€ํ•ด ์ฐธ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ œ๊ฐ€ ๋ณธ ๊ฒƒ์—์„œ repr(Rust) ๊ณต์šฉ์ฒด (๋“œ๋กญ ์ œ์–ด, ์ดˆ๊ธฐํ™” ์ œ์–ด, ๋ณ€ํ™˜)๋Š” ๊ฐ‘์ž๊ธฐ "์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ณ€ํ˜•"์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@petrochenkov ๋‚˜๋Š”, ๋‚˜๋Š” "์ฐจ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํœด์‹"๋ฉฐ "๊ธฐ๋ณธ ์œ ์Šค ์ผ€์ด์Šค ํœด์‹"๋ง์„ํ•˜์ง€ ์•Š์•˜๋‹ค. FFI๋Š” ๊ณต์šฉ์ฒด์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ชจ๋“  ์„ธํŠธ์˜ ํ•ฉ์ง‘ํ•ฉ (heh;))์„ ์ทจํ•˜์‹ญ์‹œ์˜ค.

"์œ ๋‹ˆ์˜จ์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ณ€ํ˜•์˜ ๊ฐ€๋Šฅํ•œ ๊ฐ’์˜ ํ•ฉ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ์ง„์ˆ ์—๋Š” ํ™•์‹คํžˆ ๋งค๋ ฅ์ ์ธ ๋ช…๋ฐฑ ํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„์‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ œ์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๋‹ค์Œ์ด ํ•ฉ๋ฒ•์ ์ด์–ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

union F {
  x: (u8, bool),
  y: (bool, u8),
}
fn foo() -> F {
  let mut f = F { x: (5, false) };
  unsafe { f.y.1 = 17; }
  f
}

์‚ฌ์‹ค ์ด๊ฒƒ์€ unsafe ์กฐ์ฐจ ํ•„์š”๋กœํ•˜๋Š” ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋ฟก๋ฟก

์‚ฌ์‹ค ์ด๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€๋„ ์•Š์€ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด MIR ๊ธฐ๋ฐ˜์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๊ธฐ ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด์ „ HIR ๊ธฐ๋ฐ˜์—์„œ๋Š” ํ™•์‹คํžˆ ๊ฒ€์‚ฌ๊ธฐ ์ œํ•œ / ๋‹จ์ˆœํ™”์˜€์Šต๋‹ˆ๋‹ค. expr1.field = expr2 ํ˜•์‹์˜ ์‹๋งŒ ๊ฐ€๋Šฅํ•œ "ํ•„๋“œ"๋กœ ๋ถ„์„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ• ๋‹น "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์˜ตํŠธ ์•„์›ƒ, ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๋…ธ์กฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ผ๋ฐ˜์ ์ธ"ํ˜„์žฅ ์ ‘๊ทผ "์œผ๋กœ ๋ณด์ˆ˜์ ์œผ๋กœ ์ทจ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/issues/52786#issuecomment -408645420์˜ ๋Œ“๊ธ€์— ๋‹ต๋ณ€ :

๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ Wrap<T> ์˜ ๊ณ„์•ฝ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ ˆ์ด์•„์›ƒ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ข‹์•„,์ด ์ž…์žฅ์€ ์ดํ•ด๋œ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ, ๋‚ด๋ถ€์—์ด ๋ฐฉ๋ฒ• Wrap ์˜์˜ ๋ชจ๋“ˆ ๊ตฌํ˜„ Wrap<T> ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ˆ„์„คํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ชจ๋“ˆ์€, ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ์‹œ์ ์œผ๋กœ, ๊ทธ๊ฒƒ์œผ๋กœ "์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฐ’"์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ์ปดํŒŒ์ผ๋Ÿฌ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์šฐ์„ , ํ•„๋“œ๊ฐ€ ๋น„๊ณต๊ฐœ์ธ์ง€ ๊ณต๊ฐœ์ธ์ง€์— ๊ด€๊ณ„์—†์ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฐ’์„ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์›์‹œ ํฌ์ธํ„ฐ ๋˜๋Š” FFI์˜ ๋‹ค๋ฅธ ์ชฝ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜๋ฉฐ ์ „์ฒด ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ๋งŒ ์žˆ์œผ๋ฉด ํ•„๋“œ ์•ก์„ธ์Šค์—†์ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œํ•œ๋˜๋Š” ํ•„๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ์ ‘๊ทผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•ด์„ ํ•œ๋Œ€๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์€ private ํ•„๋“œ (union ๋˜๋Š” struct์—์„œ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ)๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ž„์˜์˜ ๋ถˆ๋ณ€์„ ์•”์‹œํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ชจ๋“  ์ž‘์—… (์ง์ ‘ ๋˜๋Š” ์™€์ผ๋“œ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ถˆ๋ณ€์„ ์ž ์žฌ์ ์œผ๋กœ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— UB๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๊ณต์šฉ์ฒด์— ๋‹จ์ผ ๊ฐœ์ธ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ตฌํ˜„ ์ž (์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„๋‹˜)๋Š” ํƒ€์‚ฌ๊ฐ€ ํ•ด๋‹น ๊ณต์šฉ์ฒด์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฐ’์„ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ์–ด๋–ค ์˜๋ฏธ์—์„œ ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ "๊ธฐ๋ณธ ํ†ตํ•ฉ ๋ฌธ์„œ ์ ˆ"์ž…๋‹ˆ๋‹ค.
-(๊ธฐ๋ณธ๊ฐ’) ๊ณต์šฉ์ฒด์— private ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .
-๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋ฌธ์„œ๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ๊ธˆ์ง€ ํ•˜์ง€ ์•Š๋Š” ํ•œ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ๊ณต์šฉ์ฒด์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์ผ๋ถ€ ์œ ๋‹ˆ์˜จ์ด ์˜ˆ์ƒ ํ•„๋“œ์— ๋Œ€ํ•œ pub ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ’์„ ๊ธˆ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ (์˜ˆ : ํ•ด๋‹น ํ•„๋“œ์— ์ž์ฒด ๋ถˆ๋ณ€์„ฑ์ด์—†๋Š” ๊ฒฝ์šฐ) ์—ฌ์ „ํžˆ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก
์ด๊ฒƒ์ด ๋‹น์‹ ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๊นŒ?

์ด์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ?

mod m {
    union MyPrivateUnion { /* private fields */ }
    extern {
        fn my_private_ffi_function() -> MyPrivateUnion; // Can return garbage (?)
    }
}

๋‚ด๊ฐ€ ํ•ด์„ ํ•œ๋Œ€๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์€ private ํ•„๋“œ (union ๋˜๋Š” struct์—์„œ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ)๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ž„์˜์˜ ๋ถˆ๋ณ€์„ ์•”์‹œํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ชจ๋“  ์ž‘์—… (์ง์ ‘ ๋˜๋Š” ์™€์ผ๋“œ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ถˆ๋ณ€์„ ์ž ์žฌ์ ์œผ๋กœ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— UB๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, ๊ทธ๊ฑด ๋‚ด๊ฐ€ ์˜๋ฏธ ํ•œ๊ฒŒ ์•„๋‹ˆ์•ผ.

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

  • ์œ ํ˜•์˜ "๋ ˆ์ด์•„์›ƒ ์ˆ˜์ค€ ๋ถˆ๋ณ€"(๋˜๋Š” "๊ตฌ๋ฌธ ๋ถˆ๋ณ€")์€ ์œ ํ˜•์˜ ๊ตฌ๋ฌธ ๋ชจ์–‘์— ์˜ํ•ด ์™„์ „ํžˆ ์ •์˜๋ฉ๋‹ˆ๋‹ค. " &mut T is non-NULL and alignment", " bool is 0 ๋˜๋Š” 1 ", " ! ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์žˆ๋‹ค". ์ด ์ˆ˜์ค€์—์„œ *mut T ๋Š” usize ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ชจ๋“  ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ์ดˆ๊ธฐํ™” ๋œ ๊ฐ’์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋…ผ์˜๋ฅผ์œ„ํ•œ ์ฐจ์ด ์ž„). ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๊ตฌ์กฐ์  ์žฌ๊ท€์— ์˜ํ•ด ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ถˆ๋ณ€์„ ์ฒ ์žํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด์˜ ๋ ˆ์ด์•„์›ƒ ์ˆ˜์ค€ ๋ถˆ๋ณ€์€ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๋ถˆ๋ณ€์„ ์œ ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์‹œ์„ฑ์€ ์—ฌ๊ธฐ์„œ ์—ญํ• ์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Violating the layout-level invariant is instantaneous UB. This is a statement we can make because we have defined this invariant in very simple terms, and we make it part of the definition of the language itself. We can then exploit this UB (and we already do), e.g. to perform enum layout optimizations.
  • ์œ ํ˜•์˜ "์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ์ˆ˜์ค€ ๋ถˆ๋ณ€"(๋˜๋Š” "์˜๋ฏธ ์  ๋ถˆ๋ณ€")์€ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š”์ด๋ฅผ ํ‘œํ˜„ํ•  ์–ธ์–ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ถˆ๋ณ€์„ฑ์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฉฐ ์–ธ์–ด ์ •์˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ถˆ๋ณ€์ด ๋ฌด์—‡์ธ์ง€์กฐ์ฐจ ๋งํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ถˆ๋ณ€ UB๋ฅผ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! ์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ถˆ๋ณ€์„ ๊ฐ€์ง€๊ณ ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์€ ์œ ์šฉํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค : ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๋‚œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์ผ๋‹ค.

    ์ปค์Šคํ…€, ์‹œ๋งจํ‹ฑ ๋ถˆ๋ณ€๊ณผ UB ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์™ธ๋ž˜ ์ฝ”๋“œ์— ์˜ํ•ด ๋ณด์กด๋˜๋Š” ์‹œ๋งจํ‹ฑ ๋ถˆ๋ณ€์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์Œ์„ ์„ ์–ธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Vec ์˜ ํฌ๊ธฐ ํ•„๋“œ์— ์ž„์˜์˜ ํ•ญ๋ชฉ์„ ๋„ฃ๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๊ณ  ๋งํ–ˆ์ง€๋งŒ (๋•Œ๋กœ๋Š” unsound ๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค)-์ •์˜ ๋˜์ง€ ์•Š์€ ๋™์ž‘์€ &mut ZST ๋Œ€ํ•œ ๋ณ„์นญ ๊ทœ์น™์— ๋Œ€ํ•œ ์„ค๋ช… ์ž…๋‹ˆ๋‹ค. ๋งค๋‹ฌ๋ ค์žˆ๋Š” ์ž˜ ์ •๋ ฌ ๋œ null์ด ์•„๋‹Œ &mut ZST ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ฆ‰๊ฐ์ ์ธ UB๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฑฐ๋‚˜ ๋ถˆ๊ฑด์ „ํ•ฉ๋‹ˆ๋‹ค.

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


์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ’์ด ์—†๋‹ค๋Š” ๋žฉ์Šค ๊ณ„์•ฝ์˜ ์ผ๋ถ€๊ฐ€ ํ•„๋“œ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ์กฐ์ฒด์˜ ๊ณต์šฉ ํ•„๋“œ ๋Š” ํ•„๋“œ ์œ ํ˜• ์˜

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

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


์ด๊ฒƒ์€ ๋‚ด๋ถ€์ ์œผ๋กœ, Wrap์˜ ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ Wrap์˜ ๊ตฌํ˜„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“ˆ์€ "์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฐ’"์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ˆ„์„คํ•˜์ง€ ์•Š์œผ๋ฉด ์ž„์‹œ๋กœ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์˜ณ์€. (๊ณตํ™ฉ ์•ˆ์ „์€ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์ด์ง€๋งŒ ์•„๋งˆ ์•Œ๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ Vec ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let sz = self.size;
self.size = 1337;
self.size = sz;

๊ทธ๋ฆฌ๊ณ  UB๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


mod m {
    union MyPrivateUnion { /* private fields */ }
    extern {
        fn my_private_ffi_function() -> MyPrivateUnion; // Can return garbage (?)
    }
}

๊ตฌ๋ฌธ ๋ ˆ์ด์•„์›ƒ ๋ถˆ๋ณ€์„ฑ ์ธก๋ฉด์—์„œ my_private_ffi_function ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ•จ์ˆ˜ ํ˜ธ์ถœ ABI์™€ ์„œ๋ช…์ด ์ผ์น˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •). ์˜๋ฏธ ๋ก ์  ์‚ฌ์šฉ์ž ์ •์˜ ๋ถˆ๋ณ€์˜ ๊ด€์ ์—์„œ, ์ด๋Š” ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.์ด ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•œ ์‚ฌ๋žŒ์€ ๋ถˆ๋ณ€์„ ์—ผ๋‘์—๋‘๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ์ด๋ฅผ ๊ณต์šฉ์ฒด ์ •์˜ ์˜†์— ๋ฌธ์„œํ™” ํ•œ ๋‹ค์Œ FFI ํ•จ์ˆ˜๊ฐ€ ๋ถˆ๋ณ€์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .

๋งˆ์ง€๋ง‰์œผ๋กœ &mut T ์ดˆ๊ธฐํ™” ์—ฌ๋ถ€์™€์‹œ๊ธฐ์™€ ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋‘ ์ข…๋ฅ˜์˜ ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค .

์•„์ง https://github.com/rust-lang/rust/issues/55149์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ถ”์  ํ•  ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ซ์•„์•ผํ•ฉ๋‹ˆ๊นŒ?

E0658์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์—ฌ๊ธฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.

error [E0658] : Copy ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ๊ณต์šฉ์ฒด๊ฐ€ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค (๋ฌธ์ œ # 32836 ์ฐธ์กฐ).

์ด๊ฒƒ์€ Copy ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ atomics์—์„œ ๋”์ฐํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/rust-lang/rust/issues/55149 ๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ์œ ๋‹ˆ์˜จ์—์„œ ManuallyDrop<AtomicFoo> ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Nightly๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋˜๋Š” union ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์•ˆ์„ ์ฐพ์Œ).

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ManuallyDrop ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  rustc๋Š” Atomic* ์ด Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์  ๋ฌธ์ œ๋ฅผ ์ƒˆ ๋ฌธ์ œ๋กœ ์ „ํ™˜ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰