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)
ãã¹ãã©ã¯ã¿ãå®è¡ããŸããã f = Foo { g: Box::new(2) }
ã¯å®è¡ããŸããã ã€ãŸãã Box<i32>
巊蟺å€ã«å²ãåœãŠããšããã€ãã®ããã«ãããããçºçããŸããã Foo
巊蟺å€ã«å²ãåœãŠããšããããã¯çºçããŸããã
ãããã£ãŠãããªã¢ã³ããžã®å²ãåœãŠã¯ããã£ãŒã«ãã以åã«ãæå¹ãã§ãã£ããšããã¢ãµãŒã·ã§ã³ã®ãããªãã®ã§ããïŒ
@sfackler Drop
ã¿ã€ãã®å Žåããããããã¯ç§ã®ç解ã§ãã 以åã¯æå¹ã§ãªãã£ãå Žåã¯ã Foo
ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ãŒã ãŸãã¯ptr::write
ã䜿çšããå¿
èŠããããŸãã ç°¡åãªgrepããã¯ãRFCããã®è©³çŽ°ã«ã€ããŠæ瀺ããŠããããã«ã¯èŠããŸãããã Drop
巊蟺å€ã«æžã蟌ããšããã¹ãã©ã¯ã¿åŒã³åºããçºçãããšããäžè¬çãªã«ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹åãšèŠãªãããŸãã
ããããããªã¢ã³ããšã®ïŒmutãŠããªã³ã¯ç³žããã§ããå¿ èŠããããŸããïŒ
2016幎4æ8æ¥éææ¥ãScottOlsonnotifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
@sfackler https://github.com/sfacklerããããã¿ã€ãã®å Žåããããããã¯ç§ã®ã§ã
ç解ã 以åã¯æå¹ã§ãªãã£ãå Žåã¯ãFooã䜿çšããå¿ èŠããããŸã
ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ãŒã ãŸãã¯ptr :: writeã ç°¡åãªgrepããã¯ã
ãã ããRFCã¯ãã®è©³çŽ°ã«ã€ããŠæ瀺ããŠããŸããâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32836#issuecomment -207634431
2016幎4æ8æ¥åå3æ36å22ç§PM PDTã§ãã¹ã³ãããªã«ãœã³ã®[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)
ã¯ç°ãªããŸããåŸè
ã®å Žåãããããããªãããã«ããããšãã§ããªãããã§ãã ç§ã®ã¢ãããŒãã¯ããã»ã©é©ãã¹ãããšã§ã¯ãªããšæããŸãã
ãããæ°ããåé¡ã§ã¯ãããŸããã unsafe
ããã°ã©ããŒã¯ã foo
ãåæåãããŠãããã Drop
ã®å Žåã foo = bar
ãUBã§ããä»ã®ç¶æ³ã«ãã§ã«å¯ŸåŠããå¿
èŠããããŸãã
å人çã«ã¯ããŠããªã³ã§ããããã¿ã€ãã䜿çšããäºå®ã¯ãŸã£ãããããŸããã ãããã£ãŠãç§ã¯ãããããããšã®ã»ãã³ãã£ã¯ã¹ã«é¢ããŠé¡äŒŒã®å®å šã§ãªãã³ãŒããæ±ã£ã人ã ã«å®å šã«ä»»ããŸãã
ãŸãããŠããªã³ã§Dropã¿ã€ãã䜿çšããã€ããã¯ãªãã®ã§ãäžè²«ããŠããéããã©ã¡ãã®æ¹æ³ã§ãåé¡ãããŸããã
ãŠããªã³ãžã®å¯å€åç
§ã䜿çšããã€ããã¯ãããŸããããããã
Intoã§ãå¥åŠãªã¿ã°ãä»ããããããã®ã ã
2016幎4æ8æ¥ïŒéææ¥ïŒã«ãããŒã¿ãŒAtashianã®[email protected]ã¯æžããŸããïŒ
ãŸãããŠããªã³ã§ããããã¿ã€ãã䜿çšããã€ããã¯ãªãã®ã§ãã©ã¡ãã®æ¹æ³ã§ã䜿çšããŸãã
ãããäžè²«ããŠããéããç§ã«ãšã£ãŠéèŠã§ããâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32836#issuecomment -207653168
ããã¯æªè§£æ±ºã®è³ªåãšããŠæèµ·ããã®ã«è¯ãåé¡ã®ããã§ãã ã©ã¡ãã®ã¢ãããŒãã奜ããã¯ãŸã ããããŸããã
@nikomatsakis Dropãæã€ã¿ã€ãã®ãŠããªã³ãã£ãŒã«ãã«å²ãåœãŠãŠããã®ãã£ãŒã«ãã®ä»¥åã®æå¹æ§ãèŠæ±ããã®ã¯åä»ã ãšæãã®ãšåã@tsionã¯ã»ãšãã©é¿ããããªãããã§ãã ããã¯ãDropãå«ãåããŠããªã³ã«é 眮ããããã®lintãæå³çã«ç¡å¹ã«ããã³ãŒãã«é¢é£ããèœãšãç©ŽãããããªããšæããŸãã ïŒãããŠãããã«ã€ããŠã®ç°¡åãªèª¬æã¯ããã®ç³žããã®èª¬ææã«ããã¯ãã§ããïŒ
ãããŠã unsafe
ããã°ã©ããŒã¯ãå®å
šãªã³ãŒããæžãããã«a = b
drop_in_place(&mut a); ptr::write(&mut a, b)
ãæå³ããããšããã§ã«äžè¬çã«ç¥ã£ãŠããå¿
èŠãããããšãç¹°ãè¿ãè¿°ã¹ãããšæããŸãã ãŠããªã³ãã£ãŒã«ããåé€ããªãããšã¯ãåŠã¶ã¹ãäŸå€ã§ããã1ã€å°ãªããªãããšã¯ãããŸããã
ïŒæ³šïŒ a
ãã let a; a = b;
ããã«ããã§ã«åæåãããŠããªãããšã_éçã«_ããã£ãŠããå Žåãããããã¯çºçããŸãããïŒ
ããããããã¯ããªãéèªæãªè©³çŽ°ã§ãããããçµåã®Drop
ããªã¢ã³ãã«å¯ŸããŠã人ã
ã#[allow(..)]
ãªããã°ãªããªããšããããã©ã«ãã®èŠåãããããšããµããŒãããŸãã
@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 PM -0700ãã¹ã³ãããªã«ãœã³ã¯æ¬¡ã®ããã«æžããŠããŸãã
@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 }
@nikomatsakis
ãããããã©ã°ãèšå®ãããŠããå Žåããã¹ãã©ã¯ã¿ãå®è¡ããŸãã
ãããããšã«ãããã®ãããªæžã蟌ã¿ã¯æ··ä¹±ãæããšæãã®ã§ããªããããçŠæ¢ããªãã®ã§ããïŒ ãã€ã§ã*(&mut u.var) = val
ãŸãã
ç§ã®ãã€ã³ãã¯ã
=
ããã¹ãã©ã¯ã¿ã_åžžã«_å®è¡ããªããšããããšã ãã§ãã ã¿ãŒã²ãããåæåãããŠããããšãããã£ãŠãããã©ããã«ã€ããŠã®ç¥èã䜿çšããŸãã
@nikomatsakisç§ã¯ãã§ã«ããã«ã€ããŠèšåããŸããïŒ
ïŒæ³šïŒlet a; a = b;ãã®ããã«ãaããã§ã«åæåãããŠããªãããšãéçã«ããã£ãŠããå Žåãããããã¯çºçããŸãããïŒ
ããããç§ã¯ãããããã©ã°ã®åçãã§ãã¯ãèæ ®ããŠããªãã£ãã®ã§ãããã¯ç§ãèããŠãããããééããªãè€éã§ãã
@tsion
ãããããã©ã°ã¯ååçã§ã-ãŒãåããããããªããªã£ãåŸããããã¯codegenã®äžéšã§ãã ç§ãã¡ã¯ããããè¯ããããæ··ä¹±ãæãã®ã§ããã®ãããªæžã蟌ã¿ãçŠæ¢ãããšèšããŸãã
Drop
ã¿ã€ãããŠããªã³ã§èš±å¯ããå¿
èŠããããŸããïŒ ç§ãç©äºãæ£ããç解ããŠããå ŽåãRustã«ãŠããªã³ãããäž»ãªçç±ã¯ããŠããªã³ãæã€Cã³ãŒããšã€ã³ã¿ãŒãã§ã€ã¹ããããšã§ãããCã«ã¯ãã¹ãã©ã¯ã¿ãããããŸããã ä»ã®ãã¹ãŠã®ç®çã§enum
ãRustã³ãŒãã§
ãŠããªã³ã䜿çšããŠããããããçŠæ¢ããNoDrop
ã¿ã€ããå®è£
ããããã®æå¹ãªãŠãŒã¹ã±ãŒã¹ããããŸãã
ãŸãã drop_in_place
ãªã©ãä»ããŠæåã§ãã®ãããªã³ãŒããåŒã³åºãããšãã§ããŸãã
åã®ãªãã·ã§ã³ã¿ã€ããå®çŸ©ãããŠããªããããæžã蟌ã¿äžã«ãã£ãŒã«ãå€ãåé€ããããšã¯ééããªãééã£ãŠããŸãã
ãã£ãŒã«ãã»ãã¿ãŒãçŠæ¢ããããšã¯å¯èœã§ããïŒããããå®å šãªãŠããªã³ã®äº€æãå¿ èŠã§ããïŒ ãã®å ŽåããŠããªã³ã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ã¯äŒæã§äžåšãªã®ã§ãç§ã¯çããŸãïŒãã®ãããªè³ªåã解決ããããã®ä¿®æ£RFCãæåºããã®ã¯çŽ æŽããããã©ãŒã ã ãšæããŸãã å¿ èŠã«å¿ããŠããã®ãããªRFCPRãè¿ éã«è¿œè·¡ããããšããããããŸãã
@aturonããããšãã ãã®åé¡ã解決ããããã«ããããã®èª¬æãå«ãæ°ããRFC PRhttps ïŒ//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ã€ãã移åãããšããŸãã
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)
move_out_of(u.a)
ã¯åãªãmemcpy
ããã u.b
ã¯ãŸã£ããå€æŽãããªããããããããu.b
ã¯ãŸã åæåããå¿
èŠããããŸãã
2ïŒ A: !Copy, B: Copy, move_out_of(u.a)
ããã¯æãå¥åŠãªã±ãŒã¹ã§ãã ããããu.b
ãã Copy
ã«ãããããããåæåãããŠããªãç¶æ
ã«ããå¿
èŠããããŸãã Copy
å€ã¯åæåãããŠããªãå¯èœæ§ããããŸããïŒããšãã°ã let a: u8;
ïŒãç¶æ
ãåæåããããã®ããåæåãããŠããªããã®ã«å€æŽããããšã¯ãæ°ããããšã§ãã
@ retep998
ç§ã¯ãããFFIã®ããŒãºãšã¯å®å
šã«ç¡é¢ä¿ã§ããããšãç¥ã£ãŠããŸã:)
幞ããªããšã«ãããã¯ãããã«ãŒã§ã¯ãããŸãããããåçŽãªåäœãå®è£
ããä»é±æ«ã«PRãéä¿¡ããŸãã
@petrochenkovç§ã®æ¬èœã¯ãçµåã¯æ¬è³ªçã«ãããããã±ãããã§ãããšããããšã§ãã ããŒã¿ãåæåãããŠãããã©ãããããã³ãã®TrueTypeãäœã§ãããã远跡ããã®ã¯ãŠãŒã¶ãŒã®è²¬ä»»ã§ãã ããã¯ãçã®ãã€ã³ã¿ã®æ瀺察象ãšéåžžã«ãã䌌ãŠããŸãã
ããããããŒã¿ãåé€ã§ããªãçç±ã§ããããã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãå®å šã§ãªãçç±ã§ããããŸãïŒããšãã°ãããªã¢ã³ãã1ã€ãããªãå Žåã§ãïŒã
ãããã®èŠåã«ãããã³ããŒãå®è£
ãããŠããå Žåãçµåã¯Copy
ãå®è£
ããããšãæåŸ
ããŸãã ãã ããæ§é äœ/åæåãšã¯ç°ãªããå
éšã®ãµããã£ãã§ãã¯ã¯ãããŸãããå¿
èŠã«å¿ããŠããã€ã§ãå
±çšäœåã®ã³ããŒãå®è£
ã§ããŸãã
æ確ã«ããããã«ããã€ãã®äŸãæããŸãããïŒ
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
ã䜿çšããå¿
èŠããããŸãã
ç·šéïŒãªããã®ãããªåããçŠæ¢ããã®ããç§ã¯å®éã«ã¯å®å šã«ã¯ããããŸããã 移åããããã䜿çšããå¿ èŠããã£ãå¯èœæ§ããããŸãããŸãã¯ãééããç¯ãããããã移åããããæ確ã«ããæ¹ããããšæããããããããããŸããã ããã§æŽå²ãæãåºãã®ã«èŠåŽããŠããŸãã
@nikomatsakis
ç§ã®æ¬èœã¯ãçµåã¯æ¬è³ªçã«ãããããã±ãããã§ãããšããããšã§ãã
ããã©ããããããç§ã¯ããã®ãããªå±éºãªæ§æã«å¯ŸããŠãçµåã®å 容ã«ã€ããŠã§ããã ãå€ãã®ä¿èšŒãäžããããšæããŸãã
解éã¯ããŠããªã³ã¯å€å¥åŒãããããªãåæåã§ãããšããããšã§ããã€ãŸãããã€ã§ããŠããªã³ã®ããªã¢ã³ãã®å°ãªããšã1ã€ãæå¹ãªå€ãæã€ããšãä¿èšŒã§ããŸãïŒå®å šã§ãªãã³ãŒããå«ãŸããŠããå Žåãé€ãïŒã
çŸåšã®å®è£ ã®ãã¹ãŠã®åçš/移åã«ãŒã«ã¯ãã®ä¿èšŒããµããŒãããŸãããåæã«ããã¯æãä¿å®çãªè§£éã§ããããå®å šãªãæ¹æ³ã®ãããããå®è¡ã§ããŸãïŒããšãã°ãåãã¿ã€ãã®ãã£ãŒã«ããæã€ãŠããªã³ãžã®å®å šãªã¢ã¯ã»ã¹ãèš±å¯ããŸããããã¯æ¬¡ã®ããã«ãªããŸãã䟿å©ãªïŒãŸãã¯å°æ¥ãRustãŠããªã³ã®çµéšãããã«éãŸããããããã±ãããã®æ¹æ³ã
å®éã«ã¯ã httpsïŒ //github.com/rust-lang/rust/pull/36016#issuecomment -242810887ã§èª¬æãããŠããããã«ãããã«ä¿å®çã«ããããšæã
@petrochenkov
解éã¯ããŠããªã³ã¯å€å¥åŒãããããªãåæåã§ãããšããããšã§ããã€ãŸãããã€ã§ããŠããªã³ã®ããªã¢ã³ãã®å°ãªããšã1ã€ãæå¹ãªå€ãæã€ããšãä¿èšŒã§ããŸãïŒå®å šã§ãªãã³ãŒããå«ãŸããŠããå Žåãé€ãïŒã
ãŠããªã³ã䜿çšããå Žåããã£ãŒã«ããžã®ãã¹ãŠã®ã¢ã¯ã»ã¹ãå®å šã§ã¯ãªããããå®å šã§ãªãã³ãŒããåžžã«å«ãŸããããšã«æ³šæããŠãã ããã
ç§ã®èãæ¹ã¯äŒŒãŠãããšæããŸãã åºæ¬çã«ããŠããªã³ã¯åæåã®ãããªãã®ã§ãããåæã«è€æ°ã®ããªã¢ã³ãã«å«ããããšãã§ããŸãã æå¹ãªããªã¢ã³ãã®ã»ããã¯ãã³ã³ãã€ã©ã«ã¯ã©ã®æç¹ã§ãèªèãããŠããŸããããã»ããã空ã§ããïŒã€ãŸããåæåãåæåãããŠããªãïŒããšããããå ŽåããããŸãã
ãããã£ãŠã some_union.field
䜿çšã¯ãåºæ¬çã«ãæå¹ãªããªã¢ã³ãã®ã»ããã«çŸåšfield
å«ãŸããŠãããšããæé»ã®ïŒãããŠå®å
šã§ã¯ãªãïŒã¢ãµãŒã·ã§ã³ã§ãããšèããŠããŸãã ããã¯ããããŒãã§ãã«ãŒçµ±åã®ä»çµã¿ãšäºææ§ãããããã§ãã ãã£ãŒã«ãx
ãåçšããŠããy
ã䜿çšããããšãããšãåºæ¬çã«ããŒã¿ãx
ãšy
ãšèšã£ãŠããããããšã©ãŒãçºçããŸãã ïŒãããŠããã¯åããããŸãïŒã ïŒå¯Ÿç
§çã«ãéåžžã®åæåã§ã¯ãäžåºŠã«è€æ°ã®ããªã¢ã³ãã«çæ¯ããããšã¯ã§ããŸãããããã¯ãåçšã«ãŒã«ãã©ã®ããã«å®è¡ããããã§ç¢ºèªã§ããŸãïŒã
ãšã«ãããèŠç¹ã¯ããŠããªã³ã®1ã€ã®ãã£ãŒã«ãããã移åããããšããåœé¢ã®åé¡ã¯ãå€ãä»ã®ããªã¢ã³ããšããŠè§£éããããšããã¯ãæå¹ã§ã¯ãªãããšãæå³ãããšæšæž¬ã§ãããã©ããã§ãã ãšã¯ãããã©ã¡ãã®æ¹æ³ã§ãè°è«ããã®ã¯ããã»ã©é£ããããšã§ã¯ãªããšæããŸãã ããã¯ã°ã¬ãŒãŸãŒã³ã ãšæããŸãã
ä¿å®çã§ããããšã®å±éºæ§ã¯ãããã§ãªããã°æå³ãããæå¹ã§ããå®å šã§ãªãã³ãŒããé€å€ããå¯èœæ§ãããããšã§ãã ããããç§ã¯ãã€ãå§ããŠãåŸã§ç·©ãããã©ããã決ããããšã§å€§äžå€«ã§ãã
ãŠããªã³ã«Copy
ãå®è£
ããããã«å¿
èŠãªæ¡ä»¶ã«ã€ããŠè©±ãåãå¿
èŠããããŸãããŸããå®å®åã®åã«å¯ŸåŠããŠææžåããããã«ãäžèšã®ç°è²ã®é åã®å®å
šãªãªã¹ããããããšã確èªããå¿
èŠããããŸãã
åºæ¬çã«ããŠããªã³ã¯åæåã®ãããªãã®ã§ãããåæã«è€æ°ã®ããªã¢ã³ãã«å«ããããšãã§ããŸãã
ãè€æ°ã®ããªã¢ã³ããã®è§£éã«å¯Ÿãã1ã€ã®è°è«ã¯ããŠããªã³ãå®æ°åŒã§ã©ã®ããã«åäœãããã§ãããããã®ãŠããªã³ã®å Žåãåžžã«åäžã®ã¢ã¯ãã£ããªããªã¢ã³ããç¥ã£ãŠãããã³ã³ãã€ã«æã®å€æãäžè¬çã«æªããããéã¢ã¯ãã£ããªããªã¢ã³ãã«ã¢ã¯ã»ã¹ã§ããŸããïŒã³ã³ãã€ã©ãããçš®ã®éšåçãªã¿ãŒã²ãããšãã¥ã¬ãŒã¿ã«å€ããããïŒã
ç§ã®è§£éã§ã¯ãå®è¡æã«éã¢ã¯ãã£ããªããªã¢ã³ãã¯ãŸã éã¢ã¯ãã£ãã§ããããŠããªã³ã®ã¢ã¯ãã£ããªããªã¢ã³ãïŒããå¶éçãªå®çŸ©ïŒãŸãã¯ãŠããªã³ã®ãã©ã°ã¡ã³ãå²ãåœãŠå±¥æŽïŒããææ§ã§ããããã䟿å©ïŒãšã¬ã€ã¢ãŠãäºææ§ãããå Žåã«ã¢ã¯ã»ã¹ã§ããŸãã
ãããã®ç°è²ã®é åã®å®å šãªãªã¹ããããããšã確èªããå¿ èŠããããŸã
ããã»ã©é ããªãå°æ¥ã«ããŠããªã³RFCãä¿®æ£ããã€ããã§ãïŒ ãåæåãã®è§£éã¯ãããªã楜ããçµæããããããŸãã
ã³ã³ãã€ã«æã®å€æã¯äžè¬çã«æªãã§ãïŒã³ã³ãã€ã©ãããçš®ã®éšåçãªã¿ãŒã²ãããšãã¥ã¬ãŒã¿ã«å€ããããšããŠããã®ã§ãªãéãïŒ
@petrochenkovããã¯ç§ã®Miriãããžã§ã¯ãã®ç®æšã®1ã€ã§ãã ããªã¯ãã§ã«æ žå€æãããŸããŸãªçã®ãã€ã³ã¿ãŒã·ã§ããã¬ã³ãè¡ãããšãã§ããŸãã Miriã«ãŠããªã³ãåŠçãããã®ã¯å°ãã®äœæ¥ã§ãïŒçã®ã¡ã¢ãªåŠçåŽã§ã¯äœãæ°ããããšã¯ãããŸããïŒã
ãããŠã @ eddybã¯ãrustcå®æ°è©äŸ¡ãMiriã®ããŒãžã§ã³ã«çœ®ãæããããšãæšé²ããŠããŸãã
@petrochenkov
ãè€æ°ã®ããªã¢ã³ããã®è§£éã«å¯Ÿãã1ã€ã®è°è«ã¯ãçµåãå®æ°åŒã§ã©ã®ããã«åäœãããã§ãã
å®æ°ã§ã®å ±çšäœã®äœ¿çšãæé©ã«ãµããŒãããæ¹æ³ã¯èå³æ·±ã質åã§ãããå®æ°åŒãå®è¡æã®åäœã®ãµãã»ããã«å¶éããããšã«åé¡ã¯ãããŸããïŒãšã«ãããããã¯åžžã«è¡ã£ãŠããããšã§ãïŒã ã€ãŸããã³ã³ãã€ã«æã«ç¹å®ã®ãã©ã³ã¹ãã¥ãŒããå®å šã«ãµããŒãã§ããªãå¯èœæ§ããããããšãã£ãŠãå®è¡æã«éæ³ã§ãããšã¯éããŸããã
ç§ã®è§£éã§ã¯ãå®è¡æã«éã¢ã¯ãã£ããªããªã¢ã³ãã¯ãŸã éã¢ã¯ãã£ãã§ããããŠããªã³ã®ã¢ã¯ãã£ããªããªã¢ã³ããšã¬ã€ã¢ãŠãäºææ§ãããå Žåã¯ã¢ã¯ã»ã¹ã§ããŸã
ããŒããç§ã¯ãããããŠããªã³ãããããã¹ãŠã®ããªã¢ã³ãã«åæã«å±ããŠãããšèšãããšãšã©ã®ããã«éãã®ããèããããšããŠããŸãã ãŸã éãã¯ããããŸããã :)
ãã®è§£éã¯ãäžè¬çã«åããšå¥åŠãªçžäºäœçšãæã£ãŠããããã«æããŸãã ããšãã°ãããŒã¿ããå®éã«ãXã§ããããããYãšããŠè§£éããããYãã¢ãã£ã³ã§ããå Žåãããã¯ãŸã Xã§ããïŒ
ãšã«ãããã©ã®åéã®åãã§ãçµåå šäœãæ¶è²»ããããšã¯ããããã®è§£éã®ãããããšäžèŽããŠãããšèŠãªãããšãã§ããã®ã¯åé¡ãªããšæããŸãã ããšãã°ããããªã¢ã³ãã®ã»ãããã¢ãããŒãã§ã¯ãå€ã移åãããšæ¢åã®ãã¹ãŠã®ããªã¢ã³ããéåæåããããšããèãæ¹ã§ãïŒãã¡ããã䜿çšããããªã¢ã³ãã¯æå¹ãªã»ããã®1ã€ã§ããå¿ èŠããããŸãïŒã ããªãã®ããŒãžã§ã³ã§ã¯ãããã¯ãã®ããªã¢ã³ãã«ãå€æãããããã«èŠããŸãïŒãããŠãªãªãžãã«ãæ¶è²»ããŸãïŒã
ããã»ã©é ããªãå°æ¥ã«ããŠããªã³RFCãä¿®æ£ããã€ããã§ãïŒ ãåæåãã®è§£éã¯ãããªã楜ããçµæããããããŸãã
ãããªèªä¿¡ïŒ ããªãã¯è©ŠããŠã¿ãã€ããã§ã;ïŒ
ããªããèããŠããå ·äœçãªå€æŽã«ã€ããŠãããå°ã詳ãã説æããŸããïŒ
ããªããèããŠããå ·äœçãªå€æŽã«ã€ããŠãããå°ã詳ãã説æããŸããïŒ
å®è£
ã®ãã詳现ãªèª¬æïŒã€ãŸããããè¯ãããã¥ã¡ã³ãïŒãããã€ãã®å°ããªæ¡åŒµïŒç©ºã®ãŠããªã³ãšãŠããªã³ãã¿ãŒã³ã®..
ãªã©ïŒããŠããªã³é²åã®2ã€ã®äž»èŠãªïŒççŸããïŒä»£æ¿æ¡-ããå®å
šã§å¶éã®å°ãªããã¹ã¯ã©ããã¹ããŒã¹ã解éãšãããå®å
šã§ããå¶éçãªãå€å¥åŒãäžæãªåæåã解é-ããã³ç§»å/åæåãã§ãã«ãŒã 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æ¥ããŽã¡ãã£ã Petrochenkov [email protected]
æžããŸããïŒ
éã¢ã¯ãã£ããªãŠããªã³ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ãããšãã«å®çŸ©ããããšã圹ç«ã¡ãŸã
UBãäŸãã°ãŠããªã³U {aïŒu8ãb :(ïŒ}
u = U {b :(ïŒ};
a = uaãšããŸãã //ããããUBãmem::uninitialized()
ããã®èªã¿åãã«çžåœããããããã¯ç¡éã«ããªãããŒãªé åã§ãã
â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32836#issuecomment -244154751
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABxXhi68qRITTFW5iJn6omZQQBQgzweNks5qlw4qgaJpZM4IDXsj
ã
ãã£ãŒã«ãã¢ã¯ã»ã¹ã¯åžžã«å®å šã§ã¯ãããŸãããïŒ
æšææ¥ã«ã2016幎9æ1æ¥ããŽã¡ãã£ã Petrochenkov [email protected]
æžããŸããïŒ
ããªããèããŠããå ·äœçãªå€æŽã«ã€ããŠãããå°ã詳ãã説æããŸããïŒ
å®è£ ã®ãã詳现ãªèª¬æïŒã€ãŸããããè¯ã
ããã¥ã¡ã³ãïŒãããã€ãã®å°ããªæ¡åŒµæ©èœïŒç©ºã®ãŠããªã³ã..ã€ã³ãŠããªã³ãªã©ïŒ
ãã¿ãŒã³ïŒããŠããªã³é²åã®2ã€ã®äž»èŠãªïŒççŸããïŒä»£æ¿æ¡-詳现
å®å šã§ã¯ãªããå¶éã®å°ãªããã¹ã¯ã©ããã¹ããŒã¹ãã®è§£éãšããå®å š
ããå¶éçãªãå€å¥åŒãäžæãªåæåãã®è§£é-ããã³
移å/åæåãã§ãã«ãŒãã³ããŒimplsãå®å šæ§ã«å¯Ÿãããããã®çµæ
ãã£ãŒã«ãã¢ã¯ã»ã¹ãªã©ã®â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ãã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ãã§ãã«ãŒãåæåã«æ°ã¥ããªãã£ãããã§ãã
ïŒç§ã¯ãã§ã«ãstructfieldãã®äœ¿çšã«ã€ããŠ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
ContextualããŒã¯ãŒãã¯ãã¢ãžã¥ãŒã«/ã¯ã¬ãŒãã«ãŒãã³ã³ããã¹ãã®å€éšã§ã¯æ©èœããŸããã
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 {}
}
ããªãåä»ãªäžè²«æ§ã®ç£èŽ ã®ããã§ãã
@nagisa
誀ã£ãŠå€ãããŒãžã§ã³ã®rustcã䜿çšããŠããŸããïŒ
playpenã§ããªãã®äŸã確èªãããšãããåäœããŸãïŒã¢ãžã¥ãã空ã®ãŠããªã³ããšã©ãŒïŒã
ãã®ç¹å®ã®ç¶æ³ããã§ãã¯ããå®è¡ãã¹ãã¹ãããããŸã-httpsïŒ//github.com/rust-lang/rust/blob/master/src/test/run-pass/union/union-backcomp.rsã
@petrochenkovãããç§ã¯play.rloã䜿çšããŸãããã stable
ãäœãã«æ»ã£ãããã§ãã ãããªããç§ãæ°ã«ããªãã§ãã ããã
çµåã¯æçµçã«ããã®ææ¡ããã®å±éºãªåéã®éªæªãªååã§ãã_å®å
šãªåé_ãæ¯æŽããå¿
èŠããããšæããŸãã
cc https://github.com/rust-lang/rfcs/issues/381#issuecomment -246703410
ããŸããŸãªåºæºã«åºã¥ããŠãå®å šãªçµåãã宣èšããæ¹æ³ãããããšã¯çã«ããªã£ãŠãããšæããŸãã
ããšãã°ããã¹ãŠåããµã€ãºã®ã³ããŒéãããããã£ãŒã«ãã®ã¿ãå«ããŠããªã³ã¯å®å šã®ããã§ãã ãã£ãŒã«ãã«ã©ã®ããã«ã¢ã¯ã»ã¹ããŠããäºæããªãããŒã¿ã衚瀺ãããå¯èœæ§ããããŸãããã¡ã¢ãªã®å®å šæ§ã®åé¡ãæªå®çŸ©ã®åäœã¯çºçããŸããã
@joshtriplettãŸããåæåãããŠããªãããŒã¿ãèªã¿åãããšãã§ããã¿ã€ãã«ãç©Žãããªãããšã確èªããå¿ èŠããããŸãã ç§ãèšãããã®ã¯ããåæåãããŠããªãããŒã¿ã¯ãäºæž¬ã§ããªãã©ã³ãã ããŒã¿ãŸãã¯SSHç§å¯éµã®ããããæªãæ¹ã§ããã
&T
ã³ããŒãšéããããã§ã¯ãããŸãããïŒ ãããusize
ãšã®ãå®å
šãªãçµåã«å
¥ãããšãäžæ£ãªåç
§ãžã§ãã¬ãŒã¿ãŒãã§ãããããŸãã ãããã£ãŠãã«ãŒã«ã¯ãããããå°ãå³æ Œã«ããå¿
èŠããããŸãã
ããšãã°ããã¹ãŠåããµã€ãºã®ã³ããŒéãããããã£ãŒã«ãã®ã¿ãå«ããŠããªã³ã¯å®å šã®ããã§ãã ãã£ãŒã«ãã«ã©ã®ããã«ã¢ã¯ã»ã¹ããŠããäºæããªãããŒã¿ã衚瀺ãããå¯èœæ§ããããŸãããã¡ã¢ãªã®å®å šæ§ã®åé¡ãæªå®çŸ©ã®åäœã¯çºçããŸããã
ããã¯åãªãäŸã§ãããæ·±å»ãªææ¡ã§ã¯ãªãããšãç解ããŠããŸããããããããã«é£ãããã瀺ãããã€ãã®äŸã次ã«ç€ºããŸãã
u8
ãšbool
ãµã€ãºã¯åãã§ãããã»ãšãã©ã®u8
å€ã¯bool
ã«å¯ŸããŠç¡å¹ã§ããããããç¡èŠãããšUBãããªã¬ãŒãããŸã&T
ãš&U
ã¯åããµã€ãºã§ããã¹ãŠã®T
ãšU
ã«å¯ŸããŠCopy + !Drop
ã§ãïŒäž¡æ¹ãŸãã¯ã©ã¡ããSized
ãªãéãïŒ uN
/ iN
ãšfN
éã®å€æã¯ãçŸåšãå®å
šã§ãªãã³ãŒãã§ã®ã¿å¯èœã§ãã ãã®ãããªæ žå€æã¯åžžã«å®å
šã§ãããšç§ã¯ä¿¡ããŠããŸãããããã¯å®å
šãªèšèªãæ¡å€§ããã®ã§ãç©è°ãéžããããããŸãããstruct Foo(Bar);
ãšBar
é§æŽèœïŒã¯ããã©ã€ãã·ãŒãå®å
šã«é¢é£ããäžå€æ¡ä»¶ãç¶æããããã«äœ¿çšãããå¯èœæ§ãããããã倧ããããšã§ã¯ãããŸããã@AmanieuãããæžããŠãããšããå éšã«ããã£ã³ã°ããªãããšã«ã€ããŠã®ã¡ã¢ãå«ãã
@cuviperãã€ã³ã¿ããŒãã®ãããªãã®ã®ããã«ãããã¬ãŒã³ãªå€ãããŒã¿ããå®çŸ©ããããšããŠããŸããã ããã§ããå®çŸ©ã¯åç §ãé€å€ããå¿ èŠããããŸãã èš±å¯ãããã¿ã€ãã®ã»ãããšãããã®ã¿ã€ãã®çµã¿åããããã¯ã€ããªã¹ãã«ç»é²ããæ¹ãããããç°¡åã§ãã
@rkruppe
u8ãšboolã®ãµã€ãºã¯åãã§ãããã»ãšãã©ã®u8å€ã¯boolã«ã¯ç¡å¹ã§ããããããç¡èŠãããšUBãããªã¬ãŒãããŸãã
ããèŠç¹ã; åãåé¡ãåæåã«ãåœãŠã¯ãŸããŸãã
ïŒTãšïŒUã®ãµã€ãºã¯åãã§ããã¹ãŠã®TãšUã«å¯ŸããŠã³ããŒ+ïŒããããã§ãïŒäž¡æ¹ãŸãã¯ã©ã¡ãããµã€ãºèšå®ãããŠããªãå ŽåïŒ
ç§ã¯ãããå¿ããŠããŸããã
uN / iNãšfNã®éã®æ žå€æã¯ãçŸåšãå®å šã§ãªãã³ãŒãã§ã®ã¿å¯èœã§ãã ãã®ãããªæ žå€æã¯åžžã«å®å šã§ãããšç§ã¯ä¿¡ããŠããŸãããããã¯å®å šãªèšèªãæ¡å€§ããã®ã§ãç©è°ãéžããããããŸããã
äž¡æ¹ã®ç¹ã§åæããŸããã ããã¯èš±å®¹ã§ããããã§ãã
ãã©ã€ãã·ãŒã®äŸµå®³ïŒããšãã°ãstruct FooïŒBarïŒ;ãšBarã®éã®ãããïŒã¯ãå®å šã«é¢é£ããäžå€æ¡ä»¶ãç¶æããããã«ãã©ã€ãã·ãŒã䜿çšãããå¯èœæ§ãããããã倧ããããšã§ã¯ãããŸããã
ã¿ã€ãã®å éšãããããªãå Žåãå éšãèŠä»¶ãæºãããŠãããã©ãããç¥ãããšã¯ã§ããŸããïŒå éšããã£ã³ã°ããªããªã©ïŒã ãããã£ãŠããã¹ãŠã®ã³ã³ããŒãã³ããååž°çã«ãã¬ãŒã³ãªå€ãããŒã¿ã§ããããããæ€èšŒããã®ã«ååãªå¯èŠæ§ãããããšãèŠæ±ããããšã§ããããé€å€ã§ããŸãã
uN / iNãšfNã®éã®æ žå€æã¯ãçŸåšãå®å šã§ãªãã³ãŒãã§ã®ã¿å¯èœã§ãã ãã®ãããªæ žå€æã¯åžžã«å®å šã§ãããšç§ã¯ä¿¡ããŠããŸãããããã¯å®å šãªèšèªãæ¡å€§ããã®ã§ãç©è°ãéžããããããŸããã
æµ®åå°æ°ç¹æ°ã«ã¯ãUBããããããã©ããè¡šçŸã§ããã·ã°ããªã³ã°NaNããããŸãã
@ retep998 Rustã¯ãæµ®åå°æ°ç¹ãã©ããã®ç¡å¹åããµããŒãããŠããªããã©ãããã©ãŒã ã§å®è¡ãããŸããïŒ ïŒããã§UBã®åé¡ã¯å€ãããŸããããçè«çã«ã¯ãã®åé¡ã解決ããããšãã§ããŸããïŒ
@petrochenkov
解éã¯ããŠããªã³ã¯å€å¥åŒãããããªãåæåã§ãããšããããšã§ããã€ãŸãããŠããªã³ã®ããªã¢ã³ãã®å°ãªããšã1ã€ãæå¹ãªå€ãæã£ãŠããããšããã€ã§ãä¿èšŒã§ããŸãã
ç§ã¯ãã®è§£éã«ãã©ãçãããšæããŸã-ãŸããããã¯_æ£ç¢ºã«_ã§ã¯ãããŸããã ç§ã¯ãã€ãã®ããã«ãããªããä¿ç®¡ããæç¹ã§æ±ºå®ãããããã€ãã®åæ³çãªå€çš®ãããã®ã§ããããä»ã§ãèããŠããŸãã å€ããŠããªã³ã«æ ŒçŽããããšã¯ãããããéåç¶æ
ãã«ããã®ãšå°ã䌌ãŠãããšæããŸããããã§ãå€ãã®æ³çãªè§£éã®1ã€ã«å€æãããå¯èœæ§ããããŸãã ããããç§ã¯ããããã®ããªã¢ã³ãã®1ã€ãã移åãããšãã«ãããããããã®1ã€ã ãã«ã匷å¶ããããã®äŸ¡å€ãæ¶è²»ããããšã«åæããŸãã ãããã£ãŠãåæåãå床䜿çšããããšã¯ã§ããŸããïŒãã®ã¿ã€ããCopy
ãªãå ŽåïŒã ã ããðãåºæ¬çã«ã
#[repr(C)]
ã«é¢ãã質åïŒ @pnkfelixãæè¿ç§ã«ææããããã«ãçŸåšã®ä»æ§ã§ã¯ãå
±çšäœã#[repr(C)]
ã§ãªãå Žåããã£ãŒã«ãx
æ ŒçŽããŠèªã¿åãããšã¯éæ³ã§ãããšè¿°ã¹ãŠããŸãããã£ãŒã«ãy
ãŸãã ããããããã¯ããã¹ãŠã®ãã£ãŒã«ããåããªãã»ããã§éå§ããå¿
èŠããªãããã§ãã
ããã«ã¯ããã€ãã®ãŠãŒãã£ãªãã£ããããŸããããšãã°ããµãã¿ã€ã¶ãŒã¯ãéåžžã®åæåïŒãŸãã¯æ§é äœ...ïŒïŒã®ããã«ãŠããªã³ãæ ŒçŽããå ¥åãããã®ãšåãããªã¢ã³ãã䜿çšããŠããããšã確èªããããšã§ããŠããªã³ãå®è£ ã§ããŸãã
_ããã_ããã¯äžçš®ã®ãããã¬ã³ã®ããã«èŠããŸãããããŠãŸããããã®reprã®1ã€ã¯ãããŸãã«ãå€ãã®äººã ãéçã§ããã«äŸåããã®ã§ãå®éã«ã¯_å®éã«_å€æŽããããšã決ããŠã§ããªãããšãä¿èšŒããŸãã
èãïŒ
@nikomatsakis
解éã¯ããŠããªã³ã¯å€å¥åŒãããããªãåæåã§ãããšããããšã§ããã€ãŸãããŠããªã³ã®ããªã¢ã³ãã®å°ãªããšã1ã€ãæå¹ãªå€ãæã£ãŠããããšããã€ã§ãä¿èšŒã§ããŸãã
ææªã®éšåã¯ããªã¢ã³ã/ãã£ãŒã«ããã©ã°ã¡ã³ãã§ããããŠããªã³ãçŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
ãã®ã³ãŒããæ€èšããŠãã ããïŒ
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
æå¹ãªããªã¢ã³ããæã€ç¶æ
ã«ãªããŸãã ã©ã察åŠããã°ããã®ããŸã èããŠããŸããã ãã®ãããªå²ãåœãŠãUBã«ããŸããïŒ è§£éãå€æŽããŸããïŒ ä»ã«äœããããŸããïŒ
@petrochenkov
ãã®ãããªå²ãåœãŠã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)]
ã«äœããã®ä¿èšŒãæäŸããå¿
èŠã¯ãªããšæããŸãããããã§ãã©ãŽã³ã«ãªã£ãŠãã ãããã®ãŸãŸã«ããŠãã ããã ããããã #[repr(C)]
ã§ã¯ãªããŠããªã³ã«å¯ŸããŠããã©ã«ãã§èŠåããããªã³ããçšæããã®ãæåã§ãããã
@ retep998 repr(Rust)
ãç¹å®ã®ã¬ã€ã¢ãŠãããªãŒããŒã©ãããä¿èšŒããªãããšã¯ç§ã«ã¯åççã ãšæããŸãã repr(Rust)
ã¯ãå®éã«ã¯ããŠããªã³ã®ã¡ã¢ãªäœ¿çšéïŒãæ倧ã®ã¡ã³ããŒä»¥äžãïŒã«é¢ãã人ã
ã®ä»®å®ãç Žã£ãŠã¯ãªããªãããšããå§ãããŸãã
Rustã¯ãæµ®åå°æ°ç¹ãã©ããã®ç¡å¹åããµããŒãããŠããªããã©ãããã©ãŒã ã§å®è¡ãããŸããïŒ
ããã¯å®éã«å°ããã®ã«æå¹ãªè³ªåã§ã¯ãããŸããã ãŸã第äžã«ããªããã£ãã€ã¶ãŒèªäœããã©ããè¡šçŸã®UBæ§ã«äŸåããäºæããªãæ¹æ³ã§ããã°ã©ã ãæžãçŽãå¯èœæ§ããããŸãã ããã«ãRustã¯FPç°å¢ã®å€æŽãå®éã«ã¯ãµããŒãããŠããŸããã
ããããããã¯äžçš®ã®ãããã¬ã³ã®ããã«æããŸãããŸããéçã§ã¯ããŸãã«ãå€ãã®äººã ãããã«äŸåãããããå®éã«ã¯æ±ºããŠå€æŽã§ããªãããšãä¿èšŒãããã®ã®1ã€ã§ãã
èãïŒ
åæåãä»ã®ãã£ãŒã«ãã§èšè¿°ãããŠããããšã蚌æãããŠãããšãã«ããã£ãŒã«ãããèªã¿åããè¡ãããå Žåã«ããã°ã©ã ãããŒãæ€æ»ãããŠãŒã¶ãŒã«èŠæ ãæãããã糞ãããªã©ãè¿œå ãããšãããã«åœ¹ç«ã¡ãŸã¹ã MIRããŒã¹ã®ç³žããã¯ãããç°¡åã«åŠçããŸãã CFGããŠããªã³ãã£ãŒã«ãããŒãã®åæ³æ§ã«ã€ããŠçµè«ãåºãããšãèš±å¯ããããŠãŒã¶ãŒããã¹ãç¯ããå Žåãæªå®çŸ©ã®åäœã¯ãRustreprèªäœIMOãæå®ããã«æå®ã§ããæåã®æ¹æ³ã§ãã
¹ïŒäººã ãäœããã®çç±ã§è²§ä¹äººã®å€èº«ãšããŠçµåã䜿ãå§ããå Žåã«ç¹ã«å¹æçã§ãã
å®éã«ã¯ããŠããªã³ã®ã¡ã¢ãªäœ¿çšéã«é¢ãã人ã ã®æ³å®ãç Žãã¹ãã§ã¯ãããŸããïŒãæ倧ã®ã¡ã³ããŒä»¥äžãïŒã
åæããŸããã ããšãã°ãäžéšã®ã¢ãŒããã¯ãã£ã§ã¯ã repr(Rust)
ãã®ããã·ã³ã¯ãŒãã®ãµã€ãºã«æ¡åŒµããããšã¯éåžžã«çã«ããªã£ãŠããŸãã
å®å®åã®åã«æ€èšããå¿ èŠããããããããªã1ã€ã®åé¡ã¯ã httpsïŒ//github.com/rust-lang/rust/issues/37479ã§ãã ææ°ããŒãžã§ã³ã®LLDBã§ã¯ããããã°ãŠããªã³ãæ©èœããªãå¯èœæ§ããããŸã:(
@alexcrichton GDBã§åäœããŸããïŒ
ç§ã®ç¥ãéããããã§ãã Linuxãããã¯ãã¹ããåé¡ãªãå®è¡ããŠããããã§ãã
ã€ãŸããRustããã¹ãŠã®é©åãªãããã°æ å ±ãæäŸããLLDBã«ã¯ãã°ããããŸãã è€æ°ã®ãããã¬ãŒã®1ã€ã«ãã°ããããå¥ã®ãããã¬ãŒã«ã¯ååšããªãããããããå®å®ãããããšãã§ããªããšæããŸãã LLDBãä¿®æ£ããå¿ èŠããããŸãã
ãã®æ©èœã1.17ãµã€ã¯ã«ïŒ3æ16æ¥ã®ããŒã¿çïŒã§FCPã«çµã¿èŸŒãããšãã§ãããã©ããã確èªããã®ã¯ãã°ãããããšã§ãã 誰ããæªè§£æ±ºã®è³ªåãšæ©èœã®çŸåšã®ç¶æ³ã®èŠçŽãæäŸããŠãã³ã³ã»ã³ãµã¹ã«éãããã¹ãŠã解決ã§ãããã©ããã確èªã§ããŸããïŒ
@withoutboats
ç§ã®èšç»ã¯
Copy
ãã£ãŒã«ããæã€ãŠããªã³ã®å®å®åãææ¡ããŸãã ããã¯ãã¹ãŠã®FFIã®ããŒãºãã«ããŒããŸã-FFIã©ã€ãã©ãªã¯å®å®çã§ãŠããªã³ã䜿çšã§ããããã«ãªããŸãã ã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ã®ã¡ã³ããŒãçŸé£Œãã ãã§ã¯ãããŸããã
ããã§ããUnions1.2ãRFCïŒ https://github.com/rust-lang/rfcs/pull/1897ïŒãæåºããŸãã
ããã§ããŠããªã³ã®ä¿å®çãªãµãã»ããã®å®å®åãææ¡ããããšæããŸãããŠããªã³ã®ãã¹ãŠã®ãã£ãŒã«ãã¯Copy
ã§ããããã£ãŒã«ãã®æ°ã¯ãŒã以å€ã§ããããŠããªã³ã¯Drop
å®è£
ããªãå¿
èŠããããŸãã ã
ïŒãã ããæåŸã®èŠä»¶ãå®è¡å¯èœãã©ããã¯ããããŸããããŠããªã³ãæ§é äœã«ã©ãããããã®æ§é äœã«Drop
ãå®è£
ããããšã§ç°¡åã«åé¿ã§ããå¯èœæ§ãããããã§ããïŒ
ãã®ãããªãŠããªã³ã¯ããã®èšèªæ©èœã®äž»èŠãªå©çšè
ã§ãããšæãããFFIã©ã€ãã©ãªã®ãã¹ãŠã®ããŒãºãã«ããŒããŸãã
ãUnions1.2ãRFCã®ããã¹ãã¯ãåã®ãã³ãã³ã°ãèš±å¯ãããŠããããšãæ瀺çã«ç¢ºèªããŠããããšãé€ããŠãFFIã¹ã¿ã€ã«ã®ãŠããªã³ã«ã€ããŠäœãæ°ããããšãäŒããŠããŸããã
ç·šéïŒãUnions1.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
ããªããããæåã§æ£ããã¹ããŒã¹ãå²ãåœãŠãå¿
èŠããããŸããããã«ã宣èšåãã¯ãã«ã¯äœ¿çšå¯èœãªIDé£çµããªãããã§ããã²ãã¿ãŒãšã»ãã¿ãŒã®äž¡æ¹ã®ååãæåã§æå®ããå¿
èŠããããŸãã ãŠããªã³ãåæåããã ãã§ããæåã«ããã©ã«ãå€ã§åæåããŠãããå¿
èŠãªããªã¢ã³ãã«å€ãèšå®ããå¿
èŠããããããçŸæç¹ã§ã¯å°é£ã§ãïŒãŸãã¯ãå®çŸ©ã§ããã«åé·ãªãŠããªã³ãæ§ç¯ããããã®å¥ã®ã¡ãœããã»ãããè¿œå ããå¿
èŠããããŸãçµåã®ïŒã ããã¯å
šäœçã«ã¯ããã«å€ãã®äœæ¥ã§ãããçµåã®ãã€ãã£ããµããŒãããããšã©ãŒãçºçãããããéãã§ãã ãã®æ©èœãéåžžã«éèŠã§ããçç±ãç解ã§ããããã«ãRFCãšããã«ä»éãã説æãèªãå¿
èŠããããããããŸããã
ã¢ã©ã€ã¡ã³ãã«ã€ããŠãåãã§ãã
syn
ãååšããããã«ãªã£ãä»ãIDã®é£çµã¯ããã»ã©é£ãããªãã¯ãã ãšæããŸãã æž¡ãããASTã§æäœãå®è¡ã§ããããã2ã€ã®IDãååŸãããããã®æååè¡šçŸãæœåºããŠïŒ Ident
ã¯AsRef<str>
å®è£
ããŸãïŒãæ°ããIdent
ãäœæã§ããŸãã Ident::From<String>()
ã䜿çšãã2ã€ã®é£çµã§ãã
RFCã¯ãæ¢åã®ãã¯ãå®è£
ã®äœ¿çšãããã«é¢åã§ãããã«ã€ããŠå€ãã®ããšãè¿°ã¹ãŠããŸãããæè¿äœæãããsyn
ãquote
ãããªã¯ã¬ãŒãã«ãããprocãã¯ãã®å®è¡ãã¯ããã«ç°¡åã«ãªããŸããã ããã¯äººéå·¥åŠãæ¹åãããšã©ãŒãçºçãã«ããããã®ã«å€§ãã«åœ¹ç«ã€ãšæããŸãã
ããšãã°ããŠããªã³ã®å
éšãããã¡ããŒãã«ããMyUnion::default()
ãäœæãã次ã«fn MyUnion::new<T>(value:T) -> MyUnion
ãããã§ã T
ã«ã¯ç¹æ§ããã€ã³ããããŠãããããæ£ããåã§ã®ã¿åæåã§ããŸãã ã
é
眮ãšãµã€ãºã«é¢ããŠãæšæºã©ã€ãã©ãªïŒã€ãŸãã std :: mem :: align_ofïŒïŒãšãã®ä»²éïŒã®mem
ã¢ãžã¥ãŒã«ã䜿çšã§ããŸããïŒ ç§ãææ¡ããŠããããšã¯ãã¹ãŠããã¯ãå±éæã«ãããã䜿çšããŠãå¿
èŠãªãµã€ãºãšé
眮ãææ¡ã§ãããã©ããã«ããã£ãŠãããšæããŸãã ãŠããªã³ã䜿çšãããæéã®99.9ïŒ
ã¯ãšã«ããããªããã£ãåã§è¡ãããã®ã§ãåã®ååãåãããã®é
眮ãŸãã¯ãµã€ãºãè¿ããã«ããŒé¢æ°ãèšè¿°ã§ãããšæããŸãïŒããããã³ã³ãã€ã©ãŒã«å°ããŸãããããã¯ãã£ãšå®è£
ã®è©³çŽ°ïŒã
確ãã«ãçµã¿èŸŒã¿ã®ãã¿ãŒã³ãããã³ã°ã¯éåžžã«äŸ¿å©ã§ãããã»ãšãã©ã®å ŽåãFFIã§äœ¿çšãããŠããªã³ã¯ããšã«ããèãæœè±¡åã¬ã€ã€ãŒã«ã©ãããããŸãã ãããã£ãŠãif / elseã¹ããŒãã¡ã³ããããã€ã䜿çšãããããã«ããŒé¢æ°ã䜿çšããããšã§è§£æ±ºã§ããå¯èœæ§ããããŸãã
é 眮ãšãµã€ãºã«é¢ããŠãæšæºã©ã€ãã©ãªã®memã¢ãžã¥ãŒã«ïŒã€ãŸããstd :: mem :: align_ofïŒïŒãšãã®ä»²éïŒã䜿çšã§ããŸããïŒ
ããã¯ãã¯ãã¹ã³ã³ãã€ã«ã®ã³ã³ããã¹ãã§ã¯æ©èœããŸããã
@ Michael-F-Bryan https://github.com/rust-lang/rfcs/pull/1444ã®æŽå²ã®äžã§ãããããã¹ãŠã®è°è«ãšãã®ä»å€ãã®è°è«ãè¡ãããŸããã ãã§ã«è¿°ã¹ããã®ã«å ããŠãç¹å®ã®æžå¿µãžã®å¯Ÿå¿ãèŠçŽãããšããã¹ãŠã®ã¿ãŒã²ãããã©ãããã©ãŒã /ã³ã³ãã€ã©ã®ããã£ã³ã°ãšã¢ã©ã€ã¡ã³ãã®ã«ãŒã«ãåå®è£ ããFFIã³ãŒãå šäœã§åä»ãªæ§æã䜿çšããå¿ èŠããããŸãïŒ
ãŸãïŒ
ãŠããªã³ã䜿çšãããæéã®99.9ïŒ ã¯ããšã«ããããªããã£ãåã§å®è¡ãããŸã
ãŸã£ããçå®ã§ã¯ãããŸããã Cã³ãŒãã¯ããæ§é äœã®çµåã®æ§é ããã¿ãŒã³ãåºç¯å²ã«äœ¿çšããŸãããã®ãã¿ãŒã³ã§ã¯ãã»ãšãã©ã®çµåãã£ãŒã«ããç°ãªãæ§é äœã¿ã€ãã§æ§æãããŠããŸãã
@petrochenkovã®ã³ã¡ã³ãããšã«@rfcbotfcpããŒãžhttps://github.com/rust-lang/rust/issues/32836#issuecomment-279256434
ããããããªã¬ãŒããã ãã§ãè¿œå ãããã®ã¯äœããããŸãã
ããŒã ã¡ã³ããŒ@withoutboatsã¯ãããããŒãžããããšãææ¡ããŸããã 次ã®ã¹ãããã¯ãã¿ã°ä»ããããæ®ãã®ããŒã ã«ããã¬ãã¥ãŒã§ãã
çŸåšãªã¹ããããŠããæžå¿µã¯ãããŸããã
ãããã®ã¬ãã¥ãŒã¢ãã³ã³ã»ã³ãµã¹ã«éãããšãããã¯æçµã³ã¡ã³ãæéã«å ¥ããŸãã ãã®ããã»ã¹ã®ã©ã®æç¹ã§ãæèµ·ãããŠããªã倧ããªåé¡ãèŠã€ããå Žåã¯ã声ãäžããŠãã ããã
ã¿ã°ä»ããããããŒã ã¡ã³ããŒãç§ã«äžããããšãã§ããã³ãã³ãã«ã€ããŠã¯ããã®ããã¥ã¡ã³ããåç §ããŠãã ããã
PSAïŒãUnions1.2ãRFCãæŽæ°ããŠãFFIã¹ã¿ã€ã«ã®ãŠããªã³ã«åœ±é¿ãäžãããã1ã€ã®å€æŽãå ããŸããå®å šãªå²ãåœãŠããç°¡åã«ç Žå£ã§ãããŠããªã³ã®ãã£ãŒã«ãã«ãå°æ¥ã®æ¹åæ§ãããé©åãªRFCã«ç§»åããŸãã
union.trivially_destructible_field = 10; // safe
ãªãïŒ
unsafe
ãããã¯ã®çŽååãåé€ãããŸããunused_unsafe
èŠå/ãšã©ãŒãå€æ°çºçããå¯èœæ§ããããããåŸã§è¡ãã®ã¯é£ãããªããŸãã@petrochenkov ãèªæã«ç Žå£å¯èœãªãŠããªã³ãã£ãŒã«ããããŸãã¯ãå®å šã«èªæã«ç Žå£å¯èœãªãã£ãŒã«ããæã€ãŠããªã³ããæå³ããŸããïŒ
解éãéžæããèªã¿åãæã«ããã¹ãŠã®å±éºãªåäœãçºçããããšãææ¡ããŠããŸããïŒ ããšãã°ãåæåãšä»ã®ãã£ãŒã«ããå«ããŠããªã³ãããããŠããªã³å€ã«ç¡å¹ãªå€å¥åŒãå«ãŸããŠããŸããïŒ
ãã£ãšãããããšæãããé«ã¬ãã«ã§ã å®å šã§ã¯ãªããšæãããããšã¯ããã€ãèš±å¯ãããŸããããã¹ãã©ã¯ã¿ã®ãã€ãã¹ãã¡ã¢ãªãªãŒã¯ãªã©ãRustã§ã¯äžè¬çã«èš±å¯ãããŸããã äœã¬ãã«ã§ã¯ãç§ã¯ãã®é³ãæ€èšããããšãèºèºããŸãã
ãã®ãµãã»ãããå®å®ãããããšã«ã€ããŠã¯å€§äžå€«ã ãšæããŸãã ãã®Unions1.2 RFCã«ã€ããŠã®ç§ã®æèŠã¯ãèªãæéããªãã£ãã®ã§ãŸã ããããŸããã å Žåã«ãã£ãŠã¯ããã£ãŒã«ããžã®å®å
šãªã¢ã¯ã»ã¹ãèš±å¯ããããšã«ã€ããŠã©ãæããããããŸããã æ¯ãè¿ã£ãŠã¿ããšãäœãå®å
šã§ãªããïŒãã€ã³ã¿ãéåç
§ããã ãïŒã®ãæå°éã®ãæŠå¿µãäœæããããã®åªåã¯ééãã ã£ãããã«æããŸãã LLVMãšè€éãªæ¹æ³ã§çžäºäœçšããŸãã ããã§ããããããããªãæ°ãããŸãã èšãæããã°ãå®å
šã§ãªãã³ãŒãã¬ã€ãã©ã€ã³ã®é²å±ã«åãããŠã unsafe
ã«é¢ããã«ãŒã«ãæ€åããããšãã§ããŸãã
@joshtriplett
ãèªæã«ç Žå£å¯èœãªãã£ãŒã«ãããç§ã¯èšãåãã埮調æŽããŸããã
解éãéžæããèªã¿åãæã«ããã¹ãŠã®å±éºãªåäœãçºçããããšãææ¡ããŠããŸããïŒ
ã¯ãã æžã蟌ã¿ã ãã§ã¯ããã®åŸã®èªã¿åããªãã§ã¯å±éºãªããšã¯äœãèµ·ãããŸããã
ç·šéïŒ
æ¯ãè¿ã£ãŠã¿ããšãäœãå®å šã§ãªããïŒãã€ã³ã¿ãéåç §ããã ãïŒã®ãæå°éã®ãæŠå¿µãäœæããããã®ç§ãã¡ã®åªåã¯ééãã ã£ãããã«æããŸã
ããã
å®å
šãªæžã蟌ã¿ã¯ãå®å
šæ§ã«å¯ŸããçŸåšã®ã¢ãããŒããšå®å
šã«äžèŽããŠããŸããããããå€æŽããå Žåã¯ãããããåŸ
ã€å¿
èŠããããŸãã
ç§ã¯ãã®ãµãã»ãããå®å®ãããããšã«æºè¶³ããŠããŸããã éåžžããµãã»ãããå®å®ããããšãããã¯æ§æãµãã»ãããŸãã¯å°ãªããšãããªãæçœãªãµãã»ããã«ãªããŸãã ãã®ãµãã»ããã¯ç§ã«ã¯å°ãè€éã«æããŸãã æ©èœã«ã€ããŠæªæ±ºå®ã§ãçŸåšã®å®è£ ãå®å®ãããæºåãã§ããŠããªãå Žåã¯ãå šäœããã°ããäžå®å®ãªãŸãŸã«ããŠãããããšæããŸãã
@nrc
ãŸãããµãã»ããã¯ããªãæçœã§ã-ãFFIãŠããªã³ãããCãŠããªã³ãããŸãã¯ãC ++ 11以åã®ãŠããªã³ã-æ§æçã§ãªããŠãã ç§ã®æåã®ç®æšã¯ããã®ãµãã»ãããã§ããã ãæ©ãïŒçæ³çã«ã¯ãã®ãµã€ã¯ã«ã§ïŒå®å®ãããŠã winapi
ãããªã©ã€ãã©ãªã§äœ¿çšã§ããããã«ããããš
æ®ãã®ãµãã»ãããšãã®å®è£
ã«ã€ããŠç¹ã«çãããããšã¯äœããããŸãããç·æ¥ã§ã¯ãªãããUnions1.2ãRFCã®ããã»ã¹ãå®äºãããŸã§äžæ確ãªæéãåŸ
ã€å¿
èŠããããŸãã ç§ã®æåŸ
ã¯ãæåã®ãµãã»ããã®å®å®ååŸã1ã2ããŸãã¯3ãµã€ã¯ã«ã§æ®ãã®éšåãå®å®åããããšã§ãã
å®å
šãªãã£ãŒã«ãå²ãåœãŠã«ã€ããŠã¯ã究極ã®è°è«ããããšæããŸãã
å®å
šã§ãªããã£ãŒã«ãã®å²ãåœãŠ
unsafe {
u.trivially_destructible_field = value;
}
å®å šãªå®å šãªçµåã®å²ãåœãŠã«çžåœããŸã
u = U { trivially_destructible_field: value };
ãã ããå®å
šããŒãžã§ã³ã¯ã trivially_destructible_field
å€åŽã®u
ã®ãã€ããundefã§äžæžããããããé説çã«å®å
šæ§ãäœããªããŸããããã£ãŒã«ãå²ãåœãŠã§ã¯ããããããã®ãŸãŸã«ããŠããããšãä¿èšŒãããŸãã
@petrochenkovãã®æ¥µç«¯ãªãã®ã¯size_of_val(&value) == 0
ã§ãããïŒ
2ã€ã®ã¹ããããã®åçæ§ã¯ãåé¡ã®ãã£ãŒã«ãã
ãèªæã«ç Žå£å¯èœãã§ãã
ãã®æå³ã§ããããã®ãããªå²ãåœãŠãå®å
šã«è¡ãããšã¯ãäžéšã®å Žåã«éãããŸã
ç§ã«ã¯éåžžã«ççŸããŠããããã§ãã
2017幎2æ22æ¥14ïŒ50ããVadimPetrochenkovã [email protected]
æžããŸããïŒ
å®å šãªãã£ãŒã«ãå²ãåœãŠã«ã€ããŠã¯ã究極ã®è°è«ããããšæããŸãã
å®å šã§ãªããã£ãŒã«ãã®å²ãåœãŠå®å šã§ã¯ãªã{
u.trivially_destructible_field = value;
}å®å šãªå®å šãªçµåã®å²ãåœãŠã«çžåœããŸã
u = U {trivially_destructible_fieldïŒvalue};
ãã ããå®å šãªããŒãžã§ã³ã¯é説çã«å®å šæ§ãäœããªããŸãã
trivially_destructible_fieldã®å€åŽã®uã®ãã€ããundefã§äžæžãããŸãã
ãã£ãŒã«ãå²ãåœãŠã«ã¯ããããããã®ãŸãŸã«ããŠããããšãä¿èšŒãããŠããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32836#issuecomment-281660298 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AApc0lUOXLU5xNTfM5PEfEz9nutMZhXUks5rfC8UgaJpZM4IDXsj
ã
@eddyb
ãã®æ¥µç«¯ãªäŸã¯size_of_valïŒïŒvalueïŒ== 0ã§ãããïŒ
ããã
@nagisa
誀æ€ç¥ã®å€§éšåãæé€ãã1ã€ã®è¿œå ã®åçŽãªã«ãŒã«ãéåžžã«äžè²«æ§ããªãçç±ãããããŸããã ãäžéšã®ã±ãŒã¹ã®ã¿ãã¯ãç¹ã«ãã¹ãŠã®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ïŒããŒãžã§ã³ã®ã¯ã¬ãŒãããªãªãŒã¹ããŸãã
çªç¶ã誰ãä»ã®äººã®ã¯ã¬ãŒããã³ã³ãã€ã«ãããªããªããŸããã
fn somefn(banana: &mut Banana) {
banana.actually = Peach; // ERROR: Something something⊠unsafe assingment⊠somewhat somewhat trivially indestructibleâŠ
}
ãããã£ãŠããŠããªã³ãã£ãŒã«ããžã®å®å
šãªå²ãåœãŠãèš±å¯ããããšã¯ã mut
ããŒã«ã«ã®ã¿ããã¥ãŒããŒã·ã§ã³å¯èœã§ããã»ã©ç°¡åã§ã¯ãªãå ŽåããããŸãã
ãã®äŸãæžãçããŠãããšãæ£çŽãªãšãããããã«å¯ŸããŠã©ã®ã¹ã¿ã³ã¹ãåãã¹ããããããªããªã£ãŠããŸããã äžæ¹ã§ãå®è£ ã®è¿œå ã¯äžè¬çã«é倧ãªå€æŽã§ã¯ãªããšããç¹æ§ãç¶æããããšæããŸãïŒXIDã®æœåšçãªã±ãŒã¹ãç¡èŠããŸãïŒã äžæ¹ããŠããªã³ã®ãã£ãŒã«ããèªæã«ç Žå£å¯èœãªãã®ããèªæã«ç Žå£ã§ããªããã®ã«å€æŽããããšã¯ãæããã«èŠèœãšããã¡ãªsemverã®äºææ§ã®ãªãå€æŽã§ãããææ¡ãããã«ãŒã«ã¯ãããã®éäºææ§ãããæ確ã«ããŸãïŒå²ãåœãŠãå®å šã§ãªããããã¯ã«ãªãéãïŒæ¢ã«ïŒã
@nagisa
ããã¯è¯ãè°è«ã§ããç§ã¯äºææ§ã«ã€ããŠèããŠããŸããã§ããã
ããããåé¡ã¯è§£æ±ºã§ããããã§ãã äºææ§ã®åé¡ãåé¿ããã«ã¯ãã³ããŒã¬ã³ã¹ãšåãããšãè¡ããŸã-åŠå®çãªæšè«ãé¿ããŸãã ã€ãŸããã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
}
ããã¯ãããããããããã®æé»çãªã³ããŒãå®è£
ããããã«èãããŸãã ãããŠã³ããŒ
é Œãããšãã§ããŸãã
10ïŒ11 AMã§æ°Žææ¥ã2017幎2æ22æ¥ã«ã¯ãjethrogb [email protected]ã¯æžããŸããïŒ
Dropã®å®è£ ã¯ãã§ã«äžäœäºææ§ããªããããã«ã¯
ãŠããªã³æ©èœãšã¯äœã®é¢ä¿ããããŸããã//誰ããæšæ ã®ã©ããã«ããïŒv 1.0.0ïŒ
Appleãæ§ç¯ãã; //ç°¡åã«ç Žå£å¯èœ
struct Pineapple {å®éã®ããïŒApple}//äŸåããæšæ ã«ããä»ã®èª°ã
ããã€ãã®æšæ ãå€ããŸãã
fn pineapple_to_appleïŒpineappleïŒPineappleïŒ-> Apple {
ãã€ãããã«ã
}//ããã€ãã®ã¯ã¬ãŒãv1.1.0
impl Drop for Pineapple {fn dropïŒïŒmut selfïŒ{printlnïŒïŒ "Moi PineappleïŒ"ïŒ}fn pineapple_to_appleïŒpineappleïŒPineappleïŒ-> Apple {
banana.actually //ãšã©ãŒïŒãã€ãããã«ãã移åã§ããŸãã
}â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/32836#issuecomment-281752949 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABxXhgbFgRNzYOsU4c6Gu1KFfwdjDHn3ks5rfHpYgaJpZM4IDXsj
ã
@jethrogb
ãã®åé¡ã«ã€ããŠèšåãããã£ãã®ã§ãããç¹å¥ãªåææ¡ä»¶ãã»ãšãã©ãªããããèšåããŸããDrop
ãå®è£
ããæ§é äœã«ã¯ãããªãã¯ãã£ãŒã«ããå¿
èŠã§ããããã®ãã£ãŒã«ãã¯Copy
ã¯ãªããŸããã ãŠããªã³ã±ãŒã¹ã¯ããã¹ãŠã®æ§é äœã«ç¡æ¡ä»¶ã«åœ±é¿ããŸãã
@petrochenkovãããããçµåãäœãããšã¯å®å šã§ã¯ãªãã¯ãã ãšããè°è«ã ãšæããŸã:)
@petrochenkovãµãã»ãããå®å®ãããããã®éçºãšnightly-user-experienceãã¹ã¯äœã§ããïŒ ãµãã»ããã«æåã«æ°ããæ©èœã²ãŒããè¿œå ããŠããµãã»ãããå®å®ããåã«äººã ããµãã»ããã®äœ¿çšãå ·äœçã«äœéšã§ããããã«ããŸããïŒ
@pnkfelix
ç§ãæ³å®ããã®ã¯ããã®ãµãã»ããã«#[feature(untagged_unions)]
ãèŠæ±ããã®ããããããšã§ãããæ°æ©èœããã®ä»ã®å®åæ©æ§ã¯å¿
èŠãããŸããã
FFIã¹ã¿ã€ã«ã®ãŠããªã³ãæãé »ç¹ã«äœ¿çšãããçš®é¡ã®ãŠããªã³ã§ãããšèããããŠãããããæ°ããæ©èœã¯ãå®å®åã®çŽåã«ç Žæãä¿èšŒãããããšãæå³ããŸããããã¯ãç
©ããããšæããŸãã
ã¢ã©ã€ã³ã¡ã³ããšãããã³ã°ã®å±æ§ã¯ãŸã å®è£ ãããŠããªãããïŒå®å®åããå¿ èŠã¯ãããŸããïŒããããå®å®åããå¿ èŠæ§ã¯ããŸããããŸããã
@ retep998
梱å
ïŒ #[repr(packed)]
ãæå³ããå Žåã¯ãçŸåšããŠããªã³ã§ãµããŒããããŠããŸãïŒ align(>1)
å±æ§ãšã¯ç°ãªããŸãïŒã
@petrochenkov #[repr(packed(N))]
ã winapiã§ã¯ã1以å€ã®ãããã³ã°ãããªãå¿
èŠã§ãã ç¹ã«ãŠããªã³ã§ãããã®ãã®ããµããŒãããå¿
èŠãããããã§ã¯ãããŸãããããããã¹ãŠãåæã«ååŸã§ããªãéããæ°ããã¡ãžã£ãŒããŒãžã§ã³ã«ãžã£ã³ãããŠRustã®æå°èŠä»¶ãå¢ãããããããŸããã
ããã§ãã¬ã€ã®ç¶æ ãå°ãæ確ã«ããããã«ïŒ
çŸåšã®FCPææ¡ã¯ãçŽç²ãªCopy
çµåã®ã¿ã察象ãšããŠããŸãã ç§ã®ç¥ãéããåºæ¬çã«ãå®å®ãããã¹ããã以å€ã®æªè§£æ±ºã®è³ªåã¯ãããŸããã FCPãžã®åè°ä»¥æ¥ã®è°è«ã¯ãã¹ãŠ@petrochenkovã®æ°ããRFCã«ã€ããŠ
@nrcãš@ nikomatsakis ãIRCã§ã®è°è«ãããããªãã¯äž¡æ¹ãšãããªãã®ããã¯ã¹ããã§ãã¯ããæºåãã§ããŠãããšæããŸãããç§ã¯ããªãã«ãããä»»ããŸã;-)
@petrochenkov
ããã¯ç§ãæè¿æµ®ããã ã¢ã€ãã¢ããå©çãåŸãã ãããšç§ã«ã¯æããŸãã ïŒhttps://internals.rust-lang.org/t/automatic-marker-trait-for-unconditionally-valid-repr-c-types/5054ïŒ
ãŠããªã³ã念é ã«çœ®ããŠææ¡ãããŠããŸãããã説æãããŠããç¹æ§Plain
ïŒãã€ã¯ã·ã§ãã£ã³ã°ã®å¯Ÿè±¡ïŒã«ããã Plain
ã¿ã€ãã®ã¿ã§æ§æããããŠããªã³ãå®å
šæ§ãæãªãããšãªã䜿çšã§ããŸãã ããã¯ãã¡ã¢ãªå
ã®ä»»æã®ããããã¿ãŒã³ãåçã«æå¹ã§ãããšããããããã£ãäœç³»åãããããã¡ã¢ãªããŒãã«ããããšã匷å¶ããããšã§åæåã®åé¡ã解決ã§ããèªã¿åãã§UBãåŒã³åºããªãããã«ããŸãã
FFIã®ã³ã³ããã¹ãã§ã¯ãå®çŸ©ãããPlain
ããããšããå€ãã®å Žåããã®ãããªã³ãŒããé©åã§ããããã®äºå®äžã®èŠä»¶ã§ããã Plain
ã¿ã€ãã圹ç«ã€å Žåã¯ãŸãã§ãããèšå®ãå°é£ã§ããå®å
šã«ã
ååä»ãã®ç¹æ§ãå®éã«ååšããããšã¯ããŠããããã®æ©èœã2ã€ã«åå²ããã®ãè³¢æãããããŸããã è³æ Œã®ãªãunion
ãèŠä»¶ãå®æœããå®å
šæ§ãæãªãããšãªã䜿çšã§ããããã«ãã unsafe union
ã¯ã³ã³ãã³ãã®èŠä»¶ãç·©åãããŠãŒã¶ãŒã®é çã®çš®ãå¢ãããŸãã ããããã°ãå°æ¥çã«ããäžæ¹ãè¿œå ããæ¹æ³ã劚ããããšãªããã©ã¡ãããå®å®ãããããšãã§ããŸãã
@ le-jzr
ããã¯çµåãšååã«çŽäº€ããŠããããã§ãã
è¿ãå°æ¥ã Plain
ãRustã«åãå
¥ããå¯èœæ§ã¯äœããšæšå®ããŸãã+ãŠããªã³ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãå®å
šã«ããããšã¯ãå€ããå°ãªããäžäœäºææ§ããããŸãïŒå®å
šã«ãªã³ããåå ã§ã¯ãããŸããïŒããããã£ãŠããŠããªã³ãé
ãããããšã¯ãããŸãããããã«ã
@petrochenkovç§ã¯ãç§ã®ææ¡ãééãããã®ãåŸ ã€ã®ãçµåã«é ãããããšãææ¡ããŠããã®ã§ã¯ãªãããã®ãããªå¯èœãªå¶éã®_ååš_ãããèªäœã§æ€èšããããšãææ¡ããŠããã å°æ¥ããŠããªã³ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãå®å šã«è¡ããšãèšèªã®äžæŽåãå¢ãããããé害ã«çŽé¢ããå¯èœæ§ããããŸãã ç¹ã«ããã£ãŒã«ãã¢ã¯ã»ã¹ã®å®å šæ§ããã£ãŒã«ãããšã«ç°ãªãããã«ããããšã¯éãããã§ãã
ãããã£ãŠã宣èšãunsafe union
ã«ãããšããç§ã®ææ¡ã¯ãæ°ããããŒã¯ãŒããè¿œå ããã«ãç¡æ¡ä»¶ã«å®å
šã«äœ¿çšã§ããããŒãžã§ã³ãåŸã§å°å
¥ã§ããããã«ããããã§ãã ã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãå®å
šã«å®å
šã«äœ¿çšã§ããããŒãžã§ã³ã§ååã§ããããšã«æ³šæããŠãã ããã
ç·šéïŒç§ãèšãããšãæ確ã«ããããšããŸããã
ãã®å¯èœæ§ãçŸåšããã³å°æ¥ã®èšèšã«æ å ±ãäžããå¯èœæ§ããããã1ã€ã®å Žæã¯ãåæåã§ãã ç¡æ¡ä»¶ã«å®å šãªçµåãè¡ãã«ã¯ããã®ããã«äºçŽãããŠããã¡ã¢ãªã®ã¹ãã³å šäœããŒãã«ããå¿ èŠããããŸãã çŸåšã®ããŒãžã§ã³ã§ããããã確å®ã«ãããšãæœåšçãªUBã·ããªãªãåæžãããå ±çšäœã®äœ¿çšã容æã«ãªããŸãã
ããã§æçµã³ã¡ã³ãæéãçµäºããŸããã
ããŒãžããFCPãå®äºããã®ã§ã次ã®ã¹ãããã¯äœã§ããïŒ ããã1.19ã®éå®å®ããããšããã§ãããã
誰ãããã®@rfcbotã¡ãã»ãŒãžïŒããã®ãœãŒã¹ã³ãŒãïŒã«ããã«è©³çŽ°ãè¿œå ã§ããã°çŽ æŽãããã§ãããã ããã»ã¹ã«äžæ £ããªäººãé£ã³èŸŒãã§ç©äºãé²ããã®ãç°¡åã«ãªãå¯èœæ§ããããŸãã
ããã1.19ã«ããããã®éçã¯æããã§ãã 誰ãããããããã¯ããŠããŸããïŒ cc @joshtriplett
NonZero
åæåã¬ã€ã¢ãŠãã®æé©åã¯union
ãéããŠé©çšãããããšãä¿èšŒãããŠããŸããïŒ ããšãã°ã Option<ManuallyDrop<&u32>>
ã¯None
ãnullãã€ã³ã¿ãšããŠè¡šãã¹ãã§ã¯ãããŸããã Some(ManuallyDrop::new(uninitialized::<[Vec<Foo>; 10]>())).is_some()
ã¯ãåæåãããŠããªãã¡ã¢ãªãèªã¿åã£ãŠã¯ãªããŸããã
https://crates.io/crates/nodropïŒhttps://crates.io/crates/arrayvecã§äœ¿çšïŒã«ã¯ãããã«å¯ŸåŠããããã®ããã¯ããããŸãã
@SimonSapin
ããã¯çŸåšã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ããïŒ-ãã®åé¡ã«æ®ã£ãŠãããã®ã¯ãããŸããããããšãéããå¿ èŠããããŸããïŒ
@jonathandturner
Copy
ãã£ãŒã«ããæã€ãŠããªã³ã®å
šäžçããŸã ãããŸãïŒ
é²è¡ç¶æ³ã¯ãã»ãšãã©ã®å Žåãæ確å/ææžåRFCïŒhttps://github.com/rust-lang/rfcs/pull/1897ïŒã§ãããã¯ãããŠããŸãã
8æ以éã Copy
ãã£ãŒã«ããæã€çµåã§é²å±ã¯ãããŸãããïŒ Unions 1.2 RFCã¯è¡ãè©°ãŸã£ãŠããããã§ãïŒimplæéãåå ã ãšæããŸããïŒïŒ
@mikeyhewæ¬åœã«å¿ èŠãªã®ã¯ãå€ããŠã1ã€ã®ã¿ã€ãã®ãµã€ãºãå€æŽã§ããªãããšã ãã§ãã
union
ã䜿çšããŠããã€ãã®Rustã³ãŒããèŠãŠããŸããããããæªå®çŸ©ã®åäœãåŒã³åºããã©ããããããŸããã
åç §[items :: unions]ã¯æ¬¡ã®ããšã ããè¿°ã¹ãŠããŸãã
ãŠããªã³ãä¿æããçŸåšã®å€ãšååã«ã¬ã€ã¢ãŠãäºææ§ãããå Žåã¯ãéã¢ã¯ãã£ããªãã£ãŒã«ãã«ãïŒåãæ§æã䜿çšããŠïŒã¢ã¯ã»ã¹ã§ããŸãã äºææ§ã®ãªããã£ãŒã«ããèªã¿åããšãæªå®çŸ©ã®åäœãçºçããŸãã
ãããã [items :: unions]ã«ã[type_system :: type_layout]ã«ããã¬ã€ã¢ãŠãäºæãã®å®çŸ©ãèŠã€ãããŸããã
RFCã調ã¹ãŠãããã¬ã€ã¢ãŠãäºæãã®å®çŸ©ãèŠã€ããããšãã§ããŸããã§ãããRFC1897 ïŒUnions 1.2 ïŒããŒãžãããŠããªãïŒã§æ©èœããå¿ èŠããããã®ãšæ©èœããªããã®ã®æã§æ¯ã£ãäŸã ãã§ãã
RFC1444ïŒãŠããªã³ã¯ãæªå®çŸ©ã®åäœãåŒã³åºããªãéãããŠããªã³ããã®ããªã¢ã³ãã«å€æããããšãèš±å¯ããŠããããã§ãããããã§ãªãå Žåã¯ãRFCã®ã©ãã«ãèŠã€ãããŸããã
ãŠããªã³ã䜿çšããã³ãŒãã®äžéšãã©ããã«æžãçããããåäœãå®çŸ©ããŠãããã©ããïŒããã³å®çŸ©ãããåäœãšã¯äœãïŒãæããŠããã_precise_ã«ãŒã«ã¯ãããŸããïŒ
@gnzlbgæåã®æŠç®ïŒããã£ã³ã°ã«ã¢ã¯ã»ã¹ã§ããªããç¡å¹ãªå€å¥åŒãå«ãåæåã«ã¢ã¯ã»ã¹ã§ããªããtrueãŸãã¯false以å€ã®å€ãå«ãboolã«ã¢ã¯ã»ã¹ã§ããªããç¡å¹ãªæµ®åå°æ°ç¹å€ãŸãã¯ã·ã°ããªã³ã°æµ®åå°æ°ç¹å€ã«ã¢ã¯ã»ã¹ã§ããªããããã³ãããã®ãããªä»ã®ããã€ãã®ãã®ã
åéåãå«ãç¹å®ã®ã³ãŒããæããšãããã調ã¹ãŠãæªå®çŸ©ã®åŠçãè¡ã£ãŠãããã©ãããç¥ãããšãã§ããŸãã
æåã®æŠç®ïŒããã£ã³ã°ã«ã¢ã¯ã»ã¹ã§ããªããç¡å¹ãªå€å¥åŒãå«ãåæåã«ã¢ã¯ã»ã¹ã§ããªããtrueãŸãã¯false以å€ã®å€ãå«ãboolã«ã¢ã¯ã»ã¹ã§ããªããç¡å¹ãŸãã¯ã·ã°ããªã³ã°æµ®åå°æ°ç¹å€ã«ã¢ã¯ã»ã¹ã§ããªããããã³ãããã®ãããªä»ã®ããã€ãã®ãã®ã
å®éãææ°ã®ã³ã³ã»ã³ãµã¹ã¯ãä»»æã®ãããŒããèªã¿åãããšã¯åé¡ãªããšããããšã§ãïŒïŒ46012ïŒã
ãã1ã€ã®èŠä»¶ãè¿œå ããŸãããœãŒã¹ãšã¿ãŒã²ããã®äž¡æ¹ã®ãŠããªã³ããªã¢ã³ãã¯#[repr(C)]
ãããæ§é äœã®å Žåã¯ãã¹ãŠã®ãã£ãŒã«ãïŒããã³ååž°çïŒãåæ§ã§ãã
@Amanieuæ£çŽã«ç«ã£ãŠãããããšãã
ã ããç§ã¯ã«ãŒã«ãã©ãã«ãæžãããŠããªããšæããŸããïŒ
æ°ããã€ã³ã¿ãŒãã§ãŒã¹ã§stdsimd
ã䜿çšããæ¹æ³ãæ€èšããŠããŸãã ããã§ããã€ãã®ãšã¯ã¹ãã©ãå®å®ãããªãéãã次ã®ãããªããã€ãã®simdã¿ã€ãã§åã®ãã³ãã³ã°ãè¡ãããã«ãŠããªã³ã䜿çšããå¿
èŠããããŸãã
AFAIKã¯ã1ã€ã®ãŠããªã³ãã£ãŒã«ããèšè¿°ããŠå¥ã®ãã£ãŒã«ããèªã¿åãããšã¯ãåãå¶éä»ãã§transmute_copy
ã䜿çšããã®ãšéåžžã«ãã䌌ãŠããŸãã ãããã®å¶éããŸã å°ãææ§ã§ãããšããããšã¯ãçµååºæã§ã¯ãããŸããã
ããã«èšãã°ããªã³ã¯ããé¢æ°ã¯transmute::<__m128d, [f64; 2]>
䜿çšããã ãã§æžã¿ãŸãã ãŠããªã³ããŒãžã§ã³ã®æ¹ãè°è«ã®äœå°ã¯ãããŸãããå°ãªããšãçŸåšååšããæ žå€æãåé€ããããšã A { a }.b[idx]
ãªãå¯èœæ§ããããŸãã
@rkruppeç§ã¯ãã®ç³žãããè¿œå ããããã«ã¯ãªããã®åé¡ãåããŸããïŒ https ïŒ
ãªã³ã¯ããé¢æ°ã¯ãtransmute :: <__ m128d i = "8">ã䜿çšã§ããŸãã
ç§ãæ¢ããŠããã«ãŒã«ã¯ãtransmuteãæªå®çŸ©ã®åäœãåŒã³åºããšãã ãšæããŸãïŒããã§ãããããæ¢ãã«è¡ããŸãïŒã
ãŠããªã³ã«é¢ããèšèªãªãã¡ã¬ã³ã¹ããåã«ãã¬ã€ã¢ãŠãã®äºææ§ãã«èšåããŠãããæ®ãã®ã§ã¯ãªãããã©ã³ã¹ãã¥ãŒãã®èŠ³ç¹ãããŠããªã³ã®ã«ãŒã«ãæå®ããŠããã°ïŒãã©ã³ã¹ãã¥ãŒãã®ã«ãŒã«ããŸã 100ïŒ æ確ã§ãªããŠãïŒãç§ã¯å©ãã«ãªã£ããšæããŸãããã®æã ãã¬ã€ã¢ãŠãã®äºææ§ãããããã©ã³ã¹ãã¥ãŒããæªå®çŸ©ã®åäœãåŒã³åºããªãå Žåãåã¯ã¬ã€ã¢ãŠãäºæã§ãããåã®ãã³ãã³ã°ãä»ããŠã¢ã¯ã»ã¹ã§ããããžã®é£èºã¯ç§ã«ã¯æããã§ã¯ãããŸããã§ããã
æ確ã«ããããã«ãtransmute [_copy]ã¯ãŠããªã³ããããåå§çãã§ã¯ãããŸããã å®éãtransmute_copyã¯ãæåéãã as
ãã£ã¹ããšptr::read
åãªããã€ã³ã¿ãŒã§ãã transmute
ããã«mem::uninitialized
ïŒéæšå¥šïŒãŸãã¯MaybeUninitialized
ïŒãŠããªã³ïŒãªã©ãå¿
èŠãšããå¹çã®ããã«çµã¿èŸŒã¿ãšããŠå®è£
ãããŸããããããã¿ã€ãã«èŠçŽãããŸã-ãããã€ãªmemcpyã ç§ãæ žå€æãšã®ã€ãªãããæããäž»ãªçç±ã¯ããããå€ããæŽå²çã«åŒ·èª¿ãããããŠããããã§ãããã®ãããçŸåšãæ žå€æã«ç¹ã«çŠç¹ãåœãŠãèšäºãæ°éäŒæ¿ã®ç¥èãå¢ããŠããŸãã äœãæå¹ã§äœãç¡å¹ã§ãããïŒããã³ä»æ§ã§èª¬æããããïŒã決å®ããå®éã®åºæ¬æŠå¿µã¯ãå€ããã€ããšããŠã¡ã¢ãªã«æ ŒçŽãããæ¹æ³ãšãã©ã®ãã€ãã·ãŒã±ã³ã¹ãã©ã®ã¿ã€ããšããŠèªã¿åãããã«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)
}
æ žå€æã®å¯äžã®ãéæ³ã®ãéšåã¯ãã³ã³ãã€ã«æã«åãã©ã¡ãŒã¿ãŒãåããµã€ãºã«ãªãããã«å¶çŽã§ããããšã§ãã
åç
§ããã³Unions1.2 RFCã¯ãäžè¬çãªæ žå€æã®èŠåã決ãŸã£ãŠããªãããããã®åé¡ã«ã€ããŠæå³çã«ãããŸãã«ãªã£ãŠããŸãã
ãã®æå³ã¯ãã repr(C)
ãŠããªã³ã«ã€ããŠã¯ããµãŒãããŒãã£ã®ABIä»æ§ãåç
§ããŠãã ããã repr(Rust)
ãŠããªã³ã«ã€ããŠã¯ãã¬ã€ã¢ãŠãã®äºææ§ã¯ã»ãšãã©æå®ãããŠãrepr(C)
ïŒããã§ãªãå ŽåïŒãã
ãããããã£ãŒã«ããæã€ãŠããªã³ã®ãããããã§ãã¯ã»ãã³ãã£ã¯ã¹ãåæ€èšããã«ã¯é ãããŸããïŒ
å
ã®åé¡ã¯ã 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ã«ãã£ãŠäœ¿çšãããŸãã
ãããããã§ãã«ãŒããããããã£ãŒã«ããæã€ãŠããªã³ã«DropimplããããšèŠãªããå Žåãäžå€æ¡ä»¶ã¯åŸ©å ãããŸãã ããã¯é倧ãªå€æŽã§ãããå®éã®ã³ãŒããçŸåšã®ã»ãã³ãã£ã¯ã¹ã«äŸåããŠãããšã¯æããŸããã
IRCã®äŒè©±ïŒ https ïŒ
ãžã§ã»ãã£ã³ã®åé¡ïŒ https ïŒ
ccïŒ @nox @eddyb @pnkfelix
å ã®åé¡ã¯ãManualDropãè¿œå ãããšãJosephineãïŒããªãããããã«ïŒãã¹ãã©ã¯ã¿ãå®è¡ããã«ãããã³ã°ã¹ãã¢ãåå©çšããã«æ°žç¶çã«åçšããå€ã«äŸåããŠãããããäžå¥å šã«ãªãããšã§ãã
ãã¹ãã©ã¯ã¿ã®å®è¡ã¯ä¿èšŒãããŠããŸããã Rustã¯ãããä¿èšŒãããã®ã§ã¯ãããŸããã è©Šè¡ããŸãããããšãã°ã std::mem::forget
ã¯å®å
šãªé¢æ°ã«ãªããŸããã
ãããããã§ãã«ãŒããããããã£ãŒã«ããæã€ãŠããªã³ã«DropimplããããšèŠãªããå Žåãäžå€æ¡ä»¶ã¯åŸ©å ãããŸãã ããã¯é倧ãªå€æŽã§ãããå®éã®ã³ãŒããçŸåšã®ã»ãã³ãã£ã¯ã¹ã«äŸåããŠãããšã¯æããŸããã
ãŠããªã³ã®ã©ã®ãã£ãŒã«ããæå¹ãããããªãããšãäž»ãªçç±ã§ããŠããªã³ã¯å®å
šã§ã¯ãããŸããã ãŠããªã³ã¯èªåDrop
implãæã€ããšã¯ã§ããŸããã ãã®ãããªimplãå¿
èŠãªå Žåã¯ã Drop
implã®unionãã£ãŒã«ããæå¹ãã©ãããç¥ãå¿
èŠããããšããæå³ãèæ
®ããŠãæåã§èšè¿°ããå¿
èŠããããŸãã
ããã«äžã€ã®æ確åïŒç§ã¯ãç§ãã¡ãä»ãŸã§ãšçµåèš±å¯ããªããã°ãªããªããšã¯èããŠããªãDrop
å°ãªããšãèŠåã»ãã€ã»ããã©ã«ã糞ãããããã§ãªãå Žåã¯ããšã©ãŒã»ãã€ã»ããã©ã«ãã®lintããã«ãããã©ã«ãã§ãã£ãŒã«ããã unions_with_drop_fields
ã¯ãå®å®åããã»ã¹ã®äžéšãšããŠæ¶ããŠã¯ãªããŸããã
ç·šéïŒãã£ãšããéããŠã³ã¡ã³ãããæŒãã€ããã¯ãããŸããã§ããã
@joshtriplettã¯ããRustã¯ãã¹ãã©ã¯ã¿ãå®è¡ãããããšãä¿èšŒããŸããããmem::forget
ãååšããå Žåã§ãåœãŠã¯ãŸããŸããããã¯ãæ°žç¶çã«åçšããå€ã§åŒã³åºãããšãã§ããªãããã§ãã
ããã¯Joephineãããããããã«é Œã£ãŠãããã®ã§ããããããããã§ãã«ãŒãunions_with_drop_fields
åŠçããæ¹æ³ã®ããããã¯ãçå®ã§ã¯ãããŸããã
allow(unions_with_drop_fields)
ãå®å
šã§ãªã泚éã§ãããšèŠãªãããå Žåã¯åé¡ãããŸãããããã¯å€§å¹
ãªå€æŽã§ã¯ãªããAFAICTã§ãã deny(unsafe_code)
ããã§ãã¯ããããã«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ã«ãã£ãŠèª¬æãããŠããDrop
ãã£ãŒã«ããããã³ãããæ¬åœã«ãžã§ã»ãã£ã³ãå£ãå¯äžã®ç£èŽ
ã§ããå Žåã
ManuallyDrop
ãªããŠãã誰ãããããäžå¥å
š
ç§ãèšãããšããŠããã®ã¯ããããããŸããã£ãã®ã¯åãªãäºæ ã ã£ããšç§ãã¡ã«èšãã®ã¯ééã£ãŠããããã«èããããšããããšã§ã
ãã®ããªãã¯ããèšèšããããå åã¯èŠåœãããªãã®ã§ããããäºæ ãšåŒã¶ã®ã¯ããªãå ¬æ£ã ãšæããŸãã
ãããŠãããå¿ããã¹ãã ãš
ãã®éšåã¯ç§ã®å人çãªçŽæã§ããããšãæ確ã«ãã¹ãã§ããã ãããã幞ããªäºæ
ããšå®£èšããå®éã«ä¿èšŒããããšãåççãªè¡åã®ãã€ã³ãã«ãªããšæããŸããä»ã®ãã¹ãŠã®unsafe
ã³ãŒãããã®ä¿èšŒãå°éããŠãããšåççã«ç¢ºä¿¡ããŠããå Žåã¯ããã®ä¿èšŒãæäŸããããšã¯ã ManuallyDrop
ãŠãŒã¹ã±ãŒã¹ãããéèŠã§ãã ããã¯ããªãŒã¯ãã«ãªãã¹ãšåæ§ã«ãã¬ãŒããªãã§ãããã±ãŒããé£ã¹ãŠé£ã¹ãããšãã§ããŸããïŒçŸåšã®APIã§Rc
ãšdrop
äž¡æ¹ãæã€ããšã¯ã§ããŸãã-ããŒã¹ã®ã¹ã³ãŒãã¹ã¬ããã ManuallyDrop
ãšPin
äž¡æ¹ãæã€ããšã¯ã§ããªããããã©ã¡ãã®æ¹æ³ã§ã決å®ããå¿
èŠããããŸãã
ãšã¯ãããããã§æäŸãããŠããå®éã®ä¿èšŒãæ£ç¢ºã«è¡šçŸããã®ã¯é£ãããšæããŸãããã®ãããå人çã«ã¯ã ManuallyDrop
ã¯åé¡ãªãããšããåŽé¢ã«åŸåããŠããŸãã
ä»ã®ãã¹ãŠã®
unsafe
ã³ãŒãããã®ä¿èšŒãå°éãããã®ä¿èšŒãæäŸããããšãManuallyDrop
ãŠãŒã¹ã±ãŒã¹ãããéèŠã§ãããšåççã«ç¢ºä¿¡ããŠããå Žåã ããã¯ããªãŒã¯ãã«ãªãã¹ãšåæ§ã«ãã¬ãŒããªãã§ãããã±ãŒããé£ã¹ãŠé£ã¹ãããšãã§ããŸããïŒçŸåšã®APIã§Rc
ãšdrop
äž¡æ¹ãæã€ããšã¯ã§ããŸãã-ããŒã¹ã®ã¹ã³ãŒãã¹ã¬ãããManuallyDrop
ãšPin
äž¡æ¹ãæã€ããšã¯ã§ããªããããã©ã¡ãã®æ¹æ³ã§ã決å®ããå¿ èŠããããŸãã
ååã«å
¬å¹³ã§ããç§ã¯å¿ããããã«åæããŸãã @asajeffreyãæçµçã«æªå®çŸ©ã®åäœãšããŠèª¬æããããšãèæ
®ãããšã drop
ããŒã¹ã®ã¹ã³ãŒãä»ãã¹ã¬ããAPIãè¿ãããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
ç§ãç解ããŠããéããã¢ã©ã³ã®ææ¡ã¯ManuallyDrop
ãåé€ããããšã§ã¯ãªããdropckã«ããïŒããã³Drop
ãã£ãŒã«ããæã€ä»ã®ãŠããªã³ïŒã«ãã¹ãã©ã¯ã¿ããããšæ³å®ãããããšã ãã§ãã ïŒãã®ãã¹ãã©ã¯ã¿ã¯ããŸããŸäœãããŸãããããã®åãªãååšã¯ãdropckãåãå
¥ãããŸãã¯æåŠããããã°ã©ã ã«åœ±é¿ãäžããŸããïŒ
ManualDropããªããŠãã誰ãããããäžå¥å šã§ãããšç€ºãããšãã§ããã°ãç§ã¯ãããå¿ããŠå¹žãã§ãã
ãããé©æ Œãã©ããã¯ããããŸãããããããç§ã®æåã®è©Šã¿ã§ãã 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 ïŒ
ããã¯ç§ãäžèšã®äž¡åã®å£ã«ãã£ãŠæå³ãããã®ã§ã-ç§ãèŠãéããç§ã®ManuallyDrop
ã¯ç§ãã¡ãåºãããã¹ãŠã®èŠåãå°éããŸãã ãããã£ãŠãäºææ§ã®ãªãå®å
šã§ãªãã³ãŒãã2ã€ãããŸãã ManuallyDrop
ãšPin
ã§ãã ãæ£ãããã®ã¯èª°ã§ããïŒ Pin
ã¯ããããŸã§ã«è¡ã£ãããšã®ãªãä¿èšŒã«äŸåããŠãããããããã§ã¯ãééã£ãŠããããšæããŸãããããã¯å€æã®åŒã³ããã§ããã蚌æ ã§ã¯ãããŸããã
ä»ãããã¯èå³æ·±ãã§ãã åºå®æ©èœã®äžéšã®ããŒãžã§ã³ã§ã¯ã Pin::pin
ã¯&'this mut Pin<'this, T>
Pin::pin
åããŸããã ManuallyDrop
ãDerefMut
implãæã€ããšã¯äžåçã§ã¯ãããŸããã ïŒ
ããã¯ã @ RalfJungãïŒåœç¶ã®ããšãªããïŒ &mut
åãpin
ã¡ãœããã§Pin
ãç Žãããšã瀺ãéã³å Žã§ãã
https://play.rust-lang.org/?gist=5057570b54952e245fa463f8d7719663&version=nightly
ManualDropãDerefMutimplãæã€ããšã¯äžåçã§ã¯ãããŸããããïŒ
ããããã®äŸã«å¿
èŠãªAPIãè¿œå ããŸããã æãããªderef_mut
ã¯åé¡ãªãæ©èœããã¯ãã§ãã
ç§ãç解ããŠããéããAlanã®ææ¡ã¯ãManuallyDropãåé€ããããšã§ã¯ãªããdropckã«ããïŒããã³Dropãã£ãŒã«ããæã€ä»ã®ãŠããªã³ïŒã«ãã¹ãã©ã¯ã¿ããããšæ³å®ãããããšã ãã§ãã ïŒãã®ãã¹ãã©ã¯ã¿ã¯ããŸããŸäœãããŸãããããã®åãªãååšã¯ãdropckãåãå ¥ãããŸãã¯æåŠããããã°ã©ã ã«åœ±é¿ãäžããŸããïŒ
ãããç§ã¯ãããèŠéããŠããŸããã ç³ãèš³ãããŸããã ç§ã®äŸã«ä»¥äžãè¿œå ããŠããããã¯æ©èœãç¶ããŸãïŒ
unsafe impl<#[may_dangle] T> Drop for ManuallyDrop<T> {
fn drop(&mut self) {}
}
#[may_dangle]
ãåé€ããå Žåã«ã®ã¿ãRustã¯ãããæåŠããŸãã ãããã£ãŠãå°ãªããšããäžèšã®ã³ãŒããéåããŠãããšããã«ãŒã«ãèãåºãå¿
èŠããããŸããããããšäºææ§ã®ãªããµãŠã³ãã«ãããã³ãŒããååšããããšèšãã ãã§ã¯ããããåå ã§äžæ£ãªåŒã³åºãã«ãªããŸããããã€ãã®ã³ãŒããèŠãŠããããå¥å
šã§ãããã©ããã確èªããããšã¯ã»ãšãã©äžå¯èœã§ãã
ãã®ãå¶çºçãªä¿èšŒãã«ã€ããŠç§ãæãäžå®ã«æãã®ã¯ããããæ©èœããæ£åœãªçç±ã1ã€ãèŠåœãããªãããšã ãšæããŸãã Rustã§ã®æ¥ç¶æ¹æ³ã«ãã£ãŠãããç¶æãããŸããããªãŒã¯ãé²ãããã§ã¯ãªãããããããŒã¿ãžã®èª€ã£ãåç
§ïŒãã¹ãã©ã¯ã¿ã§äžè¬çãªåé¡ïŒãåé¿ããããã«dropckãè¿œå ãããŸããã 以äžã®ããã®æšè«Pin
ä»äºã«ã¯åºã¥ããŠããªããããã§ã¯ããªãæ確ã«ããŒãåãããŒã¿ãæŒæŽ©ããããšã¯ã§ããªããšèšãããšããéã®ã³ã³ãã€ã©ã§ã¯ãããã€ãã®ã¡ã«ããºã ããããã¯ããã€ãã®ã¿ã€ãã®ã·ã¹ãã ã®ä¿èšŒã§ããã -ããã¯ããªãåºã¥ããŠããŸããç§ãã¡ã¯äžçæžåœåªåããŸããããæ°žä¹
ã«åããããŒã¿ãæŒããããšãã§ããªãã£ãã®ã§ãããã¯å€§äžå€«ã ãšæããŸããã å¥å
šæ§ãããã«é Œããšãããªãç·åŒµããŸãã ç·šéïŒã³ã³ãã€ã©ã®ãã®éšåã«ã¯åä»ãªå¥å
šæ§ã®ãã°ã®æŽå²ããããããdropckãé¢ä¿ããŠãããšããäºå®ã¯ç§ãããã«ç·åŒµãããŸãã ãããæ©èœããçç±ã¯ãããŒãåå
¥ãå®å
šãªdrop
ãšå¯Ÿç«ããŠãããããšæãããŸãã ããã¯æ¬åœã«ãæ°žä¹
ã«åããããŒã¿ã§äœãã§ãããã«ã€ããŠã®åŸ¹åºçãªäºäŸåæã«åºã¥ãæšè«ãã®ããã§ãã
ããŠãå
¬å¹³ãæãããã«ãå
éšã®å¯å€æ§ã«ã€ããŠåæ§ã®ããšãèšãããšãã§ããŸã-é©åãªAPIãéžæããã°ãå
񑆇
§ãä»ããŠå€æŽãèš±å¯ããããšãå®éã«å®å
šã«æ©èœããå ŽåããããŸãã ãã ãããããæ©èœãããã«ã¯ãæé©åãšè¡çªãããããã³ã³ãã€ã©ã§ã®æ瀺çãªãµããŒãïŒ UnsafeCell
ïŒãå®éã«å¿
èŠã§ããããŸããå
éšã®å¯å€æ§ããªããšå¥å
šã§ããããå
éšã®å¯å€æ§ã§ã¯å¥å
šã§ã¯ãªãå®å
šã§ãªãã³ãŒãããããŸãã ãã1ã€ã®éãã¯ãå
éšã®å¯å€æ§ãæåããïŒãŸãã¯éåžžã«æ©ã段éãã-ããã¯Rustã³ãã¥ããã£ã§ã®ç§ã®æéãããã£ãšåã®ïŒèšèšç®æšã§ãã£ãããšã§ããããã¯ãæ°žä¹
åãããã®ãæŒããªããå Žåã«ã¯åœãŠã¯ãŸããŸããã ãããŠæåŸã«ãå
éšã®å¯å€æ§ã«ã€ããŠã¯ããå
±æãããšçªç¶å€ç°ãå±éºã«ãªããŸãããäžå¯èœã§ã¯ãããŸãããå
񑆇
§ãAPIã¯ãäžè¬ã«å¯å€æ§å€ãã®æéãè²»ãããŠããŸããããã®ãããç§ãæ°ä»ããŠããªããç®åã®åé¡ã«ã€ããŠãåæ§ã«éŠå°Ÿäžè²«ããç¶æ³ããããããããŸããã
ã¿ã€ã ãŸãŒã³ã¯æ¥œããã§ããç§ã¯èµ·ããã°ããã§ãïŒ ããã«ã¯2ã€ã®åé¡ïŒäžè¬ã«äžå€æ¡ä»¶ãç¹ã«dropckïŒãããããã«æãããã®ã§ãå¥ã ã®ã³ã¡ã³ãã«å ¥ããŸã...
@RalfJung ïŒã¯ããããã¯å®å
šã§ãªãRustã«ãã£ãŠç¶æãããŠããäžå€æ¡ä»¶ã«é¢ããåé¡ã§ãã Rust + stdã®ã©ã®ããŒãžã§ã³ã§ããä¿¡é Œä¿èšŒæšè«ã䜿çšããŠç¶æãããäžå€ã®I
éžæè¢ãè€æ°ãããŸãã å®éãäºææ§ã®ãªãI1
ãšI2
ãéžæãã2ã€ã®ã©ã€ãã©ãªL1
ãšL2
ãååšããå¯èœæ§ãããããã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ãããã³ã³ããã¹ãïŒã ç¹ã«ãå®å šãªã³ã³ããã¹ãC st C [Pinning]ãããŸããããªãã£ãããããã³çãã¯1.20ããåã®Rustã®ãã®å¶çŽãå®éã«æºãããŠãããšç§ã¯äž»åŒµããŸãã
ãã ããããã¯åãªãå µèã®åŒè·å£«ã§ããããã®ã³ã³ããã¹ãå®çŸ©ã«åé¡ãããããšã«èª°ããåæããŠãããšæããŸãããããã£ãŠãå®å šã§ãªãã³ãŒãã¬ã€ãã©ã€ã³ã«é¢ãããã¹ãŠã®è°è«ããããŸãã
ä»ã«äœããªããšããŠãããã³çãã¯å¶çºçãªäžå€æ¡ä»¶ãããŸããããªããšããèå³æ·±ãäŸã瀺ããŠãããšæããŸãã
ã¿ã°ãªããŠããªã³ïŒãããã£ãŠManuallyDrop
ïŒãè¡ã£ãç¹å®ã®ããšã¯ããããããã§ãã«ãŒãšã®çžäºäœçšManualDrop
ããç¹ã«
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
è€è£œããŠããæªå®çŸ©ã®åäœã¯çºçããŸãããçŽæ¥ãããã§ãå®å
šã§ãªãã³ãŒããè¡ãããšã¯æããã«éæ³ãšèŠãªãããŸãã ãã®çç±ã¯ãä»ã®å®å
šã§ãªãã³ãŒãã¯ããã®æææš©ã®èŠåŸãå°éãããããšã«äŸåããŠããå¯èœæ§ããããç©äºãè€è£œããããšã¯ãã®èŠåŸã«éåããããã§ãã
ä»ã«äœããªããšããŠãããã³çãã¯å¶çºçãªäžå€æ¡ä»¶ãããŸããããªããšããèå³æ·±ãäŸã瀺ããŠãããšæããŸãã
ãããããã¯ç¢ºãã«ã ãããŠãå°æ¥ãããåé¿ããããã«äœãã§ããã®ã ãããïŒ ãã¶ãhttps://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.htmlã«ããäžå€æ¡ä»¶ãrustc + libstdã«ä¿æãããŠãããããšãã£ãŠãå®å šã§ãªãã³ãŒããã§ãããšããæå³ã§ã¯ãããŸãããããã«äŸåããŸã;代ããã«ãä¿¡é Œã§ããããã€ãã®äžå€æ¡ä»¶ããããŸããïŒ
@RalfJungã¯ããäž»ã«ã³ã³ããã¹ãã®èŠ³å¯åã«å¯ŸããŠè匱ã§ããããããæ£åœæ§ãã®ã³ã³ããã¹ã
ç§ãæ±ããŠããã®ã¯ãå°ãæºãåãäœå°ãäžããŠãä¿¡é Œä¿èšŒæšè«ã®ããã«2ã€ã®äžå€æ¡ä»¶ãå®çŸ©ã§ããããšã ãã§ãïŒã³ãŒãã¯Rã«äŸåã§ããGãä¿èšŒããå¿ èŠããããŸããGã¯Rãæå³ããŸãïŒã ããããã°ãRã匷åããŠGã匱ããäœå°ããããŸããäžå€æ¡ä»¶ã1ã€ãããªãå ŽåïŒã€ãŸãã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è©äŸ¡ãšã©ãŒãnon-constfn std::ptr::drop_in_place::<(std::boxed::Box<std::string::String>, ())>
- shim(Some((std::boxed::Box<std::string::String>, ())))
åŒã³åºããŠããŸãããçæããŸãã
.to
ã®ã¿ã€ããconst-checkerã«ãã£ãŠç£èŠãããããã«åŒ·å¶ããããã«å€æŽããŸãã
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ãšããŠïŒå®è£
ããã®ã¯çŸå®çã§ããïŒ ç§ã®ç¥ãéããçµåã«ãããDrop
ã®æ倧ã®åæ©ã¯ã ManuallyDrop
ããã§ãããããã¯éåžžã«ç¹æ®ãªã±ãŒã¹ã§ãã
è¯å®çãªããããããªããã®ç¹æ§ããªãå Žåããã¹ãŠã®ãã£ãŒã«ããCopy
ãŸãã¯ManuallyDrop<T>
圢åŒã§ããå ŽåããŠããªã³ã¯æŽåœ¢åŒã§ãããšèšããŸãã ããã¯ããŠããªã³ãã£ãŒã«ããå²ãåœãŠããšãã«ããããããããšã«é¢ãããã¹ãŠã®è€éããå®å
šã«åé¿ãïŒãã¹ãŠã®å¯èœãªãœãªã¥ãŒã·ã§ã³ã¯é©ãã¹ããããã¬ã³ã§ãã£ã±ãã«ãªããšæãããŸãïŒã ManuallyDrop
ã¯ãããã°ã©ããŒãDrop
ãåŠçããå¿
èŠãããããšãæ確ã«ç€ºããŠããŸãã Drop
å®è£
ããªãããšããååããªèšãæ¹ããããšãããè¯ããïŒ
æåã®æçš¿ã®ãã§ãã¯ãªã¹ãã§ã¯ããµã€ãºã®ãªããŠããªã³ã«ã€ããŠãRFCã«ã€ããŠãèšåãããŠããŸããããããã§ããåäžããªã¢ã³ãã®ãŠããªã³ã«éå®ãããå®è£ ããããŸãã ããã¯ãã¬ã€ã¢ãŠãæé©åãšã®çžäºäœçšãšå¯æ¥ã«é¢é£ããŠããŸããããã¯ãåäžããªã¢ã³ãã®ãŠããªã³ãäœããã®æå³ã§ãæå¹ãã§ããå¿ èŠãããããšãåæãšããŠããããã§ãïŒãããããããå¯èœæ§ããããŸãããããã§ã¯ãããŸããïŒãä»»æã®å¥æ°ããããã¿ãŒã³ïŒã
ããã¯ããæ¡åŒµãã€ã³ããã§ããCã§ãŠããªã³ã䜿çšãããæ¹æ³ãšççŸããŸãïŒIIRC @joshtriplettãããã«å šé¢çã«èšåããŸããïŒïŒããããŒãã¡ã€ã«ã¯ãŠããªã³ã®3ã€ã®ããªã¢ã³ãã宣èšããå ŽåããããŸãããããã¯åŸã§ããªã¢ã³ããè¿œå ããããšã§äžäœäºææ§ããããšèŠãªãããŸãïŒãŠããªã³ã®ãµã€ãºãå¢å ããªãéãïŒã ã©ã€ãã©ãªã®ãŠãŒã¶ãŒã¯ãã¿ã°ïŒå¥ã®å Žæã«ããïŒãçŸåšã®ããªã¢ã³ããç¥ããªãããšã瀺ããŠããå ŽåããŠããªã³ããŒã¿ã«è§ŠããªãããšãçŽæããŸãã éèŠãªã®ã¯ãããªã¢ã³ãã1ã€ãããªãå Žåã§ããããªã¢ã³ãã1ã€ãããªããšããæå³ã§ã¯ãããŸããã
ãã§ãã¯ã¯ããã¹ããŒãã«ãªãå¯èœæ§ããããŸããããšãã°ãåãã¯ã¬ãŒãã§å®£èšãããŠãã補åã¿ã€ããšåç®ã¿ã€ããééããå¯èœæ§ããããŸãã
ãã®è¿°èªã¯ãã§ã«ååšããŸããããã€ã³ãããç¹æ§ããªãããããžã§ããªãã¯ã¹ã§ã¯ä¿å®çã§ãã
std::mem::needs_drop
ïŒ rustc
å®è£
ããçµã¿èŸŒã¿é¢æ°ã䜿çšïŒãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã
@eddybã¯ãäžäœäºææ§ãèæ
®ããŠneeds_drop
ãå®è¡ããŸããããããšãä»ã®äœæãåãã§èª¿ã¹ãŠããããã®åãDrop
å®è£
ããŠãããã©ãããå€æããŸããïŒ ããã§ã®ç®æšã¯ãsemveräºæã®å€æŽãã決ããŠå£ããªããã§ãã¯ãè¡ãããšã§ããããšãã°ãåãŸãã¯æå¹æéãã©ã¡ãŒã¿ãŒããªãããã©ã€ããŒããã£ãŒã«ãã®ã¿ãsemveräºæã§ããæ§é äœã«impl Drop
ãè¿œå ããŸãã
@RalfJung
ããã¯ããæ¡åŒµãã€ã³ããã§ããCã§ãŠããªã³ã䜿çšãããæ¹æ³ãšççŸããŸãïŒIIRC @joshtriplettãããã«å šé¢çã«èšåããŸããïŒïŒããããŒãã¡ã€ã«ã¯ãŠããªã³ã®3ã€ã®ããªã¢ã³ãã宣èšããå ŽåããããŸãããããã¯åŸã§ããªã¢ã³ããè¿œå ããããšã§äžäœäºææ§ããããšèŠãªãããŸãïŒãŠããªã³ã®ãµã€ãºãå¢å ããªãéãïŒã ã©ã€ãã©ãªã®ãŠãŒã¶ãŒã¯ãã¿ã°ïŒå¥ã®å Žæã«ããïŒãçŸåšã®ããªã¢ã³ããç¥ããªãããšã瀺ããŠããå ŽåããŠããªã³ããŒã¿ã«è§ŠããªãããšãçŽæããŸãã éèŠãªã®ã¯ãããªã¢ã³ãã1ã€ãããªãå Žåã§ããããªã¢ã³ãã1ã€ãããªããšããæå³ã§ã¯ãããŸããã
ããã¯éåžžã«ç¹æ®ãªã±ãŒã¹ã§ãã
ããã¯ãCããããŒããçæãããCã¹ã¿ã€ã«ã®ãŠããªã³ã«ã®ã¿åœ±é¿ããŸãïŒãããã£ãŠããã¹ãã©ã¯ã¿ã¯ãªãããã¹ãŠãCopy
ã§ãããstableã§äœ¿çšå¯èœãªãµãã»ããã§ãïŒã
ãã®ãããªãŠããªã³ã«_dummy: ()
ãŸãã¯_future: ()
ãã£ãŒã«ããç°¡åã«è¿œå ããŠãããã©ã«ãã§ããå®å
šãªãåæåãã¢ãã«ã®æ©æµãåãç¶ããããšãã§ããŸãã ãæ¡åŒµãã€ã³ããã§ããFFIãŠããªã³ã¯ããšã«ããååã«ææžåããå¿
èŠããããã®ã§ãã
2018幎4æ17æ¥åå10æ08å54ç§AM PDTã§ããŽã¡ãã£ã Petrochenkovã®[email protected]ã¯æžããŸããïŒ
ãã®ãããªãŠããªã³ã«
_dummy: ()
ãŸãã¯_future: ()
ãã£ãŒã«ããç°¡åã«è¿œå ã§ããŸã
ããã©ã«ãã§ã¯ãããå®å šãªãåæåãã¢ãã«ã®æ©æµãåãç¶ããŸãã
å€å¥åŒãããããªãåæåã®ããã«çµåãæ±ãããšã«ã€ããŠäººã ã話ããŠããã®ãèŠãããšããããŸãããç§ã®ç¥ãéããå®éã®ã¢ãã«ããã®ãããªæ±ãã«ã€ããŠã¯ç¥ããŸããã å ã®è°è«ã§ã¯ãéFFIçµåã§ãããéFFIçµåãæãã§ããåæ©ä»ãã®ãŠãŒã¹ã±ãŒã¹ãå«ãããäžåºŠã«æå¹ãªè€æ°ã®ããªã¢ã³ããã¢ãã«ãæãã§ããŸããã
()
ããªã¢ã³ãããŠããªã³ã«è¿œå ããŠãäœãå€æŽãããªãã¯ãã§ãããŸãããŠããªã³ãæåŸ
ããã»ãã³ãã£ã¯ã¹ãååŸããããã«å€æŽããå¿
èŠã¯ãã
FFIãŠããªã³
ãæ¡åŒµãã€ã³ããã§ããããšã¯ãååã«ææžåããå¿ èŠããããã®ã§ãã
ãšã«ããã
ã»ãã³ãã£ã¯ã¹ãã§ããã ãæ£ç¢ºã«ææžåããå¿ èŠããããŸãã
@RalfJungãããã auto trait
ã®ããã«åäœãããã¹ãŠã®å
éšè©³çŽ°ãå
¬éããŸãã
çŸåšããã¢ã¯ãã£ããã£ãŒã«ããã«ã€ããŠããã€ãã®è°è«ãããã httpsïŒ //github.com/rust-lang/rust/issues/41073#issuecomment-380291471ã§çµåã«åå ããŠã
ãŠããªã³ã¯ãå®å šã§ãªãã³ãŒããã¢ã¯ã»ã¹ãããŸã§ããã€ã§ãäœãå«ãŸããŠããã®ãããããªããŸãŸããããã®è¢ã§ããç¶ããå¿ èŠããããŸãã
ããã¯ãŸãã«ç§ãçµåãæ©èœããããšãæåŸ ããæ¹æ³ã§ãã ãããã¯ãäœåãªããã©ãŒãã³ã¹ãçµãåºãããã¹ãã©ã¯ã¿ãªã©ããªãCã³ãŒããšå¯Ÿè©±ããããã®é«åºŠãªæ©èœã§ãã
ç§ã«ãšã£ãŠããŠããªã³ã®å
容ãåé€ãããå Žåã¯ãã¿ã€ãã«ãã£ã¹ã/å€æããå¿
èŠããããŸãïŒå¥ã®ããªã¢ã³ãã®æåŸã«ããã€ãã®æªäœ¿çšããããããããããã倧ãããªãå¯èœæ§ããããããå€æã§ããªãå¯èœæ§ããããŸãïŒããããããå¿
èŠããããããããããå¿
èŠã®ãããã£ãŒã«ããžã®ãã€ã³ã¿ãååŸããŠ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ã®æ¹æ³ãç·šéããŸãã
ãŠããªã³ã®å 容ãåé€ããå Žåã¯ãåé€ããã¿ã€ãã«ãã£ã¹ã/å€æããå¿ èŠããããŸãïŒå¥ã®ããªã¢ã³ãã®æåŸã«æªäœ¿çšã®ãããããããããå€æã§ããªãå¯èœæ§ããããŸãïŒã ããŸãã¯ãã£ãŒã«ãæ§æã䜿çšããŠå€ãæœåºããŸã
ïŒãããããããã ãã®å Žåã¯ã移åãããšããæå³ã§å€ãæœåºããå¿
èŠã¯ãããŸããããã£ãŒã«ãã®1ã€ãžã®ãã€ã³ã¿ãŒãååŸããŠã std::ptr::drop_in_place
ã䜿çšã§ããŸããïŒ
é¢é£ïŒå®æ°ã«ã€ããŠã¯ãçŸåšãå®æ°å ã®ãŠããªã³ã®å°ãªããšã1ã€ã®ãã£ãŒã«ããæ£ããå¿ èŠããããšäž»åŒµããŠããŸãïŒ https ïŒ
ãããæçš¿ããŠããç·šéããŠãäœæ¥ãç¡é§ã«ããªãããã«ããŸãã
ç·šéå 容ã¯ã¡ãŒã«éç¥ã«åæ ãããªãããšã«æ³šæããŠãã ããã ã³ã¡ã³ãã«å€§å¹ ãªå€æŽãå ããå Žåã¯ã代ããã«ããŸãã¯è¿œå ã§æ°ããã³ã¡ã³ããäœæããããšãæ€èšããŠãã ããã
@derekdreery ïŒããã³ä»ã®ãã¹ãŠã®äººïŒ https://internals.rust-lang.org/t/pre-rfc-unions-drop-types-and-manuallydrop/8025ã«å¯Ÿãããã£ãŒãããã¯ã«èå³ããããŸã
é¢é£ïŒå®æ°ã«ã€ããŠã¯ãçŸåšãå®æ°å ã®å ±çšäœã®å°ãªããšã1ã€ã®ãã£ãŒã«ããæ£ããå¿ èŠããããšäž»åŒµããŠããŸãïŒïŒ51361
ç§ã¯å®è£ ãèŠãŸããããè°è«ãèŠãŠããŸããã ;ïŒ
ããŒãšâŠãå šããã§ãã¯ããªãã®ã¯å€ã«æããããšããè°è«ã
constãã§ãã«ãŒã§æãã€ããã¹ããŒã ãå®è£ ã§ããã°å¹žãã§ãããç§ã®çŽæã§ã¯ããŠããªã³ã®1ã€ã®ããªã¢ã³ããå®å šã«æ£ããå¿ èŠããããšããããšã§ããã
ãã以å€ã®å Žåãå ±çšäœã¯ç¹å®ã®ãµã€ãºãšé 眮ã§åãæå®ããããã®åªããæ¹æ³ã§ãããäžéšã®ã³ã³ãã€ã©ãŒã¯ãåã®åºå®ã»ããéã§å€æããããã®äŸ¿å©ããçæããŸããã
ãŠããªã³ã¯ããããã«ã¢ã¯ã»ã¹ããããã®äŸ¿å©ãªæ¹æ³ãåãããæªè§£éã®ãããã®ããã°ãã ãšæããŸãã ç§ã¯ãããããã§ãã¯ããªãããšã«ã€ããŠäœãå¥åŠãªããšã¯èŠãŠããŸããã
AFAIKã¯ãå®éã«ã¯ããã«ãªã³ã®ãªãŒã«ãã³ãã§èšåãããŠãã@joshtriplettã®ãŠãŒã¹ã±ãŒã¹ãããã€ãããããŠããªã³ã®ååã1ã€ã®ãã£ãŒã«ãã«äžèŽããåŸåãä»ã®ãã£ãŒã«ãã«äžèŽããŸãã
ãŠããªã³ã¯ããããã«ã¢ã¯ã»ã¹ããããã®äŸ¿å©ãªæ¹æ³ãåãããæªè§£éã®ãããã®ããã°ãã ãšæããŸãã ç§ã¯ãããããã§ãã¯ããªãããšã«ã€ããŠäœãå¥åŠãªããšã¯èŠãŠããŸããã
ç§ã¯ãã€ãããã®è§£éã¯èšèªã®ç²Ÿç¥ã«ããããåããŠããŸããã
ä»ã®å Žæã§ã¯ãéçåæã䜿çšããŠãããã¬ã³ãé²æ¢ããåæåãããŠããªãå€ãŸãã¯åçšãããå€ãã¢ã¯ã»ã¹ãããŠããªãããšã確èªããŸãããåæãçªç¶ç¡å¹ã«ãªã£ããŠããªã³ã«ã€ããŠã¯ãæ®åœ±ããŠãã ããã
ããã¯ãŸãã«union
ã®ç®çã ãšæããŸãã ã€ãŸãããã¹ãŠã®åæãç¡å¹ã«ãªã£ãŠããçã®ãã€ã³ã¿ãŒããããŸãã ãŠããªã³ã¯ãçã®ãã€ã³ã¿ãã¡ã¢ãªã¢ã¯ã»ã¹ãå®å
šã«å¶åŸ¡ããã®ãšåãããã«ãããŒã¿ã¬ã€ã¢ãŠããå®å
šã«å¶åŸ¡ããŸãã ã©ã¡ããå®å
šæ§ãç ç²ã«ããŠè¡ããŸãã
ãŸããããã«ããunion
ç°¡åã«ãªããŸãã åçŽã§ããããšã¯éèŠã ãšæããŸããå®å
šã§ãªãã³ãŒããé¢ä¿ããŠããå Žåã¯ããã«éèŠã§ãïŒããã¯åžžã«ãŠããªã³ã®å Žåã§ãïŒã ããã§ã¯ãå
·äœçãªã¡ãªãããåŸãããå Žåã«ã®ã¿ãäœåãªè€éããåãå
¥ããå¿
èŠããããŸãã
ããã°ãªããããã¢ãã«ã¯ãæªç¥ã®ããªã¢ã³ããæã€åæåã¢ãã«ãšæ¯èŒããŠæ°ããæ©äŒãäžããªãããããŠããªã³ã«ãã®ã³ã¹ããæ¯æãå¿ èŠã¯ãªããšæããŸãã
ããã§åé¡ãšãªã£ãŠããããããã£ã¯ãå°ãªããšããå®å šã§ãªãã³ãŒããä¿è·æ段ã§ããã®ãšåããããè² æ ã«ãªããŸãã å®å šã§ãªãåã®ãã³ãã³ã°ã«ãŠããªã³ã䜿çšãããã®ã§ããã®ããããã£ãå£ãå¯èœæ§ã®ãããã¹ãŠã®ééããé²ãããšãã§ããéçåæã¯ãããŸãã1ããããã£ãŠããæªç¥ã®ããªã¢ã³ããæã€åæåãã¯ãã³ãŒãåŠçãŠããªã³ãæžã蟌ã¿æ¹æ³ã«çŽ°å¿ã®æ³šæãæãå¿ èŠãããããšãæå³ããŸãããŠããªã³ãŸãã¯ãªã¹ã¯ã€ã³ã¹ã¿ã³ãUBããŠããªã³ããã®èªã¿åãã«äŒŽãå®å šæ§ãå®éã«æžããããšãªããèŠåã§ããã®ã¯ããã®ããªã¢ã³ãã®ãããã«ãç¡å¹ãªãŠããªã³ãmiriã§å®è¡ãããŠããå Žåã®ã¿ã§ãããå®è¡æã«çºçããã±ãŒã¹ã®å€§éšåã§ã¯ãããŸããã
1ããšãã°ãç°¡åã«ããããã«ã¿ãã«ãreprïŒCïŒã§ãããšä»®å®ãããšã union Foo { a: (bool, u8), b: (u8, bool) }
䜿çšãããšããã£ãŒã«ãã®å²ãåœãŠã ãã§ç¡å¹ãªãã®ãäœæã§ããŸãã
@rkruppe
union Foo {aïŒïŒboolãu8ïŒãbïŒïŒu8ãboolïŒ}
ãããããã¯ç§ã®äŸã§ã:)
ãããŠãRFC 1897ã®ã¢ãã«ïŒããªãŒãããã©ã°ã¡ã³ãã®å°ãªããšã1ã€bool
-1ã u8
-1ã u8
-2ã bool
-2ã¯ãéšåçãªå²ãåœãŠã®åŸã§æå¹ã§ãïŒã
ãŠããªã³ãåŠçããã³ãŒãã¯ããŠããªã³ãžã®æžã蟌ã¿æ¹æ³ã«çŽ°å¿ã®æ³šæãæãå¿ èŠããããŸããããããªããšãã€ã³ã¹ã¿ã³ãUBãå±éºã«ãããããŸãã
ãããRFC1897ã®ã¢ãã«ã®ãã€ã³ãã§ããéçãã§ãã¯ã«ãããå®å
šãªæäœïŒå²ãåœãŠãéšåçãªå²ãåœãŠãªã©ïŒã«ãã£ãŠãŠããªã³ãç¡å¹ãªç¶æ
ã«ãªãããšã¯ãã
ã¯ã€ã«ããã€ã³ã¿ãä»ããæžã蟌ã¿ãªã©ããŠããªã³ã«é¢ä¿ã®ãªãå®å
šã§ãªãæäœã®ã¿ãããŠããªã³ãç¡å¹ã«ããããšãã§ããŸãã
äžæ¹ã移åãã§ãã¯ãè¡ããªããšããŠããªã³ã¯éåžžã«ç°¡åã«ç¡å¹ç¶æ ã«ãªããŸãã
let u: Union;
let x = u.field; // UB
ãããRFC1897ã®ã¢ãã«ã®ãã€ã³ãã§ããéçãã§ãã¯ã«ãããå®å šãªæäœïŒå²ãåœãŠãéšåçãªå²ãåœãŠãªã©ïŒã«ãã£ãŠãŠããªã³ãç¡å¹ãªç¶æ ã«ãªãããšã¯ãããŸããããã®ãããåžžã«çŽ°å¿ã®æ³šæãæãå¿ èŠã¯ãªããã€ã³ã¹ã¿ã³ãUBãååŸããå¿ èŠããããŸããã ã
ã¯ã€ã«ããã€ã³ã¿ãä»ããæžã蟌ã¿ãªã©ããŠããªã³ã«é¢ä¿ã®ãªãå®å šã§ãªãæäœã®ã¿ãããŠããªã³ãç¡å¹ã«ããããšãã§ããŸãã
ããçš®ã®æžã蟌ã¿ã¯ããŠããªã³ã«èª²ããããè¿œå ã®äžå€æ¡ä»¶ã«éåããŠããªããšèªåçã«èªèã§ããŸãããããã§ãã©ã€ã¿ãŒãæ¯æããå¿ èŠãããã®ã¯è¿œå ã®äžå€æ¡ä»¶ã§ãã èªã¿åãã¯ãŸã å®å šã§ã¯ãªããèªã¿åãããããªã¢ã³ãã«å¯ŸããŠããããæå¹ã§ããããšãæåã§ç¢ºèªããå¿ èŠããããããããã¯å®éã«ã¯ãªãŒããŒã®å©ãã«ã¯ãªãããã©ã€ã¿ãŒã®ç掻ãå°é£ã«ããã ãã§ãã ããããã®ããã°ãããããªã¢ã³ããäžæãªåæåããããŠããªã³ã®é£ããåé¡ãã€ãŸããèªã¿åãããçš®é¡ã®ããŒã¿ãå®éã«æ ŒçŽããæ¹æ³ã解決ããã®ã«åœ¹ç«ã¡ãŸããã
ããæŽç·Žãããåãã§ãã¯ã¯Droppingã«ã©ã®ããã«åœ±é¿ããŸããïŒ ãŠããªã³ãäœæããŠæææš©ãååŸããCã«æž¡ããšãéã³ãŠããŒã¿ã解æŸããããšããããããããã«ããªãŒãçºçããŸããïŒ ãããšããåžžã«èªåã§Drop
å®è£
ããŸããïŒ
ææ¡ãç解ããŠããã°ããŠããªã³ããã³ã³ãã€ã«æã«ããªã¢ã³ããéçã«ãã§ãã¯ãããåæåãã®ãããªãã®ã§ããã°ãç·šéããã®ã¯ãšãŠãã¯ãŒã«ã§ãã
ç·šé2ã§ã¯ããŠããªã³ã¯ãããã®è¢ãšããŠéå§ããåŸã§äžäœäºææ§ãä¿ã¡ãªããå®å šãªã¢ã¯ã»ã¹ãèš±å¯ã§ããŸããïŒ
ãããŠãRFC 1897ã®ã¢ãã«ã®äžã§æå¹ã§ãïŒããªãŒãããã©ã°ã¡ã³ãbool-1ãu8-1ãu8-2ãbool-2ã®å°ãªããšã1ã€ã¯ãéšåçãªå²ãåœãŠã®åŸã«æå¹ã§ãïŒã
ãããæå¹ã«ããããšã«ããå Žåã@ oli-obkã¯ãããåæ ããããã«miriã®ãã§ãã¯ãæŽæ°ããå¿ èŠããããšæããŸã-https ïŒ//github.com/rust-lang/rust/pull/51361ãããŒãžãããšãã«ãã£ãŠæåŠãããŸãããªã
@petrochenkovç§ãç解ããŠããªãéšåã¯ããããç§ãã¡ãè²·ããã®ã§ãã å®è£ ïŒéçåæïŒãšäœ¿çšæ³ïŒãŠãŒã¶ãŒã¯æ£ç¢ºãªã«ãŒã«ãç¥ã£ãŠããå¿ èŠããããŸãïŒã®ç¹ã§ãããã«è€éã«ãªããŸãã ãã®äœåãªè€éãã¯ããŠããªã³ã䜿çšããããšããç§ãã¡ã¯ãã§ã«å±éºãªç¶æ³ã«ãããããç©äºã¯åœç¶ããè€éã«ãªããšããäºå®ã«ã€ãªãããŸãã ãã®äœåãªè€éãããªãããã ãã®äŸ¡å€ãããã®ãââã«ã€ããŠãæ確ãªåæ©ãå¿ èŠã ãšæããŸãã ãèšèªã®ç²Ÿç¥ã«å€å°éåããŠããããšããã®ã¯æ確ãªåæ©ã§ã¯ãªããšæããŸãã
ç§ãèããããšãã§ããã®ã¯ãã¬ã€ã¢ãŠãã®æé©åã§ãã ããããã®è¢ãã¢ãã«ã§ã¯ãçµåã«ã¯ãããããããŸããã ãã ããããã°ã©ããŒãããããæåã§å¶åŸ¡ã§ããããã«ããããšã§ãããé©åã«å¯ŸåŠã§ãããšæããŸããããã¯ãä»ã®å Žåã«ã圹ç«ã¡ãŸãã
ç§ã¯ããã§åºæ¬çãªäœããæ¬ ããŠãããšæããŸãã @rkruppeã«åæã
çµåã®é£ããåé¡ã¯ãçµåãçŸåšä¿ç®¡ããŠããããšã確èªããããšã§ã
ããã°ã©ã ãèªã¿åãããããŒã¿ã
ãããããã®åé¡ã¯éçåæã§ã¯ãããŒã«ã«ã«ã解決ããããšã¯ã§ããŸããã ç§é
å°ãªããšãããã°ã©ã å
šäœã®åæãå¿
èŠã«ãªããŸãããããã§ã
解決ããã®ãé£ããåé¡ã
ã ãã...ããŒãã«ã«ãã®åé¡ã®è§£æ±ºçã¯ãããŸããïŒ ãŸãã¯ãäœãããŸãã
ææ¡ãããŠããæ£ç¢ºãªãœãªã¥ãŒã·ã§ã³ã¯å®éã«ç§ãã¡ã賌å
¥ããŸããïŒ CããçµåãåŸããšããŸãããã
Rust and Cããã°ã©ã å
šäœãåæããã«ãææ¡ã§ããããš
éçåæã¯å®éã«èªè
ãä¿èšŒããŸããïŒ
@gnzlbgç§ãã¡ãåŸãå¯äžã®ä¿èšŒã¯ã @ petrochenkovãäžã«æžãããã®ã ãšæããŸã
éçãã§ãã¯ã«ãããå®å šãªæäœïŒå²ãåœãŠãéšåçãªå²ãåœãŠãªã©ïŒã«ãã£ãŠãŠããªã³ãç¡å¹ãªç¶æ ã«ãªãããšã¯ãããŸããã
äžæ¹ã移åãã§ãã¯ãè¡ããªããšããŠããªã³ã¯éåžžã«ç°¡åã«ç¡å¹ç¶æ ã«ãªããŸãã
ããªãã®ææ¡ã¯æªãèªã¿åããããä¿è·ããŸãããç§ã¯ãããå¯èœã§ãããšã¯æããŸããã
ãŸãããä»»æã®ãã£ãŒã«ãã«æžã蟌ããšãŠããªã³ãåæåãããããšããéåžžã«åºæ¬çãªãåæåã远跡ãæ³åããŸããã impl Drop for MyUnion
ãèš±å¯ãããŠããå ŽåDrop
å®è£
ãããŠããªã³ã®å ŽåãããŒã¿æ§é ãæ¢ã«åæåãããŠããªãéããã£ãŒã«ããžã®æžã蟌ã¿ãèš±å¯ããªãstruct
ãšåæ§ã®å¶éãæ³åããŸããã
@derekchiang
ãŠããªã³ã¯ãããã®è¢ãšããŠéå§ããåŸã§äžäœäºææ§ãä¿ã¡ãªããå®å šãªã¢ã¯ã»ã¹ãèš±å¯ã§ããŸããïŒ
ãããããããã®è¢ã ãšèšã£ããããããèš±å¯ãããŠãããšä»®å®ãããšãå®å šã§ãªãã³ãŒããååšããå¯èœæ§ããããŸãã
ãŠããªã³ãåæåãããŠãããã©ããã確èªããããã®æäœéã®ç§»åãã§ãã¯ã«ã¯äŸ¡å€ããããšæããŸãã å ã®RFCã¯ãä»»æã®ãŠããªã³ãã£ãŒã«ãã«åæåãŸãã¯å²ãåœãŠããšããŠããªã³å šäœãåæåãããããšãæ瀺çã«æå®ããŠããŸããã ãã ãããããè¶ ããŠãrustcã¯ããŠãŒã¶ãŒãæ瀺çã«æå®ããŠããªãå ±çšäœã®å€ã«ã€ããŠäœãæšæž¬ããããšãã¹ãã§ã¯ãããŸããã ãŠããªã³ã«ã¯ããã®ãã£ãŒã«ãã®ãããã«ãç¡å¹ãªå€ãå«ããä»»æã®å€ãå«ããããšãã§ããŸãã
ããšãã°ããã®ãŠãŒã¹ã±ãŒã¹ã®1ã€ã¯ãå°æ¥ããã«å€ãã®ã¿ã°ã䜿çšããŠæ瀺çã«æ¡åŒµå¯èœãªCã¹ã¿ã€ã«ã®ã¿ã°ä»ãå ±çšäœãæ€èšããããšã§ãã ãŠããªã³ãèãããããã¹ãŠã®ãã£ãŒã«ãã¿ã€ããç¥ã£ãŠãããšæ³å®ããŠã¯ãªããªãããšãèªã¿åãCããã³Rustã³ãŒãã
@RalfJung
å€åç§ã¯ä»ã®æ¹åããå§ããã¹ãã§ãã
ãã®ã³ãŒãã¯1ïŒãŠããªã³ã«å¯ŸããŠ2ïŒéãŠããªã³ã«å¯ŸããŠæ©èœããå¿ èŠããããŸããïŒ
let x: T;
let y = x.field;
ç§ã«ãšã£ãŠãçãã¯ã©ã¡ãã®å Žåãæãããªãããããã§ããããã¯ã T
ã®ãçµåãæ§ã«é¢ä¿ãªããRustãé²æ¢ã§ããé²æ¢ããããšã©ãŒã®ã¯ã©ã¹å
šäœã ããã§ãã
ã€ãŸãã移åãã§ãã«ãŒã«ã¯ããã®ãµããŒããå®è£
ããããã®äœããã®ã¹ããŒã ãå¿
èŠã§ãã 移åãã§ãã«ãŒïŒããã³åçšãã§ãã«ãŒïŒãäžè¬ã«ãã£ãŒã«ãããšã«æ©èœããããšãèãããšãå
±çšäœã®æãåçŽãªã¹ããŒã ã¯ããæ§é äœãšåãã«ãŒã«+ãã£ãŒã«ãã®ïŒéïŒåæå/åçšããã®å
åŒãã£ãŒã«ããïŒéïŒåæå/åçšãããã§ãã "ã
ãã®åçŽãªã«ãŒã«ã¯ããã¹ãŠã®éçãã§ãã¯ã察象ãšããŠããŸãã
次ã«ãåæåã¢ãã«ã¯ãäžèšã®éçãã§ãã¯+ãã1ã€ã®æ¡ä»¶ã®çµæã§ãã
1ïŒåæåãã§ãã¯ãæå¹ã§ã2ïŒå®å
šã§ãªãã³ãŒãããŠããªã³ã«å±ããé åã«ä»»æã®ç¡å¹ãªãã€ããæžã蟌ãŸãªãå ŽåããŠããªã³ã®ããªãŒãããã£ãŒã«ãã®1ã€ãèªåçã«æå¹ã«ãªããŸãã ããã¯åçã«ãã§ãã¯ã§ããŸããïŒå°ãªããšããã£ãŒã«ãã1ãè¶
ããconst-evaluatorã®å€éšã«ãããŠããªã³ã®å ŽåïŒä¿èšŒã§ããããŸãã³ãŒããèªã人ã察象ãšããŠããŸãã
ããšãã°ã @ joshtriplettããã®ãã®ã±ãŒã¹
ããšãã°ããã®ãŠãŒã¹ã±ãŒã¹ã®1ã€ã¯ãå°æ¥ããã«å€ãã®ã¿ã°ã䜿çšããŠæ瀺çã«æ¡åŒµå¯èœãªCã¹ã¿ã€ã«ã®ã¿ã°ä»ãå ±çšäœãæ€èšããããšã§ãã ãŠããªã³ãèãããããã¹ãŠã®ãã£ãŒã«ãã¿ã€ããç¥ã£ãŠãããšæ³å®ããŠã¯ãªããªãããšãèªã¿åãCããã³Rustã³ãŒãã
ãŠããªã³ã«ãå°æ¥ã®æ¡åŒµã®å¯èœæ§ãã®ããã®è¿œå ãã£ãŒã«ããæ瀺çã«ããå Žåãã³ãŒããèªã人ã ã«ãšã£ãŠã¯ããã«æ確ã«ãªããŸãã
ãã¡ãããåºæ¬çãªéçåæåãã§ãã¯ãç¶æããããšã¯ã§ããŸããã2çªç®ã®æ¡ä»¶ãæåŠããã€ã³ã¹ã¿ã³ãUBã§ãªããŠããå®å šã§ãªãããµãŒãããŒãã£ãæ段ãä»ããŠä»»æã®ç¡å¹ãªå¯èœæ§ã®ããããŒã¿ããŠããªã³ã«æžã蟌ãããšãã§ããŸãã ããããã°ããã®ãã€ãããã¯ãªäººã ãã¿ãŒã²ããã«ããä¿èšŒã¯ãããããŸãããããã¯çŽæ倱ã«ãªããšæããŸãã
@petrochenkov
ãã®ã³ãŒãã¯1ïŒãŠããªã³ã«å¯ŸããŠ2ïŒéãŠããªã³ã«å¯ŸããŠæ©èœããå¿ èŠããããŸããïŒ
let x: T; let y = x.field;
ç§ã«ãšã£ãŠãçãã¯ã©ã¡ãã®å Žåãæãããªãããããã§ããããã¯ã
T
ã®ãçµåãæ§ã«é¢ä¿ãªããRustãé²æ¢ã§ããé²æ¢ããããšã©ãŒã®ã¯ã©ã¹å šäœã ããã§ãã
åæããŸãããåæåãããŠããªãå€ããã§ãã¯ãããã®ã¬ãã«ã¯åŠ¥åœã§ãããéåžžã«å®è¡å¯èœã§ãã
ã€ãŸãã移åãã§ãã«ãŒã«ã¯ããã®ãµããŒããå®è£ ããããã®äœããã®ã¹ããŒã ãå¿ èŠã§ãã 移åãã§ãã«ãŒïŒããã³åçšãã§ãã«ãŒïŒãäžè¬ã«ãã£ãŒã«ãããšã«æ©èœããããšãèãããšãå ±çšäœã®æãåçŽãªã¹ããŒã ã¯ããæ§é äœãšåãã«ãŒã«+ãã£ãŒã«ãã®ïŒéïŒåæå/åçšããã®å åŒãã£ãŒã«ããïŒéïŒåæå/åçšãããã§ãã "ã
ãã®åçŽãªã«ãŒã«ã¯ããã¹ãŠã®éçãã§ãã¯ã察象ãšããŠããŸãã
æ§é äœã®ã«ãŒã«ãç解ããŠãããšä»®å®ããŠããããŸã§ã®ãšããåæããŸããã
次ã«ãåæåã¢ãã«ã¯ãäžèšã®éçãã§ãã¯+ãã1ã€ã®æ¡ä»¶ã®çµæã§ãã
1ïŒåæåãã§ãã¯ãæå¹ã§ã2ïŒå®å šã§ãªãã³ãŒãããŠããªã³ã«å±ããé åã«ä»»æã®ç¡å¹ãªãã€ããæžã蟌ãŸãªãå ŽåããŠããªã³ã®ããªãŒãããã£ãŒã«ãã®1ã€ãèªåçã«æå¹ã«ãªããŸãã ããã¯åçã«ãã§ãã¯ã§ããŸããïŒå°ãªããšããã£ãŒã«ãã1ãè¶ ããconst-evaluatorã®å€éšã«ãããŠããªã³ã®å ŽåïŒä¿èšŒã§ããããŸãã³ãŒããèªã人ã察象ãšããŠããŸãã
ãã®è¿œå æ¡ä»¶ã¯çµåã«ã¯ç¡å¹ã§ãã
ããšãã°ã @ joshtriplettããã®ãã®ã±ãŒã¹
ããšãã°ããã®ãŠãŒã¹ã±ãŒã¹ã®1ã€ã¯ãå°æ¥ããã«å€ãã®ã¿ã°ã䜿çšããŠæ瀺çã«æ¡åŒµå¯èœãªCã¹ã¿ã€ã«ã®ã¿ã°ä»ãå ±çšäœãæ€èšããããšã§ãã ãŠããªã³ãèãããããã¹ãŠã®ãã£ãŒã«ãã¿ã€ããç¥ã£ãŠãããšæ³å®ããŠã¯ãªããªãããšãèªã¿åãCããã³Rustã³ãŒãã
ãŠããªã³ã«ãå°æ¥ã®æ¡åŒµã®å¯èœæ§ãã®ããã®è¿œå ãã£ãŒã«ããæ瀺çã«ããå Žåãã³ãŒããèªã人ã ã«ãšã£ãŠã¯ããã«æ確ã«ãªããŸãã
ããã¯ãCãŠããªã³ãæ©èœããæ¹æ³ã§ããRustãŠããªã³ãæ©èœããããã«æå®ãããæ¹æ³ã§ããããŸããã ïŒãããŠããããããæ確ã«ãªãã®ãããããšãåã«ç°ãªãæåŸ ã«äžèŽããã®ãçåã«æããŸããïŒãããå€æŽãããšãRustå ±çšäœã¯ãèšèšããã³ææ¡ãããç®çã®äžéšã«é©åããªããªããŸãã
ãã¡ãããåºæ¬çãªéçåæåãã§ãã¯ãç¶æããããšã¯ã§ããŸããã2çªç®ã®æ¡ä»¶ãæåŠããã€ã³ã¹ã¿ã³ãUBã§ãªããŠããå®å šã§ãªãããµãŒãããŒãã£ãæ段ãä»ããŠä»»æã®ç¡å¹ãªå¯èœæ§ã®ããããŒã¿ããŠããªã³ã«æžã蟌ãããšãã§ããŸãã ããããã°ããã®ãã€ãããã¯ãªäººã ãã¿ãŒã²ããã«ããä¿èšŒã¯ãããããŸãããããã¯çŽæ倱ã«ãªããšæããŸãã
ãããã®ãå®å šã§ãªãããµãŒãããŒãã£ããšã¯ãã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 */ }
}
ããã¯ã人ã ãå ±çšäœã䜿çšããŠèšè¿°ã§ããããŸãã¯èšè¿°ã§ããå®å šã«æå¹ãªã³ãŒãã§ãã
@petrochenkov
ãã®ã³ãŒãã¯1ïŒãŠããªã³ã«å¯ŸããŠ2ïŒéãŠããªã³ã«å¯ŸããŠæ©èœããå¿ èŠããããŸããïŒ
ç§ã«ãšã£ãŠãçãã¯ã©ã¡ãã®å Žåãæãããªãããããã§ããããã¯ãTã®ãçµåãæ§ã«é¢ä¿ãªããRustãé²æ¢ã§ããé²æ¢ããããšã©ãŒã®ã¯ã©ã¹å šäœã ããã§ãã
ç§ã«ãšã£ãŠã¯å€§äžå€«ã§ãã
ãŠããªã³ã®æãåçŽãªã¹ããŒã ã¯ããæ§é äœãšåãã«ãŒã«+ãã£ãŒã«ãã®ïŒéïŒåæå/åçšããã®å åŒãã£ãŒã«ãã®ïŒéïŒåæå/åçšãã§ãã
ãããŒã æ§é äœã«ãŒã«ã¯ãç°ãªããã£ãŒã«ããäºãã«çŽ ã§ãããšããäºå®ã«ãã¹ãŠåºã¥ããŠãããããæå³
1ïŒåæåãã§ãã¯ãæå¹ã§ã2ïŒå®å šã§ãªãã³ãŒãããŠããªã³ã«å±ããé åã«ä»»æã®ç¡å¹ãªãã€ããæžã蟌ãŸãªãå ŽåããŠããªã³ã®ããªãŒãããã£ãŒã«ãã®1ã€ãèªåçã«æå¹ã«ãªããŸãã ããã¯åçã«ãã§ãã¯ã§ããŸããïŒå°ãªããšããã£ãŒã«ãã1ãè¶ ããconst-evaluatorã®å€éšã«ãããŠããªã³ã®å ŽåïŒä¿èšŒã§ããããŸãã³ãŒããèªã人ã察象ãšããŠããŸãã
åºæ¬çãªåŠ¥åœæ§ã®ä»®å®ãåçã«ãã§ãã¯å¯èœã§ããããšãéåžžã«æãŸãããšæããŸãïŒã¿ã€ãæ
å ±ãäžããããå ŽåïŒã 次ã«ãããªã§ã®CTFEäžã«ãããããã§ãã¯ã§ããŸãããŸããããã«ãããªå®è¡ïŒãã¹ãã¹ã€ãŒããªã©ïŒäžã«ããã§ãã¯ã§ããŸããæçµçã«ã¯ãããçš®ã®æ¶æ¯å€ããRustãdebug_assert!
æŸåºããã¢ãŒãã䜿çšã§ããŸããéèŠãªå Žæã§åŠ¥åœæ§ã®äžå€éããã§ãã¯ããŸãã
Cã®ãã§ãã¯ã§ããªãã«ãŒã«ã®çµéšã¯ãããããåé¡ã§ãããšããååãªèšŒæ ãäžããŠãããšæããŸãã éåžžãã«ãŒã«ãäœã§ããããå®éã«ç解ããŠæ確ã«ããããã®æåã®ã¹ãããã¯ãåçã«ãã§ãã¯å¯èœãªã«ãŒã«ãè¡šçŸããæ¹æ³ãèŠã€ããããšã§ãã 䞊è¡æ§ã¡ã¢ãªã¢ãã«ã®å Žåã§ãããåçã«ãã§ãã¯å¯èœãªãããªã¢ã³ãïŒä»®æ³ãã·ã³ã®æ®µéçãªå®è¡ã«é¢ããŠãã¹ãŠã説æããæäœçã»ãã³ãã£ã¯ã¹ïŒãçŸããŠãããå
¬çã®é·å¹Žã®æªè§£æ±ºã®åé¡ã解決ããå¯äžã®æ¹æ³ã®ããã§ãã以åã«äœ¿çšãããã¢ãã«ïŒãèã空æ°ã®åé¡ã®oufãã¯ããã§ã®ããŒã¯ãŒãã§ãïŒã
åçã«ãã§ãã¯å¯èœãªã«ãŒã«ãæã€ããšãããã«éèŠã§ããããèªåŒµããããšã¯ã§ããŸããã UBã®ãã§ãã¯ã§ããªãã±ãŒã¹ã0ã«ããããšãç®æãã¹ãã ãšæããŸãã ïŒç§ãã¡ã¯ãŸã ããã«ããŸãããããããç§ãã¡ãæã€ã¹ãç®æšã§ããïŒãããããªãã®èšèªã§UBã䜿çšããå¯äžã®è²¬ä»»ããæ¹æ³ã§ããä»ã®ãã¹ãŠã¯ã³ã³ãã€ã©/èšèªã®äœè
ã®å Žåã§ããããã¹ãŠã®äººãç ç²ã«ããŠåœŒãã®ç掻ã楜ã«ããŸããçµæãšäžç·ã«æ®ããå¿
èŠããããŸãã ïŒç§ã¯çŸåšããšã€ãªã¢ã·ã³ã°ãšçã®ãã€ã³ã¿ãŒã¢ã¯ã»ã¹ã®ããã«åçã«ãã§ãã¯å¯èœãªã«ãŒã«ã«åãçµãã§ããŸããïŒ
ãããå¯äžã®åé¡ã§ãããšããŠããç§ã«é¢ããéãããåçã«ãã§ãã¯ã§ããªããããšã¯ããã®ã¢ãããŒãã䜿çšããªãããã®ååãªçç±ã§ãã
ãšã¯ãããããããã§ãã¯ã§ããªãåºæ¬çãªçç±ã¯ããããŸããããŠããªã³å
ã®ãã¹ãŠã®ãã€ãã«ã€ããŠããã¹ãŠã®ããªã¢ã³ãã調ã¹ãŠããã®ããªã¢ã³ãã§ãã®ãã€ãã«èš±å¯ãããŠããå€ã確èªãããã¹ãŠã®ãŠããªã³ïŒheh;ïŒïŒãååŸããŸãããããã®ã»ããã®ã ãã®å®çŸ©ã«åŸã£ãŠãã¹ãŠã®ãã€ããæå¹ã§ããå Žåããã€ãã®ã·ãŒã±ã³ã¹ã¯ãŠããªã³ã«å¯ŸããŠæå¹ã§ãã
ãã ãããããå®éã«ãã§ãã¯ããã®ã¯éåžžã«å°é£ã§ããããã¯ãRustã§äœ¿çšããæãè€éãªåºæ¬çãªåã®åŠ¥åœæ§ã®äžå€æ¡ä»¶ã§ãã ããã¯ããã®æå¹æ§ã«ãŒã«ã説æããã®ãããé£ãããšããäºå®ã®çŽæ¥çãªçµæã§ãããã®ãããç§ã¯ããã奜ãã§ã¯ãããŸããã
ãã¡ãããåºæ¬çãªéçåæåãã§ãã¯ãç¶æããããšã¯ã§ããŸããã2çªç®ã®æ¡ä»¶ãæåŠããã€ã³ã¹ã¿ã³ãUBã§ãªããŠããå®å šã§ãªãããµãŒãããŒãã£ãæ段ãä»ããŠä»»æã®ç¡å¹ãªå¯èœæ§ã®ããããŒã¿ããŠããªã³ã«æžã蟌ãããšãã§ããŸãã ããããã°ããã®ãã€ãããã¯ãªäººã ãã¿ãŒã²ããã«ããä¿èšŒã¯ãããããŸãããããã¯çŽæ倱ã«ãªããšæããŸãã
ãã®ä¿èšŒã¯ç§ãã¡ãè²·ãã®ã§ããïŒ ããã¯å®éã«ã©ãã§åœ¹ç«ã¡ãŸããïŒ ä»ãç§ãèŠãŠããã®ã¯ã誰ããäžçæžåœåãããããå®ãããã«æ³šæããªããã°ãªããªããšããããšã ãã§ãã ç§ãã¡ã人ã ãããããåŸãããå©çã¯ããããŸããã
@joshtriplett
å°æ¥ãããå€ãã®ã¿ã°ã§æ瀺çã«æ¡åŒµå¯èœãªCã¹ã¿ã€ã«ã®ã¿ã°ä»ãå ±çšäœãæ€èšããŠãã ããã ãŠããªã³ãèãããããã¹ãŠã®ãã£ãŒã«ãã¿ã€ããç¥ã£ãŠãããšæ³å®ããŠã¯ãªããªãããšãèªã¿åãCããã³Rustã³ãŒãã
@petrochenkovã«ãã£ãŠææ¡ãããã¢ãã«ã¯ã __non_exhaustive: ()
ãã£ãŒã«ãããŠããªã³ã«è¿œå ããããšã«ããããããã®ãŠãŒã¹ã±ãŒã¹ãå¯èœã«ããŸãã ããããããã¯å¿
èŠã§ã¯ãªããšæããŸãã ããããããã€ã³ãã£ã³ã°ãžã§ãã¬ãŒã¿ã¯ãã®ãããªãã£ãŒã«ããè¿œå ããããšãã§ããŸãã
@RalfJung
ããã¯åçã«ãã§ãã¯ã§ããŸããïŒå°ãªããšããã£ãŒã«ãã1ãè¶ ããconst-evaluatorã®å€éšã«ãããŠããªã³ã®å ŽåïŒä¿èšŒ
åºæ¬çãªåŠ¥åœæ§ã®ä»®å®ãåçã«ãã§ãã¯å¯èœã§ããããšãéåžžã«æãŸãããšæããŸã
æ確åïŒãããã©ã«ãã/ããªãªãŒã¹ã¢ãŒããã§ã¯ãã§ãã¯ã§ããªãããšãæå³ããŸããããã¡ãããããã€ãã®è¿œå ã®ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ã䜿çšããŠãã¹ããŒã¢ãŒããã§ãã§ãã¯ã§ããããšããããŸãããããã«ã€ããŠã¯ç§ãããããæžããŠããŸãã
@RalfJung
@petrochenkovã«ãã£ãŠææ¡ãããã¢ãã«ã¯ããŠããªã³ã«__non_exhaustive :(ïŒãã£ãŒã«ããè¿œå ããããšã«ããããããã®ãŠãŒã¹
ã¯ãããããææ¡ã ãšç解ããŸããã
ããããããã¯å¿ èŠã§ã¯ãªããšæããŸãã ããããããã€ã³ãã£ã³ã°ãžã§ãã¬ãŒã¿ã¯ãã®ãããªãã£ãŒã«ããè¿œå ããããšãã§ããŸãã
å¯èœã§ããããã¹ãŠã®çµåã«äœç³»çã«è¿œå ããå¿ èŠããããŸãã
ãŠããªã³ã®äž»èŠãªãŠãŒã¹ã±ãŒã¹ãç Žã£ãŠãå«ããããšãã§ããããããã¿ãŒã³ã®å¶éã«äŸåããäžç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãæ¯æããããšãçã«ããªã£ãŠããçç±ã«ã€ããŠã¯ããŸã è°è«ããããŸããã
@joshtriplett
çµåã®äž»ãªãŠãŒã¹ã±ãŒã¹
ãããäž»ãªãŠãŒã¹ã±ãŒã¹ã§ããçç±ã¯ãç§ã«ã¯ãŸã£ããããããŸããã
ã¿ã°ä»ãå
±çšäœã®å
±çšäœã®ãã¹ãŠã®äœ¿çš/ FFIã®ãRustenumãšãã¥ã¬ãŒã·ã§ã³ããæ¡åŒµæ§ãåæãšããŠãããšä»®å®ãããšã repr(C)
å
±çšäœã«åœãŠã¯ãŸãå¯èœæ§ããããŸãïŒããã¯çå®ã§ã¯ãããŸããïŒããç§ãèŠããšããã repr(Rust)
å
±çšäœïŒããããå¶åŸ¡ãåæåå¶åŸ¡ããã©ã³ã¹ãã¥ãŒãïŒã¯ããäºæããªãããªã¢ã³ãããçªç¶åºçŸããããšãæåŸ
ããŠããŸããã
@petrochenkovç§ã¯ããäž»ãªãŠãŒã¹ã±ãŒã¹ãå£ãããšèšã£ãŠããªãã£ããç§ã¯ããäž»ãªãŠãŒã¹ã±ãŒã¹ãå£ãããšè¿°ã¹ãŸããã FFIã¯ãçµåã®äž»ãªãŠãŒã¹ã±ãŒã¹ã®1ã€ã§ãã
ãããŠãããããã¹ãŠã®ã»ããã®çµåïŒ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
ãå¿
èŠãªã®ã¯ãã°ã ãšæããŸãã
ãããã£ãŠããŠããªã³ã¯å°ãªããšããã€ãåäœã§ååŸããå¿
èŠããããŸãã
ãŸãããé
åçãªèªææ§ãã ãã§ã¯ååãªçç±ã§ã¯ãªããšæããŸãã ç§ãã¡ã決å®ããäžå€æ¡ä»¶ã¯ãå®å
šã§ãªãã³ãŒãäœæè
ã«ãšã£ãŠå€§ããªè² æ
ã§ãããã®çµæãå
·äœçãªå©ç¹ãåŸãããã¯ãã§ãã
@RalfJung
å®ã¯ãããå®å šã§ãªãããšããèŠæ±ããã®ã¯ãã°ã ãšæããŸãã
æ°ããMIRããŒã¹ã®å®å
šæ§ãã§ãã«ãŒã®å®è£
ã«ã€ããŠã¯ããããŸããããå€ãHIRããŒã¹ã®å®è£
ã§ã¯ã確ãã«ãã§ãã«ãŒã®å¶é/ç°¡ç¥åexpr1.field = expr2
圢åŒã®åŒã®ã¿ãå¯èœãªããã£ãŒã«ããã«ã€ããŠåæãããŸãããå²ãåœãŠãã®å®å
šæ§ã®ãªããã¢ãŠãããã®ä»ãã¹ãŠã¯ãçµåã«ãšã£ãŠå®å
šã§ã¯ãªãäžè¬çãªããã£ãŒã«ãã¢ã¯ã»ã¹ããšããŠä¿å®çã«æ±ãããŸããã
https://github.com/rust-lang/rust/issues/52786#issuecomment -408645420ã®ã³ã¡ã³ãã«çããïŒ
ã€ãŸããã³ã³ãã€ã©ã¯ãŸã Wrap<T>
ã®ã³ã³ãã©ã¯ãã«ã€ããŠäœãç¥ãããããšãã°ã¬ã€ã¢ãŠãã®æé©åãè¡ãããšãã§ããªããšããèãã§ãã ããããŸããããã®äœçœ®ã¯ç解ãããŠããŸãã
ããã¯ãå
éšçã«ã Wrap
ã®ã¢ãžã¥ãŒã«å
ã§ã Wrap<T>
ã¢ãžã¥ãŒã«ã®å®è£
ããããšãã°ããŠãŒã¶ãŒã«ãªãŒã¯ããªãå Žåãäžæçã«ãäºæããªãå€ããæžã蟌ãããšãã§ããããšãæå³ããŸããã³ã³ãã€ã©ã¯ãããã§å€§äžå€«ã§ãã
äºæããªãå€ããªãããšã«é¢ããWrap
ã®å¥çŽã®äžéšãããã£ãŒã«ãã®ãã©ã€ãã·ãŒã«ã©ã®çšåºŠæ£ç¢ºã«é¢é£ããŠãããã¯ããããŸããã
ãŸãããã£ãŒã«ãããã©ã€ããŒãããããªãã¯ãã«é¢ä¿ãªããäºæããªãå€ããããã®ãã£ãŒã«ãããçŽæ¥æžã蟌ãããšã¯ã§ããŸããã ãããè¡ãã«ã¯ãçã®ãã€ã³ã¿ãŒããŸãã¯FFIã®å察åŽã®ã³ãŒãã®ãããªãã®ãå¿ èŠã§ããããã¯ããŠããªã³å šäœãžã®ãã€ã³ã¿ãŒãæã€ã ãã§ããã£ãŒã«ãã¢ã¯ã»ã¹ãªãã§å®è¡ã§ããŸãã ãããã£ãŠãå¶éãããŠãããã£ãŒã«ããžã®ã¢ã¯ã»ã¹ä»¥å€ã®æ¹åããããã«ã¢ãããŒãããå¿ èŠããããŸãã
ç§ãããªãã®ã³ã¡ã³ãã解éãããšããã¢ãããŒãã¯ããã©ã€ããŒããã£ãŒã«ãïŒãŠããªã³ãŸãã¯æ§é äœã§ã¯é¢ä¿ãããŸããïŒã¯ãŠãŒã¶ãŒã«æªç¥ã®ä»»æã®äžå€æ¡ä»¶ãæå³ããã®ã§ããã®ãã£ãŒã«ããïŒçŽæ¥ãŸãã¯ã¯ã€ã«ããã€ã³ã¿ãä»ããŠïŒå€æŽããæäœã¯ãããŸããåé¡ïŒã¯ããã®äžç¹å®ã®äžå€æ¡ä»¶ãå£ãå¯èœæ§ããããããUBã«ãªããŸãã
ããã¯ããŠããªã³ã«1ã€ã®ãã©ã€ããŒããã£ãŒã«ããããå Žåããã®å®è£
è
ïŒã³ã³ãã€ã©ã§ã¯ãªãïŒã¯ããµãŒãããŒãã£ããã®ãŠããªã³ã«äºæããªãå€ãæžã蟌ãããšã¯ãªããšæ³å®ã§ããããšãæå³ããŸãã
ããã¯ãããæå³ã§ãŠãŒã¶ãŒã«ãšã£ãŠã®ãããã©ã«ãã®ãŠããªã³ããã¥ã¡ã³ãå¥ãã§ãã
-ïŒããã©ã«ãïŒãŠããªã³ã«ãã©ã€ããŒããã£ãŒã«ããããå Žåãã¬ããŒãžãæžã蟌ãããšã¯ã§ããŸããã
-ãã以å€ã®å Žåã¯ãããã¥ã¡ã³ãã§æ瀺çã«çŠæ¢ãããŠããªãéããã¬ããŒãžããŠããªã³ã«æžã蟌ãããšãã§ããŸãã
äžéšã®ãŠããªã³ããäºæããããã£ãŒã«ããžã®pub
ã¢ã¯ã»ã¹ãæäŸããªãããäºæããªãå€ãçŠæ¢ãããå ŽåïŒããšãã°ããããã®ãã£ãŒã«ãã«ç¬èªã®äžå€æ¡ä»¶ããªãå ŽåïŒãããã¥ã¡ã³ããä»ããŠãããè¡ãããšãã§ããŸãã 2çªç®ã®å¥ãå¿
èŠã§ãã
@RalfJung
ããã¯ããªãã®äœçœ®ãæ£ç¢ºã«èª¬æããŠããŸããïŒ
ãã®ãããªã·ããªãªã¯ã©ã®ããã«æ±ãããŸããïŒ
mod m {
union MyPrivateUnion { /* private fields */ }
extern {
fn my_private_ffi_function() -> MyPrivateUnion; // Can return garbage (?)
}
}
ç§ãããªãã®ã³ã¡ã³ãã解éãããšããã¢ãããŒãã¯ããã©ã€ããŒããã£ãŒã«ãïŒãŠããªã³ãŸãã¯æ§é äœã§ã¯é¢ä¿ãããŸããïŒã¯ãŠãŒã¶ãŒã«æªç¥ã®ä»»æã®äžå€æ¡ä»¶ãæå³ããã®ã§ããã®ãã£ãŒã«ããïŒçŽæ¥ãŸãã¯ã¯ã€ã«ããã€ã³ã¿ãä»ããŠïŒå€æŽããæäœã¯ãããŸããåé¡ïŒã¯ããã®äžç¹å®ã®äžå€æ¡ä»¶ãå£ãå¯èœæ§ããããããUBã«ãªããŸãã
ããããããã¯ç§ãæå³ããããšã§ã¯ãããŸããã
è€æ°ã®äžå€æ¡ä»¶ããããŸãã å¿ èŠãªæ°ã¯ããããŸããããå°ãªããšã2ã€ã¯å¿ èŠã§ãïŒãããŠããããã®ååã¯ããããŸããïŒã
&mut T
ã¯NULLã§ã¯ãªããæŽåãããŠããããã bool
ã¯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ã«ãªãããšã¯ãããŸãããããããèµ·ãããªãããšã«äŸåããå®å
šã§ãªãã³ãŒããæžãå¯èœæ§ããããããããã§ãæ£ãããªã/æ£ãããããŸããã
ããã2ã€ã®æŠå¿µãäžèŽãããã®ã¯è¯ãããšã§ãããå®çšçã§ã¯ãªããšæããŸãã ãŸããäžéšã®ã¿ã€ãïŒé¢æ°ãã€ã³ã¿ãŒãdynç¹æ§ïŒã§ã¯ãã«ã¹ã¿ã ã®ã»ãã³ãã£ãã¯äžå€æ¡ä»¶ã®å®çŸ©ã¯ãå®éã«ã¯èšèªã§ã®UBã®å®çŸ©ã
äºæããªãå€ããªãããšã«ã€ããŠWrapså¥çŽã®äžéšãã©ã®çšåºŠæ£ç¢ºã«ãã£ãŒã«ãã®ãã©ã€ãã·ãŒã«é¢é£ããŠãããã¯ããããŸãããã
åºæ¬çã«ãåããã®ã«ã¹ã¿ã äžå€æ¡ä»¶ãéžæãããšããå®å šãªã³ãŒããå®è¡ã§ãããã¹ãŠã®ãã®ãäžå€æ¡ä»¶ãä¿æããããšã確èªããå¿ èŠ
ããšãã°ãæ§é äœã®ãããªãã¯ãã£ãŒã«ãã¯ããã£ãŒã«ãã¿ã€ãã®ã«ã¹ã¿ã äžå€æ¡ä»¶ãšã¯ç°ãªãã«ã¹ã¿ã äžå€æ¡ä»¶ãæã€ããšã¯ã§ããŸãããçµå±ã®ãšãããå®å šãªãŠãŒã¶ãŒã¯ããã®ãã£ãŒã«ãã«ä»»æã®ããŒã¿ãæžã蟌ãã ãããã£ãŒã«ãããèªã¿åã£ãŠãè¯å¥œããæåŸ ãããã§ããŸããããŒã¿ã ãã¹ãŠã®ãã£ãŒã«ããå ¬éãããŠããæ§é äœã¯å®å šã«æ§ç¯ã§ãããã£ãŒã«ãã«ããã«å¶éã課ããŸãã
ãããªãã¯ãã£ãŒã«ããšã®çµå...ãŸããããã¯ããèå³æ·±ãã§ãã ãŠããªã³ãã£ãŒã«ãã®èªã¿åãã¯ãšã«ããå®å šã§ã¯ãªãã®ã§ãããã§ã¯äœãå€ãããŸããã ãŠããªã³ãã£ãŒã«ãã®èšè¿°ã¯å®å šã§ããããããããªãã¯ãã£ãŒã«ããæã€ãŠããªã³ã¯ããã£ãŒã«ãã«å ¥åããããã®ãã£ãŒã«ãã®åã®ã«ã¹ã¿ã äžå€æ¡ä»¶ãæºããä»»æã®ããŒã¿ãåŠçã§ããå¿ èŠããããŸãã ãããéåžžã«åœ¹ç«ã€ãšã¯æããŸãã...
ãããã£ãŠãèŠçŽãããšãã«ã¹ã¿ã äžå€æ¡ä»¶ãéžæãããšãã¯ãå€éšã®å®å šãªã³ãŒãããã®äžå€æ¡ä»¶ãå£ããªãããã«ããã®ã¯ããªãã®è²¬ä»»ã§ãïŒãããŠããããéæããã®ã«åœ¹ç«ã€ãã©ã€ããŒããã£ãŒã«ãã®ãããªããŒã«ããããŸãïŒã ãã®ã³ãŒããå®å šãªã³ãŒããã§ããªãããšããããšããããªãã®äžå€æ¡ä»¶ã«éåããªãããšã¯å€åœã®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
åæåããå¿
èŠããããã©ããããã€åæåããå¿
èŠãããããããã³äžèšã®2çš®é¡ã®äžå€æ¡ä»¶ã«ã€ããŠã®ããã°æçš¿ãæžããŸããã
https://github.com/rust-lang/rust/issues/55149ã§ãŸã ã«ããŒãããŠããªããããã§è¿œè·¡ãããã®ãæ®ã£ãŠã
E0658ã¯ãŸã ãããæããŠããŸãïŒ
ãšã©ãŒ[E0658]ïŒ
Copy
ãã£ãŒã«ããæã€ãŠããªã³ã¯äžå®å®ã§ãïŒåé¡ïŒ32836ãåç §ïŒ
圌ãã¯Copy
å®è£
ããŠããªãã®ã§ãããã¯çŸåšã¢ãããã¯ã§ã²ã©ãéãã§ããŸãã 誰ããåé¿çãç¥ã£ãŠããŸããïŒ
https://github.com/rust-lang/rust/issues/55149ãå®è£
ãããŠããå ŽåããŠããªã³ã§ManuallyDrop<AtomicFoo>
ã䜿çšã§ããããã«ãªããŸãã ãããŸã§ã¯ãåé¿çã¯Nightlyã䜿çšããããšã§ãïŒãŸãã¯union
ã䜿çšããã«å¥ã®æ¹æ³ãèŠã€ããŠãã ããïŒã
ãããå®è£
ããã°ã ManuallyDrop
ãå¿
èŠãããŸããã çµå±ã®ãšãããrustcã¯Atomic*
ãDrop
å®è£
ããŠããªãããšãç¥ã£ãŠããŸãã
远跡ã®åé¡ãæ°ããåé¡ã«åãæ¿ããããã«èªåãå²ãåœãŠãŸãã
æãåèã«ãªãã³ã¡ã³ã
@nrc
ãŸãããµãã»ããã¯ããªãæçœã§ã-ãFFIãŠããªã³ãããCãŠããªã³ãããŸãã¯ãC ++ 11以åã®ãŠããªã³ã-æ§æçã§ãªããŠãã ç§ã®æåã®ç®æšã¯ããã®ãµãã»ãããã§ããã ãæ©ãïŒçæ³çã«ã¯ãã®ãµã€ã¯ã«ã§ïŒå®å®ãããŠã
winapi
ãããªã©ã€ãã©ãªã§äœ¿çšã§ããããã«ããããšæ®ãã®ãµãã»ãããšãã®å®è£ ã«ã€ããŠç¹ã«çãããããšã¯äœããããŸãããç·æ¥ã§ã¯ãªãããUnions1.2ãRFCã®ããã»ã¹ãå®äºãããŸã§äžæ確ãªæéãåŸ ã€å¿ èŠããããŸãã ç§ã®æåŸ ã¯ãæåã®ãµãã»ããã®å®å®ååŸã1ã2ããŸãã¯3ãµã€ã¯ã«ã§æ®ãã®éšåãå®å®åããããšã§ãã