rust-lang / rfcs # 1444์ ๋ํ ์ถ์ ๋ฌธ์ ์ ๋๋ค.
ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ :
Copy
๋ฅผ ๊ตฌํํ ์์๋ ์กฐ๊ฑด์ ๋ฌด์์
๋๊น? ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๋ณํ์ด ๋น ๋ณต์ฌ ์ ํ์ด๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น? ๋ชจ๋ ๋ณ์ข
?๋์ ์์ ์ ๋ฏธํด๊ฒฐ ๋ฌธ์ :
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]
์ผ๋ค :
๋นํ์ฑ ํตํฉ ํ๋์ ์ก์ธ์ค ํ ๋ ์ ์ํ๋ ๊ฒ๋ ์ ์ฉํฉ๋๋ค.
์ : UBunion 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์ ์ ์ฉ ํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๊ตฌ๋ ์ง ์ฐ๋ฆฌ๊ฐ ํฉ์์ ๋๋ฌํ๊ณ ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํ ์ ์๋์ง ํ์ธํ ์ ์๋๋ก ๋ฏธํด๊ฒฐ ์ง๋ฌธ๊ณผ ๊ธฐ๋ฅ์ ํ์ฌ ์ํฉ์ ๋ํ ์์ฝ์ ์ ๊ณต ํ ์ ์์ต๋๊น?
์๋
ํ์ธ์.
๋ด ๊ณํ์
Copy
ํ๋๊ฐ์๋ ๊ณต์ฉ์ฒด์ ์์ ํ๋ฅผ ์ ์ํ์ญ์์ค. ์ด๊ฒ์ ๋ชจ๋ FFI ์๊ตฌ๋ฅผ ๋ค๋ฃฐ ๊ฒ์
๋๋ค-FFI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ stable์์ ๊ณต์ฉ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. "POD"๊ณต์ฉ์ฒด๋ C / C ++์์ ์์ญ ๋
๋์ ์ฌ์ฉ๋์์ผ๋ฉฐ ์ ์ดํด๋๊ณ ์์ต๋๋ค (๋ชจ๋๋ก ์ ํ ๊ธฐ๋ฐ ์จ๋ฆฌ์ด์ฑ์ด์ง๋ง Rust์๋ ์์ต๋๋ค). ์๋ ค์ง ์ฐจ๋จ๊ธฐ๋ ์์ต๋๋ค.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 ํ์์ด ์ด๊ฒ์ ๋ณํฉ ํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ํ๊ทธ๊ฐ ์ง์ ๋ ๋๋จธ์ง ํ์ ๊ฒํ ์ ๋๋ค.
ํ์ฌ ๋์ด๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒํ ์๊ฐ ํฉ์์ ๋๋ฌํ๋ฉด ์ต์ข ์๊ฒฌ ๊ธฐ๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์์ง ์ ๊ธฐ๋์ง ์์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ์ธ์!
ํ๊ทธ ๋ ํ์์ด ๋์๊ฒ ์ค ์์๋ ๋ช ๋ น์ ๋ํ ์ ๋ณด๋ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
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๋ฅผ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
ํ๊ทธ๊ฐ ์ง์ ๋์ง ์์ ์ ๋์จ์ด ํ์ฌ 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์ ์ํํ๊ธฐ ์ํด ๊ณต์ฉ์ฒด๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
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
๊ตฌํํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ถ์ ๋ฌธ์ ๋ฅผ ์ ๋ฌธ์ ๋ก ์ ํํ๋๋ก ์ง์ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@nrc
๊ธ์, ํ์ ์งํฉ์ "FFI ๊ณต์ฉ์ฒด", "C ๊ณต์ฉ์ฒด"๋๋ "C ++ 11 ์ด์ ๊ณต์ฉ์ฒด"์ ๊ฐ์ ๋ค์ ๋ถ๋ช ํฉ๋๋ค. ๊ตฌ๋ฌธ์ด ์๋๋๋ผ๋ ๋ง์ ๋๋ค. ์ ์ ์ด๊ธฐ ๋ชฉํ๋์ด ํ์ ์งํฉ์ ์ต๋ํ ๋นจ๋ฆฌ ์์ ํํ์ฌ
winapi
์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋๋กํ๋ ๊ฒ์ด ์์ต๋๋ค.๋๋จธ์ง ํ์ ์งํฉ๊ณผ ๊ทธ ๊ตฌํ์ ๋ํด ํน๋ณํ ๋ชจํธํ ๊ฒ์ ์์ต๋๋ค. ์ด๋ ๊ธด๊ธํ์ง ์์ผ๋ฉฐ "Unions 1.2"RFC ํ๋ก์ธ์ค๊ฐ ์๋ฃ ๋ ๋๊น์ง ๋ถ๋ถ๋ช ํ ์๊ฐ์ ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค. ๋์ ๊ธฐ๋๋ ์ด๊ธฐ ๋ถ๋ถ ์งํฉ์ ์์ ํ ํ ํ 1, 2 ๋๋ 3 ์ฃผ๊ธฐ๋ก ๋๋จธ์ง ๋ถํ์ ์์ ํ์ํค๋ ๊ฒ์ ๋๋ค.