次ã®ã¹ããããã¯ãçŸåšã®å®å®çãããŒã¿çãããã³å€éã«ãªãªãŒã¹ã¢ãŒãã§ã³ã³ãã€ã«ãããšã¯ã©ãã·ã¥ããŸãã
enum Null {}
fn foo() -> Null { loop { } }
fn create_null() -> Null {
let n = foo();
let mut i = 0;
while i < 100 { i += 1; }
return n;
}
fn use_null(n: Null) -> ! {
match n { }
}
fn main() {
use_null(create_null());
}
https://play.rust-lang.org/?gist=1f99432e4f2dccdf7d7e&version=stable
ããã¯ãç§ãæ°ä»ããã«ãŒããåé€ããLLVMã®æ¬¡ã®äŸã«åºã¥ããŠããŸãïŒ https ïŒ
äœãèµ·ãã£ãŠããããã«èŠããããšãããšãCã§ã¯LLVMãå¯äœçšã®ãªãç¡éã«ãŒããåé€ã§ãããããæçµçã«ã¯æŠè£
ããªããã°ãªããªãmatch
ãå®è¡ããããšã«ãªããŸãã
æé©åãããã³ãŒãã®LLVMIRã¯
; Function Attrs: noreturn nounwind readnone uwtable
define internal void @_ZN4main20h5ec738167109b800UaaE() unnamed_addr #0 {
entry-block:
unreachable
}
ãã®çš®ã®æé©åã¯ãéåžžã¯ç¡äººã®ã¿ã€ãã«åœãŠã¯ãŸãã¯ãã®äž»ãªä»®å®ãç ŽããŸãããã®ã¿ã€ãã®å€ãæã€ããšã¯äžå¯èœã§ããã¯ãã§ãã
rust-lang / rfcsïŒ1216ã¯ãRustã§ãã®ãããªã¿ã€ããæ瀺çã«åŠçããããšãææ¡ããŠããŸãã LLVMãããããåŠçããå¿
èŠããªãããšãä¿èšŒããå¿
èŠã«å¿ããŠçºæ£ã確å®ã«ããããã«é©åãªã³ãŒããæ¿å
¥ããã®ã«å¹æçãããããŸããïŒIIUICããã¯é©åãªå±æ§ãŸãã¯åºæã®åŒã³åºãã§éæã§ããŸãïŒã
ãã®ãããã¯ã¯ãæè¿LLVMã¡ãŒãªã³ã°ãªã¹ãã§ãè°è«ãããŠããŸãïŒ http ïŒ
ããªã¢ãŒãžïŒI-ããããŒã
æªãããã§ãïŒ LLVMã«ãã¯ãããã®ã«ãŒãã¯æ¬åœã«ç¡éã§ãããšèšãæ¹æ³ããªãå Žåã§ããäžæµã®è°è«ã解決ããã®ãåŸ ã€å¿ èŠããããããããŸããã
ç¡éã«ãŒããæé©åãããªãããã«ããæ¹æ³ã¯ãã«ãŒãå
ã«unsafe {asm!("" :::: "volatile")}
ãè¿œå ããããšã§ãã ããã¯ãLLVMã¡ãŒãªã³ã°ãªã¹ãã§ææ¡ãããŠããllvm.noop.sideeffect
çµã¿èŸŒã¿é¢æ°ã«äŒŒãŠããŸãããäžéšã®æé©åã劚ããããå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ã®äœäžãåé¿ããçºæ£ããé¢æ°/ã«ãŒããæé©åãããªãããšãä¿èšŒããããã«ãç¡äººã®å€ãå«ãŸããŠããå Žåã¯ãæé©åã§ããªã空ã®ã«ãŒãïŒã€ãŸãã loop { unsafe { asm!("" :::: "volatile") } }
ïŒãæ¿å
¥ããã ãã§ååã ãšæããŸããç¯å²ã
LLVMãã³ãŒããæé©åããŠããã以äžåå²ããªãããã«ããå¿
èŠãããå Žåããã®ãããªã«ãŒãã«ãããå¶åŸ¡ãããŒãç¶è¡ã§ããªããªããŸãã
LLVMãçºæ£ã³ãŒããæé©åã§ããªãã幞éãªãå Žåããã®ãããªã«ãŒãã¯DCEã«ãã£ãŠåé€ãããŸãã
ããã¯ïŒ18785ã«é¢é£ããŠããŸããïŒ ããã¯UBã§ãããšããç¡éååž°ã«ã€ããŠã§ãããæ ¹æ¬çãªåå ã¯äŒŒãŠããããã«æãããŸããLLVMã¯åæ¢ããªãããšãå¯äœçšãšã¯èŠãªããªããããé¢æ°ã«åæ¢ããªã以å€ã®å¯äœçšããªãå Žåã¯ãæé©åã§ããŸãããããé¢ããŠã
@geofft
åãåé¡ã§ãã
ã¯ããåãããã«èŠããŸãã ãã®åé¡ã®ããã«äžã«ã圌ãã¯undef
ãååŸããæ¹æ³ã瀺ããŠããŸãããããããïŒäžèŠå®å
šãªïŒããã°ã©ã ãã¯ã©ãã·ã¥ãããã®ã¯é£ãããªããšæããŸãã
ïŒ+1ïŒ
ã¯ã©ãã·ã¥ããŸãã¯ããããããã«æªãããŒãããªãŒãhttps://play.rust-lang.org/?gist=15a325a795244192bdce&version=stable
ã ããç§ã¯èª°ãããããå ±åãããŸã§ã©ããããã®æéçåã«æã£ãŠããŸããã :)ç§ã®æèŠã§ã¯ãæåã®è§£æ±ºçã¯ãã¡ãããLLVMã«æœåšçã«ç¡éã«ãŒãã«ã€ããŠããã»ã©ç©æ¥µçã§ã¯ãªãããã«æ瀺ã§ãããã©ããã§ãã ããã§ãªããã°ãç§ãã¡ã«ã§ãããšæãå¯äžã®ããšã¯ãRustèªäœã§ä¿å®çãªåæãè¡ã£ãŠæ¬¡ã®ããšãå€æããããšã§ãã
æªå®çŸ©ã®åäœãåé¿ããã«ã¯ãã©ã¡ãã§ãååã§ãã
ããªã¢ãŒãžïŒP-medium
ç§ãã¡ã®åŽã«å€ãã®åªåãè²»ããåã«ãLLVMãäœãããããèŠããã®ã§ããããããå®éã«åé¡ãåŒãèµ·ããå¯èœæ§ã¯æ¯èŒçäœãããã§ãïŒã³ã³ãã€ã©ãŒã®éçºäžã«ãå人çã«ããã«ã¶ã€ãããŸãããïŒã æ°ã«ãªãåŸæ¹äºææ§ã®åé¡ã¯ãããŸããã
LLVMã¡ãŒãªã³ã°ãªã¹ãã®è°è«ããã®åŒçšïŒ
The implementation may assume that any thread will eventually do one of the following:
- terminate
- make a call to a library I/O function
- access or modify a volatile object, or
- perform a synchronization operation or an atomic operation
[Note: This is intended to allow compiler transformations such as removal of empty loops, even
when termination cannot be proven. â end note ]
@dotdashåŒçšããŠããæç²ã¯ãC ++ä»æ§ããã®ãã®ã§ãã ããã¯åºæ¬çã«ã[å¯äœçšããã]ãCã§ã©ã®ããã«å®çŸ©ãããŠããããã«å¯Ÿããçãã§ãïŒæšæºå§å¡äŒã§ã確èªãããŠããŸãïŒhttpïŒ//www.open-std.org/jtc1/sc22/wg14/www/docs/n1528 .htmïŒã
LLVM IRã®äºæ³ãããåäœã«ã€ããŠã¯ãããã€ãã®æ··ä¹±ããããŸãã https://llvm.org/bugs/show_bug.cgi?id=24078ã¯ãLLVMIRã®ç¡éã«ãŒãã®ã»ãã³ãã£ã¯ã¹ã®æ£ç¢ºã§æ瀺çãªä»æ§ããªãããã«èŠããããšã瀺ããŠããŸãã ããã¯ãããããæŽå²çãªçç±ãšå©äŸ¿æ§ã®ããã«ãC ++ã®ã»ãã³ãã£ã¯ã¹ãšäžèŽããŠããŸãïŒç§ã¯https://groups.google.com/forum/#!topic/llvm-dev/j2vlIECKkdEã远跡ããããšããã§ããŸããã§ããããããã¯æããã«æéãåç §ããŠããŸãç¡éã«ãŒããæé©åãããŠããªãå ŽåãC / C ++ä»æ§ãæŽæ°ãããŠãããå¯èœã«ãªããŸã§ãã°ããåïŒã
ã¹ã¬ãããããC ++ã³ãŒããå¯èœãªéãå¹æçã«æé©åããïŒã€ãŸããç¡éã«ãŒããåé€ããæ©äŒãèæ ®ã«å ¥ããïŒããšãæãŸããããšã¯æããã§ãããåãã¹ã¬ããã§ãè€æ°ã®éçºè ïŒLLVMã«ç©æ¥µçã«è²¢ç®ããéçºè ãå«ãïŒãä»ã®èšèªã§å¿ èŠãšãããç¡éã«ãŒããä¿æããæ©èœã«é¢å¿ã瀺ããŸããã
@ ranma42ç§ã¯ãããç¥ã£ãŠããŸããåèã®ããã«åŒçšããŸããããããåé¿ãã1ã€ã®å¯èœæ§ã¯ãéã³ãã«ãŒããæ€åºããäžèšã®1ã€ãè¿œå ããŠãLLVMããã®æé©åãå®è¡ããªãããã«ããããšã§ãã
ããã¯å¥å šæ§ã®åé¡ã§ããïŒ ãããããªãããã®ããã«ã¿ã°ä»ãããå¿ èŠããããŸãã
ã¯ãã @ ranma42ã®äŸã«åŸã£ãŠããã®æ¹æ³ã¯ãé åå¢çãã§ãã¯ãç°¡åã«éã³å Žãªã³ã¯
@bluss
ããªã·ãŒã¯ãå¥å
šæ§ã®åé¡ã§ãããééã£ãã³ãŒãã®åé¡ïŒã€ãŸããããã®ã»ãšãã©ïŒã«I-wrong
ã¿ã°ãä»ããå¿
èŠããããšãããã®ã§ãã
ãããã£ãŠãåã®è°è«ãèŠçŽãããšãããã§ç§ãèŠãããšãã§ããå®éã«ã¯2ã€ã®éžæè¢ããããŸãã
åŸè ã¯æé©åãé»å®³ããå¯èœæ§ããããããããæªãã®ã§ãããæ§ããã«å®è¡ããããšæããŸããåºæ¬çã«ãèªåã§çµäºã蚌æã§ããªãå Žåã¯ã©ãã§ãã LLVMã®æé©åæ¹æ³ã«ããå°ãçµã³ä»ããããšãã§ããŸããã€ãŸããLLVMãç¡éã«ãŒã/ååž°ãšèŠãªãã·ããªãªãæ€åºã§ããå Žåã«ã®ã¿å°å ¥ããŸãããïŒaïŒLLVMã®è¿œè·¡ãå¿ èŠã§ãããïŒb ïŒå°ãªããšãç§ãæã£ãŠãããããæ·±ãç¥èãå¿ èŠã§ãã
LLVMã解決çãæäŸããã®ãåŸ ã¡ãŸãã
ãã®åé¡ã远跡ããLLVMãã°ãšã¯äœã§ããïŒ
è£è¶³ïŒ while true {}
ã¯ãã®åäœã瀺ããŸãã ãã¶ããlintã¯ããã©ã«ãã§ãšã©ãŒã«ã¢ããã°ã¬ãŒãããããããçŸåšæªå®çŸ©ã®åäœã瀺ãå¯èœæ§ãããããšã瀺ãã¡ã¢ãååŸããå¿
èŠããããŸããïŒ
ãŸããããã¯Cã§ã¯ç¡å¹ã§ããããšã«æ³šæããŠãã ããããã®åŒæ°ãäœæããLLVMã¯ãclangã«ãã°ãããããšãæå³ããŸãã
void foo() { while (1) { } }
void create_null() {
foo();
int i = 0;
while (i < 100) { i += 1; }
}
__attribute__((noreturn))
void use_null() {
__builtin_unreachable();
}
int main() {
create_null();
use_null();
}
ããã¯æé©åã§ã¯ã©ãã·ã¥ããŸãã ããã¯ãC11æšæºã§ã¯ç¡å¹ãªåäœã§ãã
An iteration statement whose controlling expression is not a constant
expression, [note 156] that performs no input/output operations,
does not access volatile objects, and performs no synchronization or
atomic operations in its body, controlling expression, or (in the case of
a for statement) its expression-3, may be assumed by the
implementation to terminate. [note 157]
156: An omitted controlling expression is replaced by a nonzero constant,
which is a constant expression.
157: This is intended to allow compiler transformations such as
removal of empty loops even when termination cannot be proven.
ãå¶åŸ¡åŒãå®æ°åŒã§ã¯ãªãã- while (1) { }
ã 1
ã¯å®æ°åŒã§ãããããåé€ã§ããªãããšã«æ³šæããŠãã ããã
ã«ãŒãã®åé€ã¯ãç°¡åã«åé€ã§ããæé©åãã¹ã§ããïŒ
@ubsan
LLVMã®bugzillaã§ãã®ãã°ã¬ããŒããèŠã€ããŸãããããããšãåããŸãããïŒ C ++ã§ã¯ã決ããŠçµäºã§ããªãç¡éã«ãŒãã¯æªå®çŸ©ã®åäœã§ããããã«èŠããŸãããCã§ã¯å®çŸ©ãããåäœã§ãïŒå®å šã«åé€ã§ããå Žåãšã§ããªãå ŽåããããŸãïŒã
@gnzlbgçŸåšãã°ãå ±åããŠããŸãã
ïŒ42009ããç¹°ãè¿ããŸãããã®ãã°ã«ãããç¶æ³ã«ãã£ãŠã¯ããã·ã³åœä»€ããŸã£ããå«ãŸãªãå€éšããåŒã³åºãå¯èœãªé¢æ°ãåºåãããå¯èœæ§ããããŸãã ããã¯æ±ºããŠèµ·ãããªãã¯ãã§ãã LLVMãpub fn
ãæ£ããã³ãŒãã§åŒã³åºãããšã¯ã§ããªããšæšæž¬ããå Žåããã®é¢æ°ã®æ¬äœãšããŠå°ãªããšããã©ããåœä»€ãçºè¡ããå¿
èŠããããŸãã
ãã®ããã®LLVMãã°ã¯https://bugs.llvm.org/show_bug.cgi?id=965ïŒ2006幎ã«ãªãŒãã³ïŒã§ãã
@zackw LLVMã«ã¯ãã®ããã®ãã©ã°ããããŸãïŒ TrapUnreachable
ã ç§ã¯ããããã¹ãããŠããŸãããã Options.TrapUnreachable = true;
ãLLVMRustCreateTargetMachine
è¿œå ããããšã§ãããªãã®æžå¿µã«å¯ŸåŠã§ããã¯ãã§ãã ç§ã¯äœã枬å®ããŠããŸããããããã¯ããã©ã«ãã§å®è¡ã§ããã»ã©ååã«äœãã³ã¹ãã§ããå¯èœæ§ããããŸãã
@ oli-obkæ®å¿µãªãããããã¯åãªãã«ãŒãåé€ãã¹ã§ã¯ãããŸããã ãã®åé¡ã¯ãããšãã°ãïŒaïŒãã©ã³ãã«å¯äœçšããªããïŒbïŒå¯äœçšã®ããåœä»€ãå«ãŸãªãé¢æ°ã«å¯äœçšããªããïŒcïŒå¯äœçšã®ãªãé¢æ°ã®åŒã³åºãã移åã§ããããŸãã¯åé€ãããŸããã
ããããããããã§ãïŒ https ïŒ
@ sunfishcode ã httpsïŒ //reviews.llvm.org/D38336ã®LLVMãããã10æ3æ¥ã«ãæ¿èªããããããã§ãããLLVMã®ãªãªãŒã¹ããã»ã¹ã«é¢ããŠãããäœãæå³ããã®ãã«ã€ããŠã®ææ°æ å ±ãæããŠãã ããã åãå ¥ããè¶ ãã次ã®ã¹ãããã¯äœã§ããïŒãŸããå°æ¥ã®LLVMãªãªãŒã¹ã«ãã®ããããå«ãŸãããã©ããã«ã€ããŠã®èãã¯ãããŸããïŒ
llvmdevã¹ã¬ãããããããšãææ¡ãããªãã©ã€ã³ã®äººãšè©±ãããŸããã ã¹ã¬ããã¯ããã«ãããŸãïŒ
http://lists.llvm.org/pipermail/llvm-dev/2017-October/118558.html
ããã§çµè«ãåºãŸããããã®çµæãè¿œå ã®å€æŽãå ããå¿ èŠããããŸãã å°ãæéãããããŸãããå€æŽã¯è¯ããšæããŸãã
ã¢ããããŒãããŠãããŠããããšãããããŠããªãã®åªåã«æè¬ããŸãïŒ
https://reviews.llvm.org/rL317729ãLLVMã«å°éããããšã«æ³šæããŠ
@zackwã³ãŒããå«ãŸãªãé¢æ°ã®åé¡ãä¿®æ£ããããã«ïŒ45920ãäœæããŸããã
@bstrieã¯ããæåã®ã¹ãããã
ç§ã¯ä»ãããåçŸã§ããŸããã§ããïŒ https ïŒ//play.rust-lang.org/ïŒgist = 529bd5ab326f7b627e559f64d514312f
@jsgfãŸã åçŸã ãªãªãŒã¹ã¢ãŒããéžæããŸãããïŒ
@kennytmãããŒãæ°ã«ããªãã§ã
https://reviews.llvm.org/rL317729ãLLVMã«å°éããããšã«æ³šæããŠ
ãã®ã³ã¡ã³ãããæ°ã¶æãçµã¡ãŸããã ãã©ããŒã¢ããããããçºçããã®ãããããšãä»åŸãçºçããã®ãã誰ãç¥ã£ãŠããŸããïŒ
ãããã¯ã䜿çšããŠããLLVMããŒãžã§ã³ã«llvm.sideeffect
çµã¿èŸŒã¿é¢æ°ãååšããããã§ããRustç¡éã«ãŒããå¯äœçšåºæå€ãå«ãLLVMã«ãŒãã«å€æããããšã§ããããèªåã§ä¿®æ£ã§ããŸããïŒ
https://github.com/rust-lang/rust/issues/38136ãšhttps://github.com/rust-lang/rust/issues/54214ã«èŠãããããã«ãããã¯æ¬¡ã®panic_implementation
ç¹ã«æªãã§ãloop {}
ã«ãªããŸããããã«ããã unsafe
ã³ãŒããªãã§panic!
UBããã¹ãŠåºçŸããŸãã ããã¯âŠããããèµ·ããããææªã®äºæ
ã§ãã
å¥ã®èŠ³ç¹ãããã®åé¡ã«ééããã°ããã§ãã 次ã«äŸã瀺ããŸãã
pub struct Container<'f> {
string: &'f str,
num: usize,
}
impl<'f> From<&'f str> for Container<'f> {
#[inline(always)]
fn from(string: &'f str) -> Container<'f> {
Container::from(string)
}
}
fn main() {
let x = Container::from("hello");
println!("{} {}", x.string, x.num);
let y = Container::from("hi");
println!("{} {}", y.string, y.num);
let z = Container::from("hello");
println!("{} {}", z.string, z.num);
}
ãã®äŸã¯ãstableãbetaãnightlyã§ç¢ºå®ã«ã»ã°ã¡ã³ããŒã·ã§ã³éåãèµ·ãããä»»æã®ã¿ã€ãã®åæåãããŠããªãå€ãäœæããã®ãããã«ç°¡åãã瀺ããŠããŸãã ããã¯éã³å Žã«ãããŸãã
@SergioBenitezãã®ããã°ã©ã ã¯æå°éã®äœæ¥äŸã
ãªãªãŒã¹ãã«ãã§ã¯ãLLVMã¯ç¡éååž°ããªããšæ³å®ãããããæé©åããŸãïŒ mwe ïŒã ããã¯ã«ãŒãAFAICTãšã¯é¢ä¿ãããŸãããã httpsïŒ //stackoverflow.com/a/5905171/1422197ãšã¯é¢ä¿ãããŸãã
@gnzlbgç³ãèš³ãããŸããããããªãã¯æ£ãããããŸããã
ããã°ã©ã ã¯ãªãªãŒã¹ã¢ãŒãã§ã»ã°ã¡ã³ããŒã·ã§ã³éåãèµ·ãããŸãã ãããå šäœã®ãã€ã³ãã§ãã æé©åã«ãã£ãŠäžå¥å šãªåäœãçºçããããšïŒLLVMãšRustã®ã»ãã³ãã£ã¯ã¹ãããã§äžèŽããªãããšïŒãåæåãããŠããªãã¡ã¢ãªã®äœ¿çšãä»»æã®ã¡ã¢ãªã®æ€æ»ãããã³åéã§ã®ä»»æã®ãã£ã¹ããå¯èœã«ããrustcã䜿çšããŠå®å šãªRustããã°ã©ã ãèšè¿°ããã³ã³ã³ãã€ã«ã§ããŸããèšèªã®ã»ãã³ãã£ã¯ã¹ã ããã¯ããã®ã¹ã¬ããã§èª¬æãããŠããã®ãšåããã€ã³ãã§ãã å ã®ããã°ã©ã ããããã°ã¢ãŒãã§ã»ã°ã¡ã³ããŒã·ã§ã³éåãèµ·ãããªãããšã«æ³šæããŠãã ããã
ãŸããããã§ãç°ãªããéã«ãŒãæé©åãè¡ãããŠããããšãææ¡ããŠããããã§ãã ãããäºå®ã§ããå Žåããããå¥ã®åé¡ãæ£åœåãããããããªããšããŠããããã¯å€§éšåã¯ç¡é¢ä¿ã§ãããããããã«ãããŸããã ç§ã®æšæž¬ã§ã¯ãLLVMã¯æ«å°Ÿååž°ã«æ°ã¥ãããããç¡éã«ãŒããšããŠæ±ãããããæé©åããŠããŸãã«ãã®åé¡ãäœã§ãããã瀺ããŠããŸãã
@gnzlbgããŠãç¡éååž°ïŒããïŒããæé©åã®mweãå°ãå€æŽãããšãåæåãããŠããªãå€NonZeroUsize
ãçæãããŸãïŒããã¯âŠ0ã§ãããããç¡å¹ãªå€ã«ãªããŸãïŒã
ãããŠãããã¯@SergioBenitezã圌ãã®äŸã§è¡ã£ãããšã§ããããã€ã³ã¿ãŒã䜿çšããŠããããšãé€ããŠãã»ã°ã¡ã³ããŒã·ã§ã³éåãçæããŸãã
@SergioBenitezããã°ã©ã ã®ãããã°ãšãªãªãŒã¹ã®äž¡æ¹ã§ã¹ã¿ãã¯ãªãŒããŒãããŒãçºçããããšã«åæããŸããïŒ
ãããããªãã @ SergioBenitezã®äŸã§loop
èŠã€ããããšãã§ããªãã®ã§ããã®åé¡ãã©ã®ããã«é©çšããããããããŸããïŒãã®åé¡ã¯çµå±ç¡éã®loop
ã§ãïŒã ç§ãééã£ãŠããå Žåã¯ãäŸã®loop
ãæããŠãã ããã
åè¿°ã®ããã«ãLLVMã¯ç¡éååž°ãçºçããªãããšãåæãšããŠããŸãïŒãã¹ãŠã®ã¹ã¬ãããæçµçã«çµäºããããšãåæãšããŠããŸãïŒããããã¯ãããšã¯ç°ãªãåé¡ã«ãªããŸãã
LLVMãè¡ãæé©åããã©ã¡ãã®ããã°ã©ã ã«å¯ŸããŠãçæãããã³ãŒãã¯èª¿ã¹ãŠããŸããããã»ã°ã¡ã³ããŒã·ã§ã³éåããã¹ãŠçºçããå Žåã¯ãã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããªãããšã«æ³šæããŠãã ããã ç¹ã«ãïŒã¹ã¿ãã¯ãããŒãã³ã°+ã¹ã¿ãã¯çµäºåŸã®ããããããŠããªãã¬ãŒãããŒãžã«ãã£ãŠïŒãã£ãããããã¡ã¢ãªå®å šæ§ã®åé¡ãåŒãèµ·ãããªãã¹ã¿ãã¯ãªãŒããŒãããŒããã»ã°ã¡ã³ããŒã·ã§ã³éåãšããŠè¡šç€ºãããŸãã ãã¡ãããã»ã°ã¡ã³ããŒã·ã§ã³éåã¯ãã¡ã¢ãªã®ç Žæãã¯ã€ã«ããªæžã蟌ã¿/èªã¿åãããŸãã¯ãã®ä»ã®å¥å šæ§ã®åé¡ã瀺ããŠãã
@rkruppeã©ã³ãã ãªã¡ã¢ãªäœçœ®ãžã®åç §ã®äœæãèš±å¯ããããã®åŸåç §ãèªã¿åããããããããã°ã©ã ãã»ã°ã¡ã³ããŒã·ã§ã³éåã«ãªããŸããã ããã°ã©ã ã¯ã代ããã«ã©ã³ãã ãªã¡ã¢ãªäœçœ®ãæžã蟌ãããã«ç°¡åã«å€æŽã§ããããã»ã©å°é£ãªãã_ç¹å®ã®_ã¡ã¢ãªäœçœ®ãèªã¿åã/æžã蟌ã¿ããŸãã
@gnzlbgããã°ã©ã ã¯ããªãªãŒã¹ã¢ãŒãã§ã¹ã¿ãã¯ãªãŒããŒãããŒã_ããŸãã_ã ãªãªãŒã¹ã¢ãŒãã§ã¯ãããã°ã©ã ã¯é¢æ°åŒã³åºããè¡ããŸããã ã¹ã¿ãã¯ã¯ãçŽç²ã«ããŒã«ã«ãå²ãåœãŠãããã«ãæéåæ°ã«ããã·ã¥ãããŸãã
ããã°ã©ã ã¯ããªãªãŒã¹ã¢ãŒãã§ãªãŒããŒãããŒãã¹ã¿ãã¯ããŸããã
ããïŒ éèŠãªã®ã¯ãåºæ¬çã«fn foo() { foo() }
ã§ãããµã³ãã«ããã°ã©ã ã«ã¯ç¡éååž°ããããLLVMã§ã¯èš±å¯ãããŠããªãããšã ãã§ãã
éèŠãªã®ã¯ãåºæ¬çã«fn fooïŒïŒ{fooïŒïŒ}ã§ãããµã³ãã«ããã°ã©ã ã«ã¯ãLLVMã§ã¯èš±å¯ãããŠããªãç¡éååž°ããããšããããšã ãã§ãã
ãããäœãã解決ããããã«ããªãããããèšã£ãŠããçç±ã¯ããããŸããã LLVMã¯ãç¡éååž°ãèæ ®ããUBãã«ãŒãããããã«å¿ããŠæé©åããŸãããRustã§å®å šã§ããããšãããã®åé¡å šäœã®èŠç¹ã§ãã
https://reviews.llvm.org/rL317729ã®äœæè ã¯ããã«ããããã©ããŒã¢ãããããããŸã å®è£ ããŠããªãããšã確èªããŠããŸãã
ä»æ¥@llvm.sideeffect
åŒã³åºããæ¿å
¥ããŠãã«ãŒããæé©åãããªãããã«ããããšãã§ããŸãã ããã¯ããã€ãã®æé©åãç¡å¹ã«ãããããããŸããããäž»èŠãªæé©åã¯ãããç解ããæ¹æ³ãæããããŠããã®ã§ãçè«çã«ã¯ããã»ã©å€ãã¯ãããŸããã @llvm.sideeffect
åŒã³åºãããã¹ãŠã®ã«ãŒããŸãã¯ã«ãŒãã«å€ããå¯èœæ§ã®ãããã®ïŒååž°ãå·»ãæ»ããã€ã³ã©ã€ã³asmãªã©ïŒã«å
¥ãããšãçè«çã«ã¯ããã§åé¡ã解決ããã®ã«ååã§ãã
æããã«ã2çªç®ã®ããããé 眮ããŠãããšããã®ã§ããããè¡ãå¿ èŠã¯ãããŸããã ãã€å®è£ ã«æ»ããããããŸããã
è¥å¹²ã®éãã¯ãããŸãããçŽ æãã©ããã¯ããããŸããã
#[allow(unconditional_recursion)]
#[inline(never)]
pub fn via_recursion<T>() -> T {
via_recursion()
}
fn main() {
let a: String = via_recursion();
}
define internal void @_ZN10playground4main17h1daf53946e45b822E() unnamed_addr #2 personality i32 (i32, i32, i64, %"unwind::libunwind::_Unwind_Exception"*, %"unwind::libunwind::_Unwind_Context"*)* <strong i="9">@rust_eh_personality</strong> {
_ZN4core3ptr13drop_in_place17h95538e539a6968d0E.exit:
ret void
}
#[inline(never)]
pub fn via_loop<T>() -> T {
loop {}
}
fn main() {
let b: String = via_loop();
}
define internal void @_ZN10playground4main17h1daf53946e45b822E() unnamed_addr #2 {
start:
unreachable
}
Rust 1.29.1ããªãªãŒã¹ã¢ãŒãã§ã³ã³ãã€ã«ãLLVMIRã衚瀺ã
äžè¬ã«ãååž°ïŒãã¬ã€ããªããžã§ã¯ããC FFIãªã©ïŒãæ€åºã§ãããšã¯æããªããããåŒã³åºãã蚌æã§ããªãéããã»ãšãã©ãã¹ãŠã®åŒã³åºããµã€ãã§llvm.sideeffect
ã䜿çšããå¿
èŠããããŸãããµã€ãã¯ååž°ããŸããã 蚌æã§ããå Žåã«ååž°ããªãããšã蚌æããã«ã¯ã fn main() { main() }
ãããªæãäºçŽ°ãªããã°ã©ã ãé€ããŠãæç¶ãéã®åæãå¿
èŠã§ãã ãã®ä¿®æ£ãå®è£
ããããšã®åœ±é¿ãšããã®åé¡ã«å¯Ÿãã代æ¿ãœãªã¥ãŒã·ã§ã³ããããã©ãããç¥ãããšã¯è¯ãããšãããããŸããã
@gnzlbgããã¯æ¬åœã§ããã@ llvm.sideeffectsãåŒã³åºããµã€ãã§ã¯ãªããé¢æ°ã®ãšã³ããªã«é 眮ããããšãã§ããŸãã
äžæè°ãªããšã«ã @ SergioBenitezã®ãã¹ãã±ãŒã¹ã§
ãŸããã¹ã¿ãã¯ãªãŒããŒãããŒã®å Žåãå¥ã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããã¹ãã§ã¯ãããŸãããïŒ ãã¹ã¿ãã¯ããªãŒããŒãããŒããããªã©ãåºåããã³ãŒãããããšæããŸãããïŒ
@RalfJungã¯ãããã°ã¢ãŒãã§è©ŠããŸãããïŒ ïŒç§ã®ãã·ã³ãšéã³å Žã§ã¯ããããã°ã¢ãŒãã§ã¹ã¿ãã¯ãªãŒããŒãããŒã確å®ã«åçŸã§ããã®ã§ãããã§ãªãå Žåã¯ãã°ãåããå¿
èŠããããããããŸããïŒã --release
ããã¹ãŠã®ã³ãŒãã誀ã£ãŠæé©åãããŠãããããã¹ã¿ãã¯ãªãŒããŒãããŒã¯çºçããŸããã
@sunfishcode
ããã¯æ¬åœã§ããã@ llvm.sideeffectsãåŒã³åºããµã€ãã§ã¯ãªããé¢æ°ã®ãšã³ããªã«é 眮ããããšãã§ããŸãã
llvm.sideeffects
ãã©ã®æé©åã劚ããããæ£ç¢ºã«ç¥ããªããã°ãåé²ããããã®æåã®æ¹æ³ãå€æããã®ã¯å°é£ã§ãã ã§ããã ãå°ãªã@llvm.sideeffects
ãçæããããšãã䟡å€ã¯ãããŸããïŒ ããã§ãªãå Žåã¯ãããããã¹ãŠã®é¢æ°åŒã³åºãã«å
¥ããã®ãæãç°¡åãªããšãããããŸããã ãã以å€ã®å ŽåãIIUCã¯ã @llvm.sideeffect
ãå¿
èŠãã©ããã¯ãåŒã³åºããµã€ãã®æ©èœã«ãã£ãŠç°ãªããŸãã
trait Foo {
fn foo(&self) { self.bar() }
fn bar(&self);
}
struct A;
impl Foo for A {
fn bar(&self) {} // not recursive
}
struct B;
impl Foo for B {
fn bar(&self) { self.foo() } // recursive
}
fn main() {
let a = A;
a.bar(); // Ok - no @llvm.sideeffect needed anywhere
let b = B;
b.bar(); // We need @llvm.sideeffect on this call site
let c: &[&dyn Foo] = &[&a, &b];
for i in c {
i.bar(); // We need @lvm.sideeffect here too
}
}
AFAICTãé¢æ°å
ã«@llvm.sideeffect
å
¥ããŠãé¢æ°ãåé€ãããªãããã«ããå¿
èŠãããããããããã®ãæé©åãã«äŸ¡å€ããããšããŠããçŸåšã®ã¢ãã«ã§ç°¡åã«å®è¡ã§ãããšã¯æããŸããã ããšãããã§ãã£ããšããŠãããããã®æé©åã¯ãååž°ããªãããšã蚌æã§ããããšã«äŸåããŸãã
ãããã°ã¢ãŒãã§è©ŠããŸãããïŒ ïŒç§ã®ãã·ã³ãšéã³å Žã§ã¯ããããã°ã¢ãŒãã§ã¹ã¿ãã¯ãªãŒããŒãããŒã確å®ã«åçŸã§ããã®ã§ãããã§ãªãå Žåã¯ãã°ãåããå¿ èŠããããããããŸããïŒ
ãã¡ããã§ããããããã°ã¢ãŒãã§ã¯LLVMã¯ã«ãŒãã®æé©åãè¡ããªããããåé¡ã¯ãããŸããã
ããã°ã©ã ããããã°ã¢ãŒãã§ãªãŒããŒãããŒããå Žåãããã¯UBãäœæããããã®LLVMã©ã€ã»ã³ã¹ãäžããã¹ãã§ã¯ãããŸããã åé¡ã¯ãæçµçãªããã°ã©ã ã«UBããããã©ãããææ¡ããããšã§ãããIRãèŠã€ããŠãããšããããŸããã ã»ã°ã¡ã³ããŒã·ã§ã³éåã§ãããçç±ã¯ããããŸããã ããããã¹ã¿ãã¯ãªãŒããŒãããŒããã°ã©ã ãã»ã°ã¡ã³ããŒã·ã§ã³éåã®ããã°ã©ã ã«ãæé©åãããããšã¯ãç§ã«ã¯ãã°ã®ããã«æããŸãã
ããã°ã©ã ããããã°ã¢ãŒãã§ãªãŒããŒãããŒããå Žåãããã¯UBãäœæããããã®LLVMã©ã€ã»ã³ã¹ãäžããã¹ãã§ã¯ãããŸããã
ããããã¹ã¿ãã¯ãªãŒããŒãããŒããã°ã©ã ãã»ã°ã¡ã³ããŒã·ã§ã³éåã®ããã°ã©ã ã«ãæé©åãããããšã¯ãç§ã«ã¯ãã°ã®ããã«æããŸãã
Cã§ã¯ãå®è¡ã¹ã¬ããã¯ãçµäºãæ®çºæ§ã¡ã¢ãªã¢ã¯ã»ã¹ãI / OããŸãã¯åæã¢ãããã¯æäœãå®è¡ãããšæ³å®ãããŠããŸãã LLVM-IRããå¶ç¶ãŸãã¯èšèšã«ãã£ãŠåãã»ãã³ãã£ã¯ã¹ãæã€ããã«é²åããªãã£ããšããããç§ã¯é©ããŸãã
Rustã³ãŒãã«ã¯ãçµäºããããšã®ãªãå®è¡ã¹ã¬ãããå«ãŸããŠããããããCã§UBã«ãªããªãããã«ããããã«å¿ èŠãªæäœã¯å®è¡ãããŸãããæªå®çŸ©ã®åäœãæã€Cããã°ã©ã ãšåãLLVM-IRãçæããã®ã§ã¯ãªãããšæããŸããã§ããããLLVMããã®Rustããã°ã©ã ã誀ã£ãŠæé©åããŠããããšã¯é©ãã¹ãããšã§ã¯ãªããšæããŸãã
ã»ã°ã¡ã³ããŒã·ã§ã³éåã§ãããçç±ã¯ããããŸããã
LLVMã¯ç¡éååž°ãåé€ãããããåè¿°ã®@SergioBenitezã®ããã«ãããã°ã©ã ã¯æ¬¡ã®
ã©ã³ãã ãªã¡ã¢ãªäœçœ®ãžã®åç §ãäœæããããšãèš±å¯ããããã®åŸãåç §ãèªã¿åãããŸããã
ãããè¡ãããã°ã©ã ã®éšåã¯ããã§ãïŒ
let x = Container::from("hello"); // invalid reference created here
println!("{} {}", x.string, x.num); // invalid reference dereferenced here
ããã§ã Container::from
ã¯ç¡éååž°ãéå§ããLLVMã¯ãããçºçããããšã¯ãªããšçµè«ä»ããã©ã³ãã ãªå€ã«çœ®ãæããŠãåç
§ã解é€ããŸãã ããã誀ã£ãŠæé©åãããå€ãã®æ¹æ³ã®1ã€ãããã§èŠãããšãã§ããŸãïŒ https ïŒ//rust.godbolt.org/z/P7Snexéã³å ŽïŒhttps://play.rust-lang.org/?gist=f00d41cc189f9f6897d429350f3781ec&version=stable&mode = releaseïŒedition = 2015ïŒãã®æé©åã«ããããããã°ãã«ãããã®ãªãªãŒã¹ã§å¥ã®ãããã¯ãçºçããŸãããUBã¯UBã§ãã
Rustã³ãŒãã«ã¯ãçµäºããããšã®ãªãå®è¡ã¹ã¬ãããå«ãŸããŠããããããCã§UBã«ãªããªãããã«ããããã«å¿ èŠãªæäœã¯å®è¡ãããŸãããæªå®çŸ©ã®åäœãæã€Cããã°ã©ã ãšåãLLVM-IRãçæããã®ã§ã¯ãªãããšæããŸããã§ããããLLVMããã®Rustããã°ã©ã ã誀ã£ãŠæé©åããŠããããšã¯é©ãã¹ãããšã§ã¯ãªããšæããŸãã
ããã¯ç¡éã«ãŒãã®åé¡ãšåããã°ã§ã¯ãªããšããªããäžã§äž»åŒµããå°è±¡ãåããŸããã ãã®æãç§ã¯ããªãã®ã¡ãã»ãŒãžãèªã¿ééããããã§ãã æ··ä¹±ãããŠç³ãèš³ãããŸããã
ããã§ãè¯ã次ã®ã¹ãããã¯ãç§ãã¡ãçæããIRã«ããã€ãã®llvm.sideffect
ãæ¯ããããããã€ãã®ãã³ãããŒã¯ãè¡ãããšã ãšæãããŸããïŒ
Cã§ã¯ãå®è¡ã¹ã¬ããã¯ãçµäºãæ®çºæ§ã¡ã¢ãªã¢ã¯ã»ã¹ãI / OããŸãã¯åæã¢ãããã¯æäœãå®è¡ãããšæ³å®ãããŠããŸãã
ãšããã§ãããã¯å®å
šã«ã¯æ£ãããããŸãããæ¡ä»¶ä»ãã®ã«ãŒãïŒ while (true) { /* ... */ }
ïŒã¯ãå¯äœçšãå«ãŸããŠããªãå Žåã§ããæšæºã§æ瀺çã«èš±å¯ãããŠããŸãã ããã¯C ++ã§ã¯ç°ãªããŸãã LLVMã¯ããã§Cæšæºãæ£ããå®è£
ããŠããŸããã
ããã¯ç¡éã«ãŒãã®åé¡ãšåããã°ã§ã¯ãªããšããªããäžã§äž»åŒµããå°è±¡ãåããŸããã
éçµäºã®Rustããã°ã©ã ã®åäœã¯åžžã«å®çŸ©ãããŸãããéçµäºã®LLVM-IRããã°ã©ã ã®åäœã¯ãç¹å®ã®æ¡ä»¶ãæºããããå Žåã«ã®ã¿å®çŸ©ãããŸãã
ãã®åé¡ã¯ãçæãããLLVM-IRã®åäœãå®çŸ©ãããããã«ãç¡éã«ãŒãã®Rustã®å®è£
ãä¿®æ£ããããšã«é¢ãããã®ã ãšæããŸããããã®ããã @llvm.sideeffect
ã¯ããªãè¯ã解決çã®ããã«èãããŸããã
@SergioBenitezã¯ãååž°ã䜿çšããŠéçµäºã®Rustããã°ã©ã ãäœæããããšãã§ãããšè¿°ã¹ã @ rkruppeã¯ãç¡éååž°ãšç¡éã«ãŒãã¯åçã§ããããããããã¯äž¡æ¹ãšãåããã°ã§ãããšäž»åŒµããŸããã
ãããã®2ã€ã®åé¡ãé¢é£ããŠããããšããŸãã¯åããã°ã§ããããšã«ç°è«ã¯ãããŸããããç§ã«ãšã£ãŠã¯ãããã2ã€ã®åé¡ã¯å°ãç°ãªã£ãŠèŠããŸãã
ãœãªã¥ãŒã·ã§ã³ã«é¢ããŠã¯ãæé©åããªã¢ïŒ @llvm.sideeffect
ïŒãéçµäºã«ãŒãã«æä»çã«é©çšããããšããããã¹ãŠã®Rusté¢æ°ã«é©çšããããã«ããŸãã
å€çã«ã¯ãããã°ã©ã ãçµäºããªããããç¡éã®loop
ã圹ç«ã¡ãŸãã ç¡éååž°ã®å Žåãããã°ã©ã ãçµäºãããã©ããã¯æé©åã¬ãã«ïŒLLVMãååž°ãã«ãŒãã«å€æãããã©ãããªã©ïŒã«äŸåããããã°ã©ã ããã€ã©ã®ããã«çµäºãããã¯ãã©ãããã©ãŒã ïŒã¹ã¿ãã¯ãµã€ãºãä¿è·ãããã¬ãŒãããŒãžãªã©ïŒã«ãã£ãŠç°ãªããŸãã Rustå®è£
ãå¥å
šã«ããããã«ã¯äž¡æ¹ãä¿®æ£ããå¿
èŠããããŸãããç¡éååž°ã®å ŽåããŠãŒã¶ãŒãããã°ã©ã ãæ°žä¹
ã«ååž°ããããšãæå³ããå Žåãå¥å
šãªå®è£
ã¯åžžã«æ°žä¹
ã«ååž°ãããšã¯éããªããšããæå³ã§ãééã£ãããŸãŸã§ãã
ãœãªã¥ãŒã·ã§ã³ã«é¢ããŠã¯ãæé©åããªã¢ïŒ@ llvm.sideeffectïŒãéçµäºã«ãŒãã«ã®ã¿é©çšããããšããããã¹ãŠã®Rusté¢æ°ã«é©çšããŸãã
ã«ãŒãæ¬äœã«ã¯å®éã«å¯äœçšãããïŒå€éšé¢æ°ã®åŒã³åºãã®å Žåã®ããã«æœåšçã«ã ãã§ãªãïŒããããã£ãŠllvm.sideeffect
æ¿å
¥ããå¿
èŠããªãããšã瀺ãããã«å¿
èŠãªåæã¯ãããããã»ãŒåãé åºã§ãéåžžã«æ³šæãå¿
èŠã§ããç¡éååž°ã®äžéšã§ããå¯èœæ§ã®ããé¢æ°ã«ã€ããŠåãããšã瀺ã倧ããã ã»ãšãã©ã®Rustã«ãŒãã«ã¯ã€ãã¬ãŒã¿ãŒãå«ãŸãããããæåã«å€ãã®æé©åãè¡ããã«ã«ãŒããçµäºããŠããããšã蚌æããããšãå°é£ã§ãã ãããã£ãŠã llvm.sideeffect
ãã«ãŒãã®å€§éšåã«é
眮ããããšã«ãªããŸãã 確ãã«ãã«ãŒããå«ãŸãªãé¢æ°ã¯ããªããããŸãããããã§ãç§ã«ã¯è³ªçãªéãã®ããã«ã¯æããŸããã
åé¡ãæ£ããç解ããŠããã°ãç¡éã«ãŒãã®å Žåãä¿®æ£ããã«ã¯ãã«ãŒãã®æ¬äœã«while <compile-time constant true> { ... }
ãå«ãŸããŠããªãbreak
loop { ... }
ãšwhile <compile-time constant true> { ... }
ã«llvm.sideeffect
ãæ¿å
¥ããã ãã§ååã§ãã break
åŒã ããã«ãããç¡éã«ãŒãã®C ++ã»ãã³ãã£ã¯ã¹ãšRustã»ãã³ãã£ã¯ã¹ã®éããããããŸããRustã§ã¯ãC ++ãšã¯ç°ãªããã³ã³ãã€ã©ãŒã¯ãã³ã³ãã€ã«æã«ã«ãŒããçµäºããããšãããã£ãŠãããšãã«ã«ãŒããçµäºãããšæ³å®ããããšã¯ã§ããŸããã ïŒäœããããã¯ã«ãªãå¯èœæ§ã®ããã«ãŒãã«çŽé¢ããŠãæ£ç¢ºãã«ã€ããŠã©ãã ãå¿é
ããå¿
èŠããããã¯ããããŸããããããã¯åŸã§ãã€ã§ãæ¹åã§ããŸããïŒ
ç¡éååž°ã«ã€ããŠã©ãããã°ãããããããŸããããç¡éååž°ãç¡é¢ä¿ã®ã»ã°ã¡ã³ããŒã·ã§ã³éåã«æé©åããããšã¯æãŸãããªãåäœã§ãããšããRalfJungã«åæããŸãã
@zackw
åé¡ãæ£ããç解ããŠããã°ãç¡éã«ãŒãã®ã±ãŒã¹ãä¿®æ£ããã«ã¯ãllvm.sideeffectãã«ãŒã{...}ã«æ¿å ¥ããã ãã§ååã§ãã
{...}ããã§ãã«ãŒãã®æ¬äœã«ã¯ãã¬ãŒã¯åŒãå«ãŸããŠããŸããã
ããã»ã©åçŽã§ã¯ãªããšæããŸããããšãã°ã loop { if false { break; } }
ã¯break
åŒãå«ãç¡éã«ãŒãã§ãããllvmãåé€ããªãããã«@llvm.sideeffect
ãæ¿å
¥ããå¿
èŠããããŸãã AFAICTã«ãŒããåžžã«çµäºããããšã蚌æã§ããªãéãã @llvm.sideeffect
ãæ¿å
¥ããå¿
èŠããããŸãã
@gnzlbg
loop { if false { break; } }
ã¯ãã¬ãŒã¯åŒãå«ãç¡éã«ãŒãã§ãããllvmããããåé€ããªãããã«ã@llvm.sideeffect
ãæ¿å ¥ããå¿ èŠããããŸãã
ããŒããã¯ããããã¯é¢åã§ãã ããããç§ãã¡ã¯_å®ç§_ã§ããå¿ èŠã¯ãªããæ§ããã«æ£ããã ãã§ãã ã®ãããªã«ãŒã
while spinlock.load(Ordering::SeqCst) != 0 {}
ïŒ std::sync::atomic
ããã¥ã¡ã³ãããïŒå¶åŸ¡æ¡ä»¶ãäžå®ã§ã¯ãªãããã @llvm.sideeffect
ãå¿
èŠãšããªãããšãç°¡åã«ããããŸãïŒãããŠãã¢ãããã¯ããŒãæäœã¯LLVMã®ç®çã§å¯äœçšãšããŠã«ãŠã³ãããæ¹ãããã§ãããïŒ ããŸãã¯ãã倧ããªåé¡ããããŸãïŒã ããã°ã©ã ãžã§ãã¬ãŒã¿ã«ãã£ãŠæŸåºãããå¯èœæ§ã®ããçš®é¡ã®æéã«ãŒãã
loop {
if /* runtime-variable condition */ { break }
/* more stuff */
}
ãŸããé¢åãªããšã§ã¯ãããŸããã å®éããã«ãŒãã®æ¬äœã«ãã¬ãŒã¯åŒããªããã«ãŒã«ãééã£ãŠããå Žåã¯ãããŸããïŒ
loop {
if /* provably false at compile time */ { break }
}
ïŒ
ãã®åé¡ã¯ãçæãããLLVM-IRã®åäœãå®çŸ©ãããããã«ãç¡éã«ãŒãã®Rustã®å®è£ ãä¿®æ£ããããšã«é¢ãããã®ã ãšæããŸããããã®ããã@ llvm.sideeffectã¯ããªãè¯ã解決çã®ããã«èãããŸããã
ãã£ããã ã ãã ããããªããèšã£ãããã«ãåé¡ïŒRustã»ãã³ãã£ã¯ã¹ãšLLVMã»ãã³ãã£ã¯ã¹ã®äžäžèŽïŒã¯ãå®éã«ã¯ã«ãŒãã§ã¯ãªããéçµäºã«é¢ãããã®ã§ãã ã§ããããããã§è¿œè·¡ããå¿ èŠãããã®ã¯ããã ãšæããŸãã
@zackw
åé¡ãæ£ããç解ããŠããã°ãç¡éã«ãŒãã®ã±ãŒã¹ãä¿®æ£ããã«ã¯ãllvm.sideeffectãã«ãŒã{...}ã«æ¿å ¥ããã ãã§ååã§ãã
{...}ããã§ãã«ãŒãã®æ¬äœã«ã¯ãã¬ãŒã¯åŒãå«ãŸããŠããŸããã ããã«ãããç¡éã«ãŒãã®C ++ã»ãã³ãã£ã¯ã¹ãšRustã»ãã³ãã£ã¯ã¹ã®éããããããŸããRustã§ã¯ãC ++ãšã¯ç°ãªããã³ã³ãã€ã©ãŒã¯ãã³ã³ãã€ã«æã«ã«ãŒããçµäºããŠããªãããšãããã£ãŠããå Žåã«ãã«ãŒããçµäºãããšæ³å®ããããšã¯ã§ããŸããã ïŒäœããããã¯ã«ãªãå¯èœæ§ã®ããã«ãŒãã«çŽé¢ããŠãæ£ç¢ºãã«ã€ããŠã©ãã ãå¿é ããå¿ èŠããããã¯ããããŸããããããã¯åŸã§ãã€ã§ãæ¹åã§ããŸããïŒ
ããªãã説æããããšã¯Cã«ãåœãŠã¯ãŸããŸããRustã§ã¯ãã©ã®ã«ãŒããçºæ£ããããšãã§ããŸãã ä»ã®ãã¹ãŠãè¡ãã®ã¯äžå¥å šã§ãã
ã ãããäŸãã°
while test_fermats_last_theorem_on_some_random_number() { }
ã¯Rustã§ã¯åé¡ãªãããã°ã©ã ã§ãïŒãã ããCã§ãC ++ã§ããããŸããïŒãå¯äœçšãåŒãèµ·ããããšãªããæ°žä¹ ã«ã«ãŒãããŸãã ãããã£ãŠãçµäºããããšã蚌æã§ãããã®ãé€ããŠããã¹ãŠã®ã«ãŒãã§ããå¿ èŠããããŸãã
@zackw
ãã«ãŒãã®æ¬äœã«ãã¬ãŒã¯åŒããªããã«ãŒã«ãééã£ãŠããå Žåã¯ãããŸããïŒ
if /*compile-time condition */
ã ãã§while
ã match
ã for
ã...ïŒãå®è¡æã®æ¡ä»¶ã圱é¿ãåããŸãã
ããããç§ãã¡ã¯å®ç§ã§ããå¿ èŠã¯ãªããæ§ããã«æ£ããã ãã§ãã
èããŠã¿ãŸãããïŒ
fn foo(x: bool) { loop { if x { break; } } }
ããã§ã x
ã¯å®è¡æã®æ¡ä»¶ã§ãã ããã§@llvm.sideeffect
çºè¡ããªãå ŽåããŠãŒã¶ãŒãfoo(false)
ã©ããã«æžã蟌ããšã foo
ãã€ã³ã©ã€ã³åãããå®æ°ã®äŒæãšãããã³ãŒãã®é€å»ã«ãããã«ãŒããæé©åãããŸããå¯äœçšã®ãªãç¡éã«ãŒããæé©åã®èª€ããçºçããŸãã
ãããçã«ããªã£ãŠããå ŽåãLLVMã§å®è¡ã§ããå€æã®1ã€ã¯ã foo
ãfoo_opt
眮ãæããããšã§ãã
fn foo_opt(x: bool) { if x { foo(true) } else { foo(false) } }
ããã§ãäž¡æ¹ã®ãã©ã³ãã¯åå¥ã«æé©åããã @llvm.sideeffect
䜿çšããªããšã2çªç®ã®ãã©ã³ãã¯æé©åãããŸããã
ã€ãŸãã @llvm.sideeffect
ãçç¥ã§ããããã«ããã«ã¯ãLLVMãã©ã®ãããªç¶æ³ã§ããã®ã«ãŒãã誀ã£ãŠæé©åã§ããªãããšã蚌æããå¿
èŠããããŸãã ããã蚌æããå¯äžã®æ¹æ³ã¯ãã«ãŒããåžžã«çµäºããããšã蚌æããããã«ãŒããçµäºããªãå Žåã¯ãæé©åã®èª€ããé²ãããšã®1ã€ãç¡æ¡ä»¶ã«å®è¡ããããšã蚌æããããšã§ãã ããã§ããã«ãŒãåå²/ããŒãªã³ã°ãªã©ã®æé©åã¯ã1ã€ã®ã«ãŒããäžé£ã®ã«ãŒãã«å€æããå¯èœæ§ããããæé©åã®èª€ããçºçããããã«ã¯ããã®ãã¡ã®1ã€ã«@llvm.sideeffect
ããªãã ãã§ååã§ãã
ãã®ãã°ã«é¢ãããã¹ãŠã¯ã rustc
ãããããLLVMãã解決ããæ¹ãã¯ããã«ç°¡åã§ããããã«ç§ã«ã¯èãããŸãã ïŒå
責äºé
ïŒç§ã¯ãããã®ãããžã§ã¯ãã®ããããã®ã³ãŒãããŒã¹ãæ¬åœã«ç¥ããŸããïŒ
ç§ãç解ããŠããããã«ãLLVMããã®ä¿®æ£ã¯ãæé©åãå®è¡äžïŒéçµäºã蚌æãã||ã©ã¡ãã蚌æã§ããªãïŒãããéçµäºã蚌æã§ããå Žåã«ã®ã¿å®è¡ããïŒãŸãã¯ãã®éïŒã«å€æŽããããšã§ãã ãããïŒãšã«ããïŒç°¡åã ãšèšã£ãŠããããã§ã¯ãããŸããããLLVMã«ã¯ãã§ã«ïŒããããïŒã«ãŒãã®ïŒéïŒçµäºã蚌æããããšããã³ãŒããå«ãŸããŠããŸãã
äžæ¹ã rustc
ã¯ã @llvm.sideeffect
è¿œå ããããšã«ãã£ãŠã®ã¿ãããå®è¡ã§ããŸããããã¯ãéçµäºãäžé©åã«äœ¿çšããæé©åããåã«ãç¡å¹ã«ããããããæé©åã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãã ãŸãã rustc
ã¯ãã«ãŒãã®ïŒéïŒçµäºãæ€åºããããã«æ°ããã³ãŒããåã蟌ãå¿
èŠããããŸãã
ãããã£ãŠãä»åŸã®éã¯æ¬¡ã®ããã«ãªããšæããŸãã
@llvm.sideeffect
ãè¿œå ããŸã@llvm.sideeffects
ãåé€ããŸãããã«ã€ããŠããªãã¯ã©ãæããŸããïŒ ã¹ããã1ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ã2ãå®è£ ããããšæ¶ããããšãæå³ããŠãããšããŠããããã»ã©ã²ã©ããã®ã§ã¯ãªãããšãé¡ã£ãŠããŸãâŠ
@Ekleogã¯ã @ sunfishcodeã®2çªç®ã®ãããã®å 容https ïŒ //lists.llvm.org/pipermail/llvm-dev/2017-October/118595.html
é¢æ°å±æ§ã®ææ¡ã®äžéšã¯
LLVM IRã®ããã©ã«ãã®ã»ãã³ãã£ã¯ã¹ãå€æŽããŠã
ç¡éã«ãŒãããpotential-UBã«ãªããã€ã³ããå±æ§ãè¿œå ããŸãã ãã
ããããã°ã@ llvm.sideeffectã®åœ¹å²ã¯å°ããªããŸã
埮åŠ-Cã®ãããªèšèªã®ããã³ããšã³ããéžæããæ¹æ³ã«ãªãã§ããã
æ©èœã®æœåšçãªUBã«ãããããã®åŸå人ããªããã¢ãŠã
ãã®é¢æ°ã®ã«ãŒãã
LLVMã«å ¬å¹³ãæãããã«ãã³ã³ãã€ã©ãŒã®äœæè ã¯ããã«ãŒããçµäºããªãããšã蚌æããæé©åãäœæããŠãããããæ ¹æ¬çã«æé©åã§ããããã«ããããšãã芳ç¹ãããã®ãããã¯ã«ã¢ãããŒãããŸããã 代ããã«ãã«ãŒããçµäºããããå¯äœçšããããšããä»®å®ã¯ãããã€ãã®äžè¬çãªã³ã³ãã€ã©ã¢ã«ãŽãªãºã ã§èªç¶ã«çºçããŸãã ãããä¿®æ£ããããšã¯ãæ¢åã®ã³ãŒãã埮調æŽããã ãã§ã¯ãããŸããã ããªãã®éã®æ°ããè€éããå¿ èŠã«ãªããŸãã
é¢æ°æ¬äœã«ãå¯äœçšããªãããã©ããããã¹ãããããã«ã次ã®ã¢ã«ãŽãªãºã ãæ€èšããŠãã ãããæ¬äœã®åœä»€ã«æœåšçãªå¯äœçšãããå Žåãé¢æ°æ¬äœã«å¯äœçšãããå¯èœæ§ããããŸãã çŽ æŽããããŠã·ã³ãã«ã ãã®åŸããå¯äœçšã®ãªããé¢æ°ã®åŒã³åºãã¯åé€ãããŸãã 涌ããã ãã ããåå²åœä»€ã«ã¯å¯äœçšããªããšèŠãªããããããç¡éã«ãŒããå«ãŸããŠããå Žåã§ããåå²ã®ã¿ãå«ãé¢æ°ã«ã¯å¯äœçšããªãããã«èŠããŸãã ãã£ãšã
ä¿®æ£å¯èœã§ãã ä»ã®èª°ããããã調ã¹ãããšã«èå³ããããªããç§ã®åºæ¬çãªèãã¯ããå¯äœçšãããããšããæŠå¿µããå®éã®å¯äœçšãããããšãçµãããªããããããªãããšããç¬ç«ããæŠå¿µã«åå²ããããšã§ãã 次ã«ããªããã£ãã€ã¶ãŒå šäœã調ã¹ãŠããå¯äœçšããããããšã«é¢å¿ã®ãããã¹ãŠã®å ŽæãèŠã€ããå®éã«å¿ èŠãªæŠå¿µãèŠã€ããŸãã 次ã«ããã·ããŒãŒã·ã§ã³ãåé¿ããããã«ãã«ãŒãã®äžéšã§ã¯ãªããã©ã³ãã«ã¡ã¿ããŒã¿ãè¿œå ããããã«ã«ãŒããã¹ãæããããã«ãŒããå«ãŸããŠããã«ãŒããæéã§ããããšã蚌æããŸãã
èãããã劥åæ¡ã¯ããŠãŒã¶ãŒãæåéã空ã®loop { }
ïŒãŸãã¯åæ§ã®ãã®ïŒãŸãã¯ç¡æ¡ä»¶ã®ååž°ïŒãã§ã«ç³žãããåºãŠããïŒãæžã蟌ãã ãšãã«ãrustcã«@ llvm.sideeffectãæ¿å
¥ãããããšã§ãã ãã®åŠ¥åã«ãããå®éã«ç¡éã®å¹æã®ãªãå転ã«ãŒããæå³ããŠãã人ã
ã¯ãä»ã®ãã¹ãŠã®äººã®ãªãŒããŒããããåé¿ããªããããããååŸããããšãã§ããŸãã ãã¡ããããã®åŠ¥åã«ãã£ãŠå®å
šãªã³ãŒããã¯ã©ãã·ã¥ãããããšã¯äžå¯èœã§ã¯ãããŸããããå¶çºçã«çºçããå¯èœæ§ã¯äœããªãå¯èœæ§ããããå®è£
ã¯ç°¡åãªã¯ãã§ãã
代ããã«ãã«ãŒããçµäºããããå¯äœçšããããšããä»®å®ã¯ãããã€ãã®äžè¬çãªã³ã³ãã€ã©ã¢ã«ãŽãªãºã ã§èªç¶ã«çºçããŸãã
ããªãããããã®å€æã®æ£ããã«ã€ããŠèãå§ãããããã°ãããã¯å®å šã«äžèªç¶ã§ãã ççŽã«èšã£ãŠããã®ä»®å®ãèš±å¯ããããšã¯Cã®å€§ããªééãã ã£ããšæããŸããããŸãã
ããã£å ã®åœä»€ã«æœåšçãªå¯äœçšãããå Žåãé¢æ°ããã£ã«å¯äœçšãããå¯èœæ§ããããŸãã
ããªããç©äºãæ£åŒã«èŠå§ãããšãããéçµäºããéåžžå¹æãšèŠãªãããã®ã«ã¯ååãªçç±ããããŸãã ïŒHaskellã¯çŽç²ã§ã¯ãããŸããã2ã€ã®å¹æããããŸãïŒéçµäºãšäŸå€ã§ããïŒ
èãããã劥åæ¡ã¯ããŠãŒã¶ãŒãæåéã空ã®ã«ãŒã{}ïŒãŸãã¯åæ§ã®ãã®ïŒãŸãã¯ç¡æ¡ä»¶ã®ååž°ïŒãã§ã«ç³žãããåºãŠããïŒãæžã蟌ãã ãšãã«ãrustcã«@ llvm.sideeffectãæ¿å ¥ãããããšã§ãã ãã®åŠ¥åã«ãããå®éã«ç¡éã®å¹æã®ãªãå転ã«ãŒããæå³ããŠãã人ã ã¯ãä»ã®ãã¹ãŠã®äººã®ãªãŒããŒããããåé¿ããªããããããååŸããããšãã§ããŸãã ãã¡ããããã®åŠ¥åã«ãã£ãŠå®å šãªã³ãŒããã¯ã©ãã·ã¥ãããããšã¯äžå¯èœã§ã¯ãããŸããããå¶çºçã«çºçããå¯èœæ§ã¯äœããªãå¯èœæ§ããããå®è£ ã¯ç°¡åãªã¯ãã§ãã
ãææã®ãšãããããã¯ãŸã æ£ãããããŸããã ééã£ãŠããããšã
ããã§èµ·ãã£ãããšã¯ããã³ã³ãã€ã©ã«äœãæ±ããŠããããããå§ããŠãããä»æ§ã«ããã®ã§ã¯ãªããã³ã³ãã€ã©ãè¡ã£ãããšãäžå¿ã«æ£åœæ§ã®æŠå¿µãæ§ç¯ãããããšã§ãã æ£ããã³ã³ãã€ã©ã¯ãåžžã«åå²ããããã°ã©ã ãçµäºããããã°ã©ã ã«å€æããŸããã ããã¯ããªãèªæã ãšæããŸãããRustãåççãªåã·ã¹ãã ãæã£ãŠããã®ã§ãããã¯åã§ãã¯ã£ãããšç®æãããŠããŸãããã®ãããåé¡ã¯å®æçã«è¡šé¢åããŠããŸãã
䜿çšããŠããå¶çŽïŒã€ãŸããLLVMïŒãèãããšãæåã«ãååãªå Žæã«llvm.sideeffect
ãè¿œå ããŠããã¹ãŠã®åå²å®è¡ããããã®å€ããç¡éã«ãå®è¡ãããããšãä¿èšŒãããããã«ããŸãã 次ã«ã劥åœãªïŒå¥å
šã§æ£ããïŒããŒã¹ã©ã€ã³ã«å°éãããããã®æ³šéãäžèŠã§ããããšãä¿èšŒã§ããå Žåã¯ããããã®æ³šéãåé€ããããšã§æ¹åã«ã€ããŠè©±ãåãããšãã§ããŸãã
ç§ã®äž»åŒµãããæ£ç¢ºã«èšããšã以äžã¯å¥å
šãªRustã¯ã¬ãŒãã§ããã pick_a_number_greater_2
ïŒé決å®è«çã«ïŒããçš®ã®big-intãè¿ããŠãããšæããŸãã
fn test_fermats_last_theorem() -> bool {
let x = pick_a_number_greater_2();
let y = pick_a_number_greater_2();
let z = pick_a_number_greater_2();
let n = pick_a_number_greater_2();
// x^n + y^n = z^n is impossible for n > 2
pow(x, n) + pow(y, n) != pow(z, n)
}
pub fn diverge() -> ! {
while test_fermats_last_theorem() { }
// This code is unreachable, as proven by Andrew Wiles
unsafe { mem::transmute(()) }
}
ãã®åå²ã«ãŒããã³ã³ãã€ã«ãããšãããã¯ãã°ã§ãããä¿®æ£ããå¿ èŠããããŸãã
ãããçŽ æŽã«ä¿®æ£ããã®ã«ã©ãã ãã®ããã©ãŒãã³ã¹ãå¿ èŠãã«ã€ããŠã¯ããããŸã§ã®ãšããæ°å€ãããããŸããã ãããããŸã§ãäžèšã®ãããªããã°ã©ã ãæ æã«äžæããçç±ã¯ãããŸããã
å®éã«ã¯ã fn foo() { foo() }
ã¯åžžã«ãªãœãŒã¹ã®æ¯æžã«ããçµäºããŸãããRustæœè±¡ãã·ã³ã«ã¯ç¡éã«å€§ããªã¹ã¿ãã¯ãã¬ãŒã ïŒAFAIKïŒãããããããã®ã³ãŒããfn foo() { loop {} }
ã«å€æããããšã¯æå¹ã§ããçµäºããŸãïŒãŸãã¯ãã¯ããåŸã«ãå®å®ãåçµãããšãïŒã ãã®å€æã¯æå¹ã§ããå¿
èŠããããŸããïŒ ã¯ããšæããŸããããããªããšãçµäºã蚌æã§ããªãéãæ«å°ŸåŒã³åºãã®æé©åãå®è¡ã§ããŸãããããã¯æ®å¿µãªããšã§ãã
äžããããã«ãŒããååž°ã...ãåžžã«çµäºããããšã瀺ãunsafe
çµã¿èŸŒã¿ãæã€ããšã¯æå³ããããŸããïŒ N1528ã¯ããªã³ã¯ãªã¹ãã埪ç°ããŠããå¯èœæ§ããããããã«ãŒããçµäºãããšæ³å®ã§ããªãå Žåããªã³ã¯ãªã¹ãããã©ããŒã¹ãããã€ã³ã¿ã³ãŒãã«ã«ãŒãèåãé©çšã§ããªãããšã瀺ããŠããŸãããªã³ã¯ãªã¹ãã埪ç°ããŠããªãããšã蚌æããããšã¯ãææ°ã®ã³ã³ãã€ã©ã§ã¯äžå¯èœã§ããè¡ãã
ç§ã¯ããã®å¥å
šæ§ã®åé¡ãæ°žä¹
ã«ä¿®æ£ããå¿
èŠãããããšã«çµ¶å¯Ÿã«åæããŸãã ãã ãããäžèŠã§ããããšã蚌æã§ããªãå Žæã«llvm.sideeffect
è¿œå ããããšãä»æ¥æ£ããã³ã³ãã€ã«ãããŠããããã°ã©ã ã®ã³ãŒãå質ãäœäžããå¯èœæ§ãããããšã«æ³šæããå¿
èŠããããŸãã ãã®ãããªæžå¿µã¯ããµãŠã³ãã³ã³ãã€ã©ã®å¿
èŠæ§ã«ãã£ãŠæçµçã«ã¯ç¡å¹ã«ãªããŸãããããã©ãŒãã³ã¹ã®äœäžãåé¿ããå¹³åçãªRustããã°ã©ãã®ç掻ã®è³ªãåäžããã代ããã«ãé©åãªä¿®æ£ãå°ãé
ãããæ¹æ³ã§é²ããã®ãè³¢æãããããŸãããæéã ç§ãææ¡ããïŒ
llvm.sideeffect
ãè¿œå ããããšãã§ããŸãããããã¯ããªãäžè¬çã§ããã誀ã£ãŠã³ã³ãã€ã«ããããšãè€æ°ã®äººãæšããªæ¯åºãããããšã«ãªããŸããå¥åŠãªåé¡ïŒïŒ38136ãïŒ47537ãïŒ54214ããããŠç¢ºãã«ãã£ãšãããŸãïŒã®ãããã°ã«äœæéããããã®ã§ããã®ç·©åçã¯å¥å
šæ§ã®ãã°ãšã¯é¢ä¿ãããŸããããé©åãªåé¡ã解決ããŠããéãéçºè
ã«ãšã£ãŠå
·äœçãªã¡ãªããããããŸããã°ä¿®æ£ã確ãã«ããã®èŠæ¹ã¯ããã®åé¡ãäœå¹Žãç¶ããŠãããšããäºå®ã«ãã£ãŠç¥ããããŠããŸãã ãããæ°ããªéè¡ã§ãã£ãå Žåãç§ã¯ãããããè¿ éã«ä¿®æ£ãããããããå°å ¥ããPRãå ã«æ»ãããšã«ãã£ãšãªãŒãã³ã«ãªããŸãã
äžæ¹ããã®åé¡ãæªè§£æ±ºã§ããéããããã¯https://doc.rust-lang.org/beta/reference/behavior-considered-undefined.htmlã§èšåããå¿ èŠããããŸããïŒ
äžããããã«ãŒããååž°ã...ãåžžã«çµäºããããšã瀺ã
unsafe
çµã¿èŸŒã¿ãæã€ããšã¯æå³ããããŸããïŒ
std::hint::reachable_unchecked
ïŒ
ã¡ãªã¿ã«ãç§ã¯TCPã¡ãã»ãŒãžã·ã¹ãã ã®å®éã®ã³ãŒããæžãããšã«ééããŸããã åæ¢ããããã®å®éã®ã¡ã«ããºã ãå°å ¥ãããŸã§ãäžæåæ¢ãšããŠç¡éã«ãŒãããããŸããããã¹ã¬ããã¯ããã«çµäºããŸããã
誰ãããã¹ãã±ãŒã¹ã³ãŒããŽã«ãããããå ŽåïŒ
fn main() {
(|| loop {})()
}
`` `
$ã«ãŒãŽã©ã³-ãªãªãŒã¹
äžæ£ãªåœä»€ïŒã³ã¢ãã³ãïŒ
誰ãããã¹ãã±ãŒã¹ã³ãŒããŽã«ãããããå ŽåïŒ
pub fn main() { (|| loop {})() }
https://github.com/rust-lang/rust/pull/59546ã®@sfanxiangã«ãã£ãŠè¿œå ããã-Z insert-sideeffect
rustcãã©ã°ã䜿çšãããšãã«ãŒããç¶ããŸã:)
åïŒ
main:
ud2
åŸïŒ
main:
.LBB0_1:
jmp .LBB0_1
ã¡ãªã¿ã«ãããã远跡ããŠããLLVMã®ãã°ã¯https://bugs.llvm.org/show_bug.cgi?id=965ã§ããããã®ã¹ã¬ããã«ã¯ãŸã æçš¿ãããŠããŸããã
ãã®ã¹ã¬ããã«ã¯ãŸã æçš¿ãããŠããŸããã
https://github.com/rust-lang/rust/issues/28728#issuecomment-331460667ããã³https://github.com/rust-lang/rust/issues/28728#issuecomment-263956134
@RalfJungã¯ããã€ããŒãªã³ã¯ã®æŽæ°ãã§ããŸãhttps://github.com/simnalamburt/snippets/blob/master/rust/src/bin/infinite.rsãã«åé¡ã®èª¬æã«https://github.com/simnalamburt/snippets/blob / 12e73f45f3 / rust / infinite.rs thisïŒ ä»¥åã®ãã€ããŒãªã³ã¯ã¯ãããŒããªã³ã¯ã§ã¯ãªãã£ããããé·ãéå£ããŠããŸããã ããããšãïŒ ð
@simnalamburtå®äºãããããšãïŒ
MIR optã¬ãã«ãäžãããšã次ã®å Žåã®æé©åã®èª€ããåé¿ã§ããããã«èŠããŸãã
pub fn main() {
(|| loop {})()
}
--emit=llvm-ir -C opt-level=1
define void @_ZN7example4main17hf7943ea78b0ea0b0E() unnamed_addr #0 !dbg !6 {
unreachable
}
--emit=llvm-ir -C opt-level=1 -Z mir-opt-level=2
define void @_ZN7example4main17hf7943ea78b0ea0b0E() unnamed_addr #0 !dbg !6 {
br label %bb1, !dbg !10
bb1: ; preds = %bb1, %start
br label %bb1, !dbg !11
}
rustc 1.45.0-nightly (5fd2f06e9 2020-05-31)
pub fn oops() {
(|| loop {})()
}
pub fn main() {
oops()
}
ããã¯ãã®ç¹å¥ãªå Žåã«ã¯åœ¹ç«ã¡ãŸããããäžè¬çã«åé¡ã解決ããŸããã https://godbolt.org/z/5hv87d
äžè¬ã«ããã®åé¡ã¯ãé¢é£ããæé©åã䜿çšããåã«ãrustcãŸãã¯LLVMã®ãããããçŽç²é¢æ°ãå®å šã§ããããšã蚌æã§ããå Žåã«ã®ã¿è§£æ±ºã§ããŸãã
確ãã«ãç§ã¯ãããåé¡ã解決ãããšäž»åŒµããŠããŸããã§ããã 埮åŠãªå¹æã¯ä»ã®äººã«ãšã£ãŠååã«èå³æ·±ããã®ã ã£ãã®ã§ãããã§ãèšåãã䟡å€ãããããã«æãããŸããã -Z insert-sideeffect
ã¯ãåŒãç¶ãäž¡æ¹ã®ã±ãŒã¹ãä¿®æ£ããŸãã
LLVMåŽã§äœããåããŠããŸããé²è¡ç¶æ³ã®ä¿èšŒãå¶åŸ¡ããããã«é¢æ°ã¬ãã«ã®å±æ§ãè¿œå ããææ¡ããããŸãã https://reviews.llvm.org/D85393
ãªã誰ããïŒãããšLLVMã¹ã¬ããã§ïŒåé²ã«ã€ããŠã®æ¡é ã匷調ããŠããããã«èŠããã®ãããããŸããã
ã«ãŒãã®æé€ã¯ãã¡ã¢ãªã¢ãã«ã®çŽæ¥çãªçµæã®ããã§ããå€ã®èšç®ã¯ãå€ã䜿çšããåã«ãçºçããéã移åããããšãã§ããŸãã ããŠãå€ã䜿çšã§ããªããšãã蚌æ ãããã°ãããã¯åã«èµ·ãã£ãããšããªããšãã蚌æ ã§ãããã³ãŒãã¯ç¡éã«é ããŸã§ç§»åã§ããããã§ãã¡ã¢ãªã¢ãã«ãæºãããŸãã
ãŸãã¯ãã¡ã¢ãªã¢ãã«ã«ç²ŸéããŠããªãå Žåã¯ãã«ãŒãå šäœãæœè±¡åãããŠå€ãèšç®ããé¢æ°ã«ãªãããšãæ€èšããŠãã ããã ããã§ãã«ãŒãå€ã®å€ã®ãã¹ãŠã®èªã¿åãããã®é¢æ°ã®åŒã³åºãã«çœ®ãæããŸãã ãã®å€æã¯ç¢ºãã«æå¹ã§ãã ããã§ãå€ã®äœ¿çšããªãå Žåãç¡éã«ãŒããå®è¡ããé¢æ°ã®åŒã³åºãã¯ãããŸããã
å€ã®èšç®ã¯ãããããçºçããéããå€ã䜿çšããåã«ç§»åã§ããŸãã ããŠãå€ã䜿çšã§ããªããšãã蚌æ ãããã°ãããã¯åã«èµ·ãã£ãããšããªããšãã蚌æ ã§ãããã³ãŒãã¯ç¡éã«é ããŸã§ç§»åã§ããããã§ãã¡ã¢ãªã¢ãã«ãæºãããŸãã
ãã®ã¹ããŒãã¡ã³ãã¯ããã®èšç®ãçµäºããããšãä¿èšŒãããŠããå Žåã«ã®ã¿æ£ããã§ãã éçµäºã¯å¯äœçšã§ãããstdoutã«åºåããèšç®ãåé€ã§ããªãã®ãšåãããã«ïŒãçŽç²ã§ã¯ãªããïŒãçµäºããªãèšç®ãåé€ããããšã¯ã§ããŸããã
çµæã䜿çšãããŠããªãå Žåã§ãã次ã®é¢æ°åŒã³åºããåé€ããããšã¯ã§ããŸããã
fn sideeffect() -> u32 {
println!("Hello!");
42
}
fn main() {
let _ = sideffect(); // May not be removed.
}
ããã¯ããããçš®é¡ã®å¯äœçšã«åœãŠã¯ãŸããå°å·ç©ãloop {}
眮ãæããŠãåœãŠã¯ãŸããŸãã
å¯äœçšãšããŠã®éçµäºã«ã€ããŠã®äž»åŒµã¯ããããããã§ãããšããåæïŒã€ãŸããç©è°ãéžããã®ã§ã¯ãªãïŒã ãã§ãªããããããã€å®ãããã¹ããã«ã€ããŠã®åæãå¿ èŠãšããŸãã
ã«ãŒããå€ãèšç®ããå Žåãéçµäºã¯ç¢ºå®ã«èŠ³å¯ãããŸãã ã«ãŒãã®çµæã«äŸåããªãèšç®ã䞊ã¹æ¿ããããšãèš±å¯ãããŠããå Žåãéçµäºã¯èŠ³å¯ãããŸããã
LLVMã¹ã¬ããã®äŸã®ããã«ã
x = y % 42;
if y < 0 return 0;
...
éšéã®çµäºããããã£ã¯ã䞊ã¹æ¿ããšã¯äœã®é¢ä¿ããããŸããã ææ°ã®CPUã¯ãåå²ãæ¯èŒãåå²äºæž¬ãããã³æåããåå²ã®ããªãã§ããã䞊è¡ããŠå®è¡ããããšããŸãã ãããã£ãŠã y
ãè² ã®å Žåã 0
è¿ãããã®ã芳å¯ãããšãã«å®äºããé€ç®ã芳å¯ããããšã¯ä¿èšŒãããŸããã ïŒããã§ã芳å¯ããããšã¯ãããã°ã©ã ã§ã¯ãªããCPUã眮ãããŠãããªã·ãã¡ãŒã¿ãŒã§å®éã«æž¬å®ããããšãæå³ããŸãïŒ
åå²ãå®äºããããšã確èªã§ããªãå Žåãåå²ãéå§ãããããšã確èªããããšã¯ã§ããŸããã ãããã£ãŠãäžèšã®äŸã®é€ç®ã¯éåžžã䞊ã¹æ¿ããèš±å¯ãããŸããããã¯ãã³ã³ãã€ã©ãŒãå®è¡ããå¯èœæ§ã®ããããšã§ãã
if y < 0 return 0;
x = y % 42;
...
ãããèš±å¯ãããŠããªãèšèªããããããããªãã®ã§ãç§ã¯ãéåžžããšèšããŸãã Rustããã®ãããªèšèªã§ãããã©ããã¯ããããŸããã
çŽç²ãªã«ãŒããäŸå€ã§ã¯ãããŸããã
ç§ã¯ãããåé¡ã§ã¯ãªããšèšã£ãŠããã®ã§ã¯ãããŸããã ç§ãèšã£ãŠããã®ã¯ãåé²ä¿èšŒã¯ãããå¯èœã«ãããã®ã§ã¯ãªããšããããšã ãã§ãã
å¯äœçšãšããŠã®éçµäºã«ã€ããŠã®äž»åŒµã¯ããããããã§ãããšããåæïŒã€ãŸããç©è°ãéžããã®ã§ã¯ãªãïŒã ãã§ãªããããããã€èŠ³å¯ãããã¹ããã«ã€ããŠã®åæãå¿ èŠãšããŸãã
ç§ãè¡šçŸããŠããã®ã¯ãããã°ã©ãã³ã°èšèªãšã³ã³ãã€ã©ã®ç 究åéå šäœã®ã³ã³ã»ã³ãµã¹ã§ãã 確ãã«ããªãã¯èªç±ã«å察ããããšãã§ããŸããããããªããã³ã³ãã€ã©ã®æ£ãããã®ãããªçšèªãåå®çŸ©ããã»ããããã§ããã-ããã¯ä»ã®äººãšã®è°è«ã«ã¯åœ¹ç«ã¡ãŸããã
蚱容ããã芳枬å€ã¯ãåžžã«ãœãŒã¹ã¬ãã«ã§å®çŸ©ãããŸãã èšèªä»æ§ã¯ãæœè±¡ãã·ã³ããå®çŸ©ããŸããããã¯ãããã°ã©ã ã®èš±å®¹ããã芳å¯å¯èœãªåäœãäœã§ããããïŒçæ³çã«ã¯æ°åŠç詳现ã§ïŒèšè¿°ããŸãã ãã®ããã¥ã¡ã³ãã§ã¯ãæé©åã«ã€ããŠã¯èª¬æããŠããŸããã
次ã«ãã³ã³ãã€ã©ã®æ£ç¢ºãã¯ãã³ã³ãã€ã©ãçæããããã°ã©ã ãããœãŒã¹ããã°ã©ã ãæã€ããšãã§ãããšä»æ§ãè¿°ã¹ãŠãã芳å¯å¯èœãªåäœã®ã¿ã瀺ããã©ããã§æž¬å®ãããŸãã ããã¯ãæ£ç¢ºããçå£ã«åãæ¢ãããã¹ãŠã®ããã°ã©ãã³ã°èšèªãã©ã®ããã«æ©èœãããã§ãããã³ã³ãã€ã©ãŒãæ£ããå Žåã«æ£ç¢ºãªæ¹æ³ã§ãã£ããã£ããæ¹æ³ãç¥ãå¯äžã®æ¹æ³ã§ãã
åèšèªã®è²¬ä»»ã¯ããœãŒã¹ã¬ãã«ã§èŠ³å¯å¯èœãšèŠãªããããã®ãšããæªå®çŸ©ããšèŠãªãããããã³ã³ãã€ã©ã«ãã£ãŠçºçããªããšèŠãªããããœãŒã¹ã®åäœãæ£ç¢ºã«å®çŸ©ããããšã§ãã ãã®åé¡ã¯ãC ++ãä»ã®å¯äœçšïŒããµã€ã¬ã³ããã€ããŒãžã§ã³ã¹ãïŒã®ãªãç¡éã«ãŒãã¯æªå®çŸ©ã®åäœã§ãããšèšã£ãŠããããRustã¯ãã®ãããªããšãèšã£ãŠããªãããã«çºçããŸãã ããã¯ãRustã§ã®éçµäºãåžžã«ç£èŠå¯èœã§ãããã³ã³ãã€ã©ãŒã«ãã£ãŠä¿æãããå¿ èŠãããããšãæå³ããŸãã C ++ãéžæãããšãæªå®çŸ©ã®åäœïŒãããã£ãŠé倧ãªãã°ïŒãããã°ã©ã ã«èª€ã£ãŠå°å ¥ããããããªããããã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã§ãã®éžæãè¡ãããŸãã Rustã¯ãå®å šãªã³ãŒãããæªå®çŸ©ã®åäœãçºçããªãããšãçŽæããŸããå®å šãªã³ãŒãã«ã¯ç¡éã«ãŒããå«ãŸããå¯èœæ§ããããããRustã®ç¡éã«ãŒãã¯å®çŸ©ãããïŒãããã£ãŠä¿æãããïŒåäœã§ããå¿ èŠããããŸãã
ããããçŽããããå Žåã¯ãèæ¯ãèªãããšããå§ãããŸãã ãã³ãžã£ãã³ã»ãã¢ã¹ã®ãã¿ã€ããšããã°ã©ãã³ã°èšèªãããå§ãããŸãã èè ãå®éã«ã©ãã»ã©ååãªæ å ±ãæã£ãŠããããå€æããã®ã¯é£ãããããããŸããããããããããã«ã¯ããããã®ããã°æçš¿ããããŸãã
å ·äœçã«ã¯ãé€ç®ã®äŸã次ã®ããã«å€æŽããå Žå
x = 42 % y;
if y <= 0 { return 0; }
次ã«ãyããŒãã®å ŽåïŒã¯ã©ãã·ã¥ãããŒããè¿ãïŒã«èŠ³å¯å¯èœãªåäœãå€ãããããæ¡ä»¶ä»ããé€ç®ã®äžã«äžããããšãã§ããªãããšã«åæããŠããã ããã°å¹žãã§ãã
åãããã«ã
x = if y == 0 { loop {} } else { y % 42 };
if y < 0 { return 0; }
Rustæœè±¡ãã·ã³ã§ã¯ãããã次ã®ããã«æžãçŽãããšãã§ããŸãã
if y == 0 { loop {} }
else if y < 0 { return 0; }
x = y % 42;
ãã ããæåã®æ¡ä»¶ãšã«ãŒãã¯ç Žæ£ã§ããŸããã
ã©ã«ããç§ã¯ããªããããŠããããšã®ååãç¥ã£ãŠãããµããããŸããããããŠç§ã¯æ°ããæå³ã玹ä»ããããããŸããã ç§ã¯ãæ£ããã®å®çŸ©ã«å®å šã«åæããŸãïŒå®è¡é åºã¯ããã°ã©ã é åºã«å¯Ÿå¿ããŠããå¿ èŠããããŸãïŒã ç§ã¯ãéçµäºã芳å¯ã§ããããã€ãããã®äžéšã§ãããšæã£ãã ãã§ããã«ãŒãã®çµæãç£èŠããŠããªãå Žåããã®çµäºã®ç®æè ã¯ããªãïŒãããã£ãŠããã®äžæ£ç¢ºãã䞻匵ããããšã¯ã§ããŸããïŒã ã å®è¡ã¢ãã«ãåæ€èšããå¿ èŠããããŸãã
ãããããé¡ãããŸã
@zackwããããšãããããŸãã ããã¯å¥ã®ã³ãŒãã§ããããã¡ããå¥ã®æé©åã«ãªããŸãã
é€ç®ã«æ¬ é¥ãããã®ãšåãæ¹æ³ã§ã«ãŒããæé©åããããšããç§ã®åæïŒé€ç®ã®çµæãèŠãããšãã§ããªã==ã«ãŒãã®çµäºãèŠãããšãã§ããªãïŒãªã®ã§ãæ®ãã¯éèŠã§ã¯ãããŸããã
@olotenko ãã«ãŒãã®çµæãç£èŠããããšã¯ã©ãããæå³ãããããŸããã ã«ãŒããçµäºããªããšãããã°ã©ã å šäœãçºæ£ããŸããããã¯ã芳å¯å¯èœãªåäœãšèŠãªãããŸããã€ãŸããããã°ã©ã ã®å€éšã§èŠ³å¯å¯èœã§ãã ã®ããã«ããŠãŒã¶ãŒã¯ããã°ã©ã ãå®è¡ããŠããããæ°žé ã«ç¶ãããšã確èªã§ããŸãã æ°žä¹ ã«ç¶ãããã°ã©ã ã¯ããŠãŒã¶ãŒãããã°ã©ã ã«ã€ããŠèŠ³å¯ã§ããå 容ãå€æŽãããããçµäºããããã°ã©ã ã«ã³ã³ãã€ã«ãããªãå ŽåããããŸãã
ãã®ã«ãŒããäœãèšç®ããŠãããããŸãã¯ã«ãŒãã®ãæ»ãå€ãã䜿çšãããŠãããã©ããã¯é¢ä¿ãããŸããã éèŠãªã®ã¯ãããã°ã©ã ã®å®è¡æã«ãŠãŒã¶ãŒã芳å¯ã§ããããšã§ãã ã³ã³ãã€ã©ãŒã¯ããã®èŠ³å¯å¯èœãªåäœãåããŸãŸã§ããããšã確èªããå¿ èŠããããŸãã éçµäºã¯èŠ³å¯å¯èœãšèŠãªãããŸãã
å¥ã®äŸãæãããšïŒ
fn main() {
loop {}
println!("Hello");
}
ã«ãŒããããããããã®ããã°ã©ã ã¯äœãåºåããŸããã ããããã«ãŒããæé©åããå ŽåïŒãŸãã¯å°å·ã§ã«ãŒãã䞊ã¹æ¿ããå ŽåïŒãããã°ã©ã ã¯çªç¶ãHelloããå°å·ããŸãã ãããã£ãŠããããã®æé©åã¯ããã°ã©ã ã®èŠ³å¯å¯èœãªåäœãå€æŽããèš±å¯ãããŸããã
@RalfJungããã¯å€§äžå€«ã§ããç§ã¯ä»ãããæã«å ¥ããŸããã ç§ã®æåã®åé¡ã¯ãããã§ãåé²ä¿èšŒããã©ã®ãããªåœ¹å²ãæããããšããããšã§ããã æé©åã¯å®å šã«ããŒã¿äŸåæ§ããå¯èœã§ãã ç§ã®ééãã¯ãå®éã«ã¯ããŒã¿ã®äŸåé¢ä¿ã¯ããã°ã©ã ã®é åºã®äžéšã§ã¯ãªããšããããšã§ãããæåéããèšèªã®ã»ãã³ãã£ã¯ã¹ã«åŸã£ãŠå®å šã«é åºä»ããããåŒã§ãã ããã°ã©ã ã®é åºãåèšã®å Žåãåæ¹é²è¡ä¿èšŒïŒãããã°ã©ã ã®é åºã®ãµããã¹ã¯æéã§ããããšèšãæããããšãã§ããŸãïŒããªããã°ãçµäºãšããŠ_蚌æ_ã§ããåŒã®ã¿ãïŒå®è¡é åºã§ïŒäžŠã¹æ¿ããããšãã§ããŸãïŒããã³åæã¢ã¯ã·ã§ã³ãOSåŒã³åºããIOãªã©ã®å¯èŠ³æž¬æ§ãªã©ãä»ã®ããã€ãã®ããããã£ãä¿æããŸãã
ããå°ãèããå¿
èŠããããŸããã x = y % 42
ã®äŸã§ã¯ãäžéšã®å
¥åã«å¯ŸããŠå®éã«å®è¡ãããªããŠããé€ç®ãããµããã§ããçç±ãããããšæããŸãããåãããšãä»»æã®ã«ãŒãã«åœãŠã¯ãŸããªãçç±ã ã€ãŸããå
šäœïŒããã°ã©ã ïŒã®é åºãšéšåïŒå®è¡ïŒã®é åºã®å¯Ÿå¿ã®åŸ®åŠãã§ãã
ç¡éååž°ã¯ã¹ã¿ãã¯ãªãŒããŒãããŒã®ã¯ã©ãã·ã¥ïŒããŠãŒã¶ãŒãçµæã芳å¯ããããšããæå³ã§ãçµäºãïŒãåŒãèµ·ãããããã芳å¯å¯èœãªåäœãã¯ãããããå°ã埮åŠãããããŸããããæ«å°ŸåŒã³åºãã®æé©åãããéçµäºã«ãŒãã«å€ããŸãã å°ãªããšãããã¯ãRust / LLVMãè¡ããã1ã€ã®ããšã§ãã ããããããã¯ç§ã®åé¡ã®å 容ã§ã¯ãªãã®ã§ããã®è³ªåã«ã€ããŠè°è«ããå¿ èŠã¯ãããŸããïŒããªããæãã®ã§ãªãéãïŒãããæåŸ ããããã©ãããç解ããŠããããã§ãïŒã
ã¹ã¿ãã¯ãªãŒããŒãããŒ
ã¹ã¿ãã¯ãªãŒããŒãããŒã¯ç¢ºãã«ã¢ãã«åããã®ãé£ãããè¯ã質åã§ãã ã¡ã¢ãªäžè¶³ã®ç¶æ³ã§ãåãã§ãã æåã®æŠç®ãšããŠãç§ãã¡ã¯æ£åŒã«ããããèµ·ãããªããµããããŸãã ããè¯ãã¢ãããŒãã¯ãé¢æ°ãåŒã³åºããã³ã«ãã¹ã¿ãã¯ãªãŒããŒãããŒãåå ã§ãšã©ãŒãçºçããããããã°ã©ã ãç¶è¡ããå¯èœæ§ããããšèšãããšã§ããããã¯ãååŒã³åºãã§è¡ãããé決å®è«çãªéžæã§ãã ãã®ããã«ããŠãå®éã«äœãèµ·ãã£ãŠãããããã£ãããšæŠç®ã§ããŸãã
çµäºãšããŠèšŒæã§ããåŒã®ã¿ãïŒå®è¡é åºã§ïŒäžŠã¹æ¿ããããšãã§ããŸã
確ãã«ã ããã«ããããã¯ãçŽç²ãã§ããå¿
èŠããããŸããã€ãŸããå¯äœçšããªãå¿
èŠããããŸãã2ã€ã®println!
䞊ã¹æ¿ããããšã¯ã§ããŸããã ãã®ãããéåžžãéçµäºãå¹æãšèŠãªãããŸããããã¯ããã¹ãŠãçŽç²ãªåŒã䞊ã¹æ¿ããããšãã§ãããããéçµäºã®åŒã¯äžçŽã§ãããïŒäžçŽ=å¯äœçšãããïŒããã§ãã
é€ç®ãæœåšçã«äžçŽã§ããã0ã§é€ç®ããå Žåã«ã®ã¿ããããã¯ãã€ãŸãå¶åŸ¡å¹æãçºçããŸãã ããã¯çŽæ¥èŠ³å¯å¯èœã§ã¯ãªããéæ¥çã«èŠ³å¯å¯èœã§ãïŒããšãã°ããããã¯ãã³ãã©ãŒã«stdoutã«äœããåºåãããããã芳å¯å¯èœã«ããããšã«ãã£ãŠïŒã ãããã£ãŠãé€ç®ã¯ã0ã§é€ç®ããŠããªãããšã確å®ãªå Žåã«ã®ã¿äžŠã¹æ¿ããããšãã§ããŸãã
ãã®åé¡ã®å¯èœæ§ããããšæããããã¢ã³ãŒããããã€ããããŸãããå®å
šã«ã¯ããããŸããã å¿
èŠã«å¿ããŠããããæ°ãããã°ã¬ããŒãã«å
¥ããããšãã§ããŸãã
ãã®ã³ãŒããhttps://github.com/uglyoldbob/rust_demoã®gitãªããžããªã«é
眮ããŸãã
ç§ã®ç¡éã«ãŒãïŒå¯äœçšããïŒãæé©åããããã©ããåœä»€ãçæãããŸãã
ããããã®åé¡ã®ã€ã³ã¹ã¿ã³ã¹ãªã®ãä»ã®äœããªã®ãããããŸãã...çµã¿èŸŒã¿ããã€ã¹ã¯ç§ã®å°éã§ã¯ãªããããããã¹ãŠã®å€éšã¯ã¬ãŒãäŸåé¢ä¿ãããããããã®ã³ãŒããä»ã«äœãããŠããã®ãããããŸããã^^ããããããªãã®ããã°ã©ã ã¯å®å šã§ã¯ãªããã«ãŒãå ã§æ®çºæ§ã®ã¢ã¯ã»ã¹ããããããå¥ã®åé¡ã ãšæããŸãã ããªãã®äŸãéã³å Žã«
ã«ãŒãå ã®ãã¹ãŠãããŒã«ã«å€æ°ãžã®åç §ã§ããããã§ãïŒä»ã®ã¹ã¬ããã«ãšã¹ã±ãŒãããããã®ã¯ãããŸããïŒã ãã®ãããªç¶æ³ã§ã¯ãæ®çºæ§ã®ã¹ãã¢ããªãã芳å¯å¯èœãªåœ±é¿ããªãããšãç°¡åã«èšŒæã§ããŸãïŒåæã§ããã¹ãã¢ããããŸããïŒã Rustãæ®çºæ§ç©è³ªã«ç¹å¥ãªæå³ãè¿œå ããªãå Žåããã®ã«ãŒãã¯çŽç²ãªç¡éã«ãŒãã«æžããããšãã§ããŸãã
@uglyoldbob llvm-objdump
ãèŠäºã«åœ¹ã«ç«ããªãã£ãïŒãããŠäžæ£ç¢ºã ã£ãïŒå Žåãããªãã®äŸã§å®éã«èµ·ãã£ãŠããããšã¯ããæ確ã«ãªããŸãã ããã§ã®bl #4
ïŒå®éã«ã¯æå¹ãªã¢ã»ã³ããªæ§æã§ã¯ãããŸããïŒã¯ã bl
åœä»€ã®çµäºåŸãå¥åmain
é¢æ°ã®çµäºåŸã®4ãã€ããžã®åå²ãæå³ããŸãã次ã®æ©èœã®éå§ã 次ã®é¢æ°ã¯ïŒç§ããã«ããããšãã«ïŒ _ZN11broken_loop18__cortex_m_rt_main17hbe300c9f0053d54dE
ãšåŒã°ãããããå®éã®main
é¢æ°ã§ãã ãã³ã°ã«ãããŠããªãååmain
é¢æ°ã¯ããªãã®é¢æ°ã§ã¯ãããŸãããã cortex-m-rt
ã«ãã£ãŠæäŸããã#[entry]
ãã¯ãã«ãã£ãŠçæãããå®å
šã«ç°ãªãé¢æ°ã§ãã ã³ãŒãã¯å®éã«ã¯æé©åãããŠããŸããã ïŒå®éããããã°ã¢ãŒãã§ãã«ãããŠããããããªããã£ãã€ã¶ãŒã¯å®è¡ãããŠããŸãããïŒ
æãåèã«ãªãã³ã¡ã³ã
https://github.com/rust-lang/rust/pull/59546ã®@sfanxiangã«ãã£ãŠè¿œå ããã
-Z insert-sideeffect
rustcãã©ã°ã䜿çšãããšãã«ãŒããç¶ããŸã:)åïŒ
åŸïŒ