Rust: LLVM ๋ฃจํ”„ ์ตœ์ ํ™”๋Š” ์•ˆ์ „ํ•œ ํ”„๋กœ๊ทธ๋žจ ์ถฉ๋Œ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 09์›” 29์ผ  ยท  97์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

๋‹ค์Œ ์Šค ๋‹ˆํŽซ์€ ํ˜„์žฌ ์•ˆ์ •, ๋ฒ ํƒ€ ๋ฐ ์•ผ๊ฐ„์—์„œ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ๋กœ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ https://github.com/simnalamburt/snippets/blob/12e73f45f3/rust/infinite.rs ๋ผ๋Š” ๋ฃจํ”„๋ฅผ ์ œ๊ฑฐํ•˜๋Š” LLVM์˜ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค
C๋Š” LLVM์ด ๋ถ€์ž‘์šฉ์ด์—†๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋ฌด์žฅํ•ด์•ผํ•˜๋Š” match ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

A-LLVM C-bug E-medium I-needs-decision I-unsound ๐Ÿ’ฅ P-medium T-compiler WG-embedded

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

๋ˆ„๊ตฐ๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ฝ”๋“œ ๊ณจํ”„๋ฅผํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ :

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

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

์ตœ์ ํ™” ๋œ ์ฝ”๋“œ์˜ LLVM IR์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

; 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://lists.llvm.org/pipermail/llvm-dev/2015-July/088095.html

๋ถ„๋ฅ˜ : ๋‚ด๊ฐ€ ์ง€๋ช…

๋‚˜์˜๋‹ค! LLVM์ด "์˜ˆ,์ด ๋ฃจํ”„๋Š” ์ •๋ง ๋ฌดํ•œํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ์ƒ๋ฅ˜ ํ† ๋ก ์ด ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ ์•‰์•„์„œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ์ตœ์ ํ™”๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ ์•ˆ์— unsafe {asm!("" :::: "volatile")} ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ LLVM ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ์— ์ œ์•ˆ ๋œ llvm.noop.sideeffect ๋‚ด์žฅ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ผ๋ถ€ ์ตœ์ ํ™”๋ฅผ ๋ฐฉํ•ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ฑ๋Šฅ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ถ„๊ธฐ ํ•จ์ˆ˜ / ๋ฃจํ”„๊ฐ€ ์ตœ์ ํ™”๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด, ๋ฌด์ธ ๊ฐ’์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋นˆ ์ตœ์ ํ™” ํ•  ์ˆ˜์—†๋Š” ๋ฃจํ”„ (์˜ˆ : loop { unsafe { asm!("" :::: "volatile") } } )๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„.
LLVM์ด ๋” ์ด์ƒ ๋ฐœ์‚ฐํ•˜์ง€ ์•Š๋Š” ์ง€์ ์œผ๋กœ ๋ฐœ์‚ฐํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ฃจํ”„๋Š” ์ œ์–ด ํ๋ฆ„์„ ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
LLVM์ด ๋ฐœ์‚ฐ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™” ํ•  ์ˆ˜์—†๋Š” "์šด์ด ์ข‹์€"๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ๋ฃจํ”„๋Š” DCE์— ์˜ํ•ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

# 18785์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? UB๊ฐ€๋˜๋Š” ๊ฒƒ์€ ๋ฌดํ•œ ์žฌ๊ท€์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ ๋น„์Šทํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LLVM์€ ์ค‘์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ถ€์ž‘์šฉ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•จ์ˆ˜์— ์ค‘์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ๋ถ€์ž‘์šฉ์ด์—†๋Š” ๊ฒฝ์šฐ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฉ€๋ฆฌ.

ํ—‰

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๊ฐ™์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋ฅผ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด undef ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ ์ฃผ๋ฉฐ, (๊ฒ‰๋ณด๊ธฐ์— ์•ˆ์ „ํ•œ) ํ”„๋กœ๊ทธ๋žจ ์ถฉ๋Œ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

: +1 :

์ถฉ๋Œ, ๋˜๋Š” ์‹ฌ์žฅ ์ถœํ˜ˆ์ด ๋” ์‹ฌํ•  ์ˆ˜ ์žˆ์Œ https://play.rust-lang.org/?gist=15a325a795244192bdce&version=stable

๊ทธ๋ž˜์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„๋ณด๊ณ ํ•˜๊ธฐ๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ๊ฑธ ๋ ธ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. :) ๋‚ด ์ƒ๊ฐ์— ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์€ LLVM์—๊ฒŒ ์ž ์žฌ์ ์œผ๋กœ ๋ฌดํ•œ ๋ฃจํ”„์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊ณต๊ฒฉ์ ์ด์ง€ ์•Š๋„๋ก ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์ผ์€ Rust ์ž์ฒด์—์„œ ๋ณด์ˆ˜์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋‹ค์Œ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค ๋˜๋Š”
  2. ๋ฃจํ”„์—๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค (I / O ์ž‘์—… ๋“ฑ, ์ด๊ฒƒ์ด C์—์„œ ์–ด๋–ป๊ฒŒ ์ •์˜๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์žŠ์–ด ๋ฒ„๋ฆผ)

์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ํ”ผํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜ : P- ์ค‘๊ฐ„

์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ธฐ ์ „์— 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 ์€ LLVM IR์—์„œ ๋ฌดํ•œ ๋ฃจํ”„์˜ ์˜๋ฏธ๋ก ์— ๋Œ€ํ•œ ์ •ํ™•ํ•˜๊ณ  ๋ช…์‹œ์ ์ธ ์‚ฌ์–‘์ด์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—ญ์‚ฌ์  ์ด์œ ์™€ ํŽธ์˜๋ฅผ ์œ„ํ•ด C ++์˜ ์˜๋ฏธ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค (๋‚˜๋Š” ๋ถ„๋ช…ํžˆ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” https://groups.google.com/forum/#!topic/llvm-dev/j2vlIECKkdE ๋งŒ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ์ตœ์ ํ™”๋˜์ง€ ์•Š์•˜์„ ๋•Œ C / C ++ ์‚ฌ์–‘์ด์ด๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์–ผ๋งˆ ์ „).

์Šค๋ ˆ๋“œ์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ๊ณผ์ ์œผ๋กœ C ++ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ์š•๊ตฌ๊ฐ€ ์žˆ์Œ์ด ๋ถ„๋ช…ํ•˜์ง€๋งŒ (์ฆ‰, ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์ œ๊ฑฐ ํ•  ๊ธฐํšŒ๋„ ๊ณ ๋ ค) ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž (LLVM์— ์ ๊ทน์ ์œผ๋กœ ๊ธฐ์—ฌํ•˜๋Š” ์ผ๋ถ€ ํฌํ•จ)๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์— ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

@ ranma42์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์€ ๋…น์—์„œ ์ด๋Ÿฌํ•œ ๋ฃจํ”„๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  LLVM์ด์ด ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์œ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฑด์ „์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, @ ranma42 ์˜ ์˜ˆ์— ๋ฌดํšจํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋†€์ดํ„ฐ ๋งํฌ

๋ธ”๋ฃจ์Šค

์ •์ฑ…์€ ๊ฑด์ „์„ฑ ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•œ ์ž˜๋ชป๋œ ์ฝ”๋“œ ๋ฌธ์ œ (์ฆ‰, ๋Œ€๋ถ€๋ถ„)์— I-wrong ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์ „ ๋…ผ์˜๋ฅผ ์š”์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์„ ํƒ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • LLVM์ด ์†”๋ฃจ์…˜์„ ์ œ๊ณต ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.
  • ๋ฌดํ•œ ๋ฃจํ”„ ๋˜๋Š” ๋ฌดํ•œ ์žฌ๊ท€๊ฐ€์žˆ์„ ์ˆ˜์žˆ๋Š” ๊ณณ์— no-op asm ๋ฌธ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค (# 18785).

ํ›„์ž๋Š” ์ตœ์ ํ™”๋ฅผ ๋ฐฉํ•ด ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ๋‚˜์˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ข…๋ฃŒ๋ฅผ ์Šค์Šค๋กœ ์ฆ๋ช…ํ•  ์ˆ˜์—†๋Š” ๊ณณ์—์„œ ์กฐ๊ธˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ 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 ๋Š” ์ƒ์ˆ˜ ํ‘œํ˜„์‹์ด๋ฏ€๋กœ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .

๋ฃจํ”„ ์ œ๊ฑฐ๋Š” ๋‹จ์ˆœํžˆ ์ œ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ์ตœ์ ํ™” ๋‹จ๊ณ„์ž…๋‹ˆ๊นŒ?

๋ฟก๋ฟก

LLVM์˜ bugzilla์—์„œ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ์ฐพ์•˜๊ฑฐ๋‚˜ ์ฑ„์› ์Šต๋‹ˆ๊นŒ? C ++ ๋ฌดํ•œ ๋ฃจํ”„์—์„œ _can_ ๊ฒฐ์ฝ” ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ๋™์ž‘์€ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด์ง€๋งŒ C์—์„œ๋Š” ์ •์˜ ๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค (์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ํ•  ์ˆ˜ ์—†์Œ).

@gnzlbg ์ง€๊ธˆ ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://llvm.org/bugs/show_bug.cgi?id=31217

# 42009์—์„œ ๋ฐ˜๋ณต :์ด ๋ฒ„๊ทธ๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๊ฐ€ ์ „ํ˜€ ํฌํ•จ๋˜์ง€ ์•Š์€ ์™ธ๋ถ€ ํ˜ธ์ถœ ๊ฐ€๋Šฅ ํ•จ์ˆ˜๋ฅผ ๋ฐฉ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ์ฝ” ์ผ์–ด๋‚˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. LLVM์ด pub fn ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ถ”๋ก ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์œผ๋กœ ์ ์–ด๋„ ํŠธ๋žฉ ๋ช…๋ น์„ ๋‚ด ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ค๋Š˜์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค : https://blog.rom1v.com/2017/09/gnirehtet-rewritten-in-rust/

๋” ๊ฐ„๋‹จํ•œ ๋ณต์ œ : https://play.rust-lang.org/?gist=e622f8a672fbc57ecc63eb4450d2fc0a&version=stable

์ด์— ๋Œ€ํ•œ LLVM ๋ฒ„๊ทธ๋Š” https://bugs.llvm.org/show_bug.cgi?id=965(2006 ๋…„์— ์—ด๋ฆผ)์ž…๋‹ˆ๋‹ค.

@zackw LLVM์—๋Š” TrapUnreachable ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ LLVMRustCreateTargetMachine Options.TrapUnreachable = true; ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ธก์ •์„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ์„๋งŒํผ ๋น„์šฉ์ด ์ถฉ๋ถ„ํžˆ ๋‚ฎ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@ oli-obk ๋ถˆํ–‰ํžˆ๋„ ๋‹จ์ˆœํ•œ ๋ฃจํ”„ ์‚ญ์ œ ํŒจ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด‘๋ฒ”์œ„ํ•œ ๊ฐ€์ •์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://reviews.llvm.org/D38336

@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์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจ์น˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ์ •์˜ ๋œ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋„๋กํ•˜๋Š” ํ›„์† ํŒจ์น˜๋ฅผ ํฌํ•จ ํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ AFAICT๋Š” ๋Œ€๊ธฐ๋งŒํ•˜๋ฉด๋˜๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์—…์ŠคํŠธ๋ฆผ์—์„œ ํ•ด๊ฒฐ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@zackw ์ด์ œ ์ฝ”๋“œ๊ฐ€์—†๋Š” ํ•จ์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด # 45920์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

@bstrie ์˜ˆ, ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ LLVM์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์˜ ๋œ ๋™์ž‘์„ ๋ฌดํ•œ ๋ฃจํ”„๋กœ ์ œ๊ณตํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด์ง€ ์•„์ง ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์— ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ด๊ฒƒ์„ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค : https://play.rust-lang.org/?gist=529bd5ab326f7b627e559f64d514312f&version=stable

@jsgf ์—ฌ์ „ํžˆ ์žฌํ˜„. ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•˜์…จ์Šต๋‹ˆ๊นŒ?

@kennytm ์›์Šค, ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ.

https://reviews.llvm.org/rL317729 ๊ฐ€ LLVM์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจ์น˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ์ •์˜ ๋œ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋„๋กํ•˜๋Š” ํ›„์† ํŒจ์น˜๋ฅผ ํฌํ•จ ํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ AFAICT๋Š” ๋Œ€๊ธฐ๋งŒํ•˜๋ฉด๋˜๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์—…์ŠคํŠธ๋ฆผ์—์„œ ํ•ด๊ฒฐ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฐœ์–ธ ์ดํ›„ ๋ช‡ ๋‹ฌ์ด ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ›„์† ํŒจ์น˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ณ„์† ๋ฐœ์ƒํ•  ๊ฒƒ์ธ์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜๋Š” llvm.sideeffect ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” 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์—์„œ ์•ˆ์ •์ ์œผ๋กœ segfault๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋ชจ๋“  ์œ ํ˜•์˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด ์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋Š” ๋†€์ดํ„ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

@SergioBenitez ๊ทธ ํ”„๋กœ๊ทธ๋žจ์€ segfault๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค (๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•จ). ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌดํ•œํ•œ ์–‘์˜ ์Šคํƒ ๊ณต๊ฐ„์„ ์š”๊ตฌํ•˜์—ฌ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ์‹œ์ ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํƒ ๊ณต๊ฐ„์„ ์ดˆ๊ณผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ์ž‘์—… ์˜ˆ .

๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ LLVM์€ ๋ฌดํ•œ ์žฌ๊ท€๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ ์ด๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค ( mwe ). ์ด๊ฒƒ์€ ๋ฃจํ”„ AFAICT์™€ ๊ด€๋ จ์ด ์—†์ง€๋งŒ https://stackoverflow.com/a/5905171/1422197 ๊ณผ ๊ด€๋ จ์ด

@gnzlbg ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ segfault๋Š” ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ „์ฒด ์š”์ ์ž…๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋Š” LLVM๊ณผ Rust์˜ ์˜๋ฏธ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ์œ ํ˜•๊ฐ„์— ์ž„์˜๋กœ ์บ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” rustc๋กœ ์•ˆ์ „ํ•œ Rust ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ์˜๋ฏธ. ์ด ์Šค๋ ˆ๋“œ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋„ segfault๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋˜ํ•œ ์—ฌ๊ธฐ์„œ ์ผ์–ด๋‚˜๋Š” _ ๋‹ค๋ฅธ _, ๋น„-๋ฃจํ”„ ์ตœ์ ํ™”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ํฌ์ง€ ์•Š์ง€๋งŒ, ๊ทธ๋Ÿด ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์—๋Š” LLVM์ด ๊ผฌ๋ฆฌ ์žฌ๊ท€๋ฅผ ์ธ์‹ํ•˜๊ณ  ๋ฌดํ•œ ๋ฃจํ”„๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์‹œ ์ตœ์ ํ™” ํ•˜์—ฌ์ด ๋ฌธ์ œ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@gnzlbg ๊ธ€์Ž„, ๋ฌดํ•œ ์žฌ๊ท€์—์„œ ์ตœ์ ํ™”์˜ mwe๋ฅผ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•˜๋ฉด ( ์—ฌ๊ธฐ ), NonZeroUsize ์˜ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค (์ด๋Š” ... 0์ด๋ฏ€๋กœ ์ž˜๋ชป๋œ ๊ฐ’).

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ @SergioBenitez ๊ฐ€ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ segfault๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ทธ๋“ค์˜ ์˜ˆ์ œ์—์„œ๋„ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

@SergioBenitez ํ”„๋กœ๊ทธ๋žจ์— ๋””๋ฒ„๊ทธ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ชจ๋‘์—์„œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ์žˆ๋‹ค๋Š”

๊ทธ๋ ‡๋‹ค๋ฉด @SergioBenitez ์˜ˆ์ œ์—์„œ loop ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ ์šฉ ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค (์ด ๋ฌธ์ œ๋Š” ๊ฒฐ๊ตญ ๋ฌดํ•œํ•œ loop s์ž…๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ loop ๋ฅผ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด LLVM์€ ๋ฌดํ•œ ์žฌ๊ท€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ (๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฒฐ๊ตญ ์ข…๋ฃŒ๋œ๋‹ค๊ณ  ๊ฐ€์ •), ์ด๋Š”์ด ๋ฌธ์ œ์™€๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” LLVM์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ ํ™” ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด ์ƒ์„ฑ ๋œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•˜์ง€๋งŒ segfault๊ฐ€ ๋ชจ๋“  ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด segfault๊ฐ€ ๊ฑด์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ํŠนํžˆ (์Šคํƒ ํƒ์ƒ‰ + ์Šคํƒ ์ข…๋ฃŒ ํ›„ ๋งคํ•‘๋˜์ง€ ์•Š์€ ๊ฐ€๋“œ ํŽ˜์ด์ง€์— ์˜ํ•ด) ํฌ์ฐฉ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋„ segfault๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์„ธ๊ทธ ํดํŠธ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ์ด๋‚˜ ๊ฑฐ์นœ ์“ฐ๊ธฐ / ์ฝ๊ธฐ ๋˜๋Š” ๊ธฐํƒ€ ๊ฑด์ „์„ฑ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@rkruppe ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๊ณ  ์ดํ›„์— ์ฐธ์กฐ๋ฅผ ์ฝ์—ˆ ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ํ”„๋กœ๊ทธ๋žจ์ด segfault๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ๋Œ€์‹  ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์†Œํ•˜๊ฒŒ ์ˆ˜์ • ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š๊ฒŒ _particular_ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gnzlbg ํ”„๋กœ๊ทธ๋žจ์€ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ _ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค _. ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ 0์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์Šคํƒ์€ ์ˆœ์ „ํžˆ ๋กœ์ปฌ์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ํ•œ์ •๋œ ํšŸ์ˆ˜๋กœ ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ? ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ fn foo() { foo() } ์ธ ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์ด LLVM์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฌดํ•œ ์žฌ๊ท€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ fn foo () {foo ()} ์ธ ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์ด LLVM์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฌดํ•œ ์žฌ๊ท€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์™œ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ ์žฌ๊ท€ ๋ฐ ๋ฃจํ”„ UB๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ตœ์ ํ™”ํ•˜๋Š” LLVM์€ Rust์—์„œ ์•ˆ์ „ํ•˜์ง€๋งŒ์ด ์ „์ฒด ๋ฌธ์ œ์˜ ์š”์ ์ž…๋‹ˆ๋‹ค!

https://reviews.llvm.org/rL317729์˜ ์ž‘์„ฑ์ž๋Š” ์•„์ง ํ›„์† ํŒจ์น˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜ ์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ฃจํ”„๊ฐ€ ์ตœ์ ํ™”๋˜์ง€ ์•Š๋„๋ก ์˜ค๋Š˜ @llvm.sideeffect ํ˜ธ์ถœ์„ ์‚ฝ์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ถ€ ์ตœ์ ํ™”๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ก ์ ์œผ๋กœ๋Š” ์ฃผ์š” ์ตœ์ ํ™”๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์œผ๋ฏ€๋กœ ๋„ˆ๋ฌด ๋งŽ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. @llvm.sideeffect ํ˜ธ์ถœ์„ ๋ชจ๋“  ๋ฃจํ”„ ๋˜๋Š” ๋ฃจํ”„๋กœ ๋ฐ”๋€” ์ˆ˜์žˆ๋Š” ๊ฒƒ๋“ค (์žฌ๊ท€, ํ’€๊ธฐ, ์ธ๋ผ์ธ asm , ๊ธฐํƒ€?)์— ๋„ฃ์œผ๋ฉด ์ด๋ก ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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

์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ์†Œ์žฌ์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์žฌ๊ท€

#[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, ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์ปดํŒŒ์ผ, LLVM IR๋ณด๊ธฐ.

์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€ (ํŠน์„ฑ ๊ฐ์ฒด, C FFI ๋“ฑ)๋ฅผ ๊ฐ์ง€ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ํ˜ธ์ถœ์ด ์ฆ๋ช…๋˜์ง€ ์•Š๋Š” ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ llvm.sideeffect ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋Š” ์žฌ๊ท€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. fn main() { main() } ์™€ ๊ฐ™์€ ๊ฐ€์žฅ ์‚ฌ์†Œํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ž…์ฆ ๋  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์žฌ๊ท€๊ฐ€ ์—†์Œ์„ ์ฆ๋ช…ํ•˜๋ ค๋ฉด ์ ˆ์ฐจ ๊ฐ„ ๋ถ„์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋Œ€์ฒด ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@gnzlbg ๋งž์Šต๋‹ˆ๋‹ค . ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ํ•ญ๋ชฉ์— @ llvm.sideeffects๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ @SergioBenitez 'ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ SEGFAULT๋ฅผ ๋กœ์ปฌ์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์–ด์•ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? "์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ"์ •๋„๋ฅผ ์ธ์‡„ ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ํ–ˆ์Šต๋‹ˆ๊นŒ?

@RalfJung ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ? (๋‚ด ์ปดํ“จํ„ฐ์™€ ํ”Œ๋ ˆ์ด ๊ทธ๋ผ์šด๋“œ์˜ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋ฅผ ์ฑ„์›Œ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค). --release ์—์„œ๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป ์ตœ์ ํ™” ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


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

ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ํ•ญ๋ชฉ์— @ 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์„ ์ณ๋‹ค ๋ณด๋ฉด ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ segfaults, ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์„ธ๊ทธ ํดํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ "์ตœ์ ํ™”"ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์ด ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋˜๋ฉด UB๋ฅผ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” LLVM ๋ผ์ด์„ผ์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์„ธ๊ทธ ํดํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ "์ตœ์ ํ™”"ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

C์—์„œ ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ, ํœ˜๋ฐœ์„ฑ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค, I / O ๋˜๋Š” ๋™๊ธฐํ™” ์›์ž ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. LLVM-IR์ด ์šฐ์—ฐํžˆ ๋˜๋Š” ์˜๋„์ ์œผ๋กœ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋„๋ก ์ง„ํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋†€๋ž์Šต๋‹ˆ๋‹ค.

Rust ์ฝ”๋“œ์—๋Š” ์ ˆ๋Œ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ์‹คํ–‰ ์Šค๋ ˆ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ C์—์„œ UB๊ฐ€ ์•„๋‹Œ ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๊ฐ€์ง„ C ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋™์ผํ•œ LLVM-IR์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. , ๊ทธ๋ž˜์„œ LLVM์ด์ด Rust ํ”„๋กœ๊ทธ๋žจ์„ ์ž˜๋ชป ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋†€๋ž์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ segfaults, ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅธ๋‹ค.

LLVM์€ ๋ฌดํ•œ ์žฌ๊ท€๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ @SergioBenitez๊ฐ€ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ—ˆ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ดํ›„์— ์ฐธ์กฐ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let x = Container::from("hello");  // invalid reference created here
println!("{} {}", x.string, x.num);  // invalid reference dereferenced here

์—ฌ๊ธฐ์„œ Container::from ๋Š” ๋ฌดํ•œ ์žฌ๊ท€๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  LLVM์€ ๊ฒฐ์ฝ” ์ผ์–ด๋‚  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๊ณ  ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด ํ•œ ๋‹ค์Œ ์—ญ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž˜๋ชป ์ตœ์ ํ™”๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://rust.godbolt.org/z/P7Snex ๋†€์ดํ„ฐ์—์„œ (https://play.rust-lang.org/?gist=f00d41cc189f9f6897d429350f3781ec&version=stable&mode = release & edition = 2015)์ด ์ตœ์ ํ™”๋กœ ์ธํ•ด ๋””๋ฒ„๊ทธ ๋นŒ๋“œ์™€ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‹ค๋ฅธ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ UB๋Š” UB๊ฐ€ UB์ž…๋‹ˆ๋‹ค.

Rust ์ฝ”๋“œ์—๋Š” ์ ˆ๋Œ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ์‹คํ–‰ ์Šค๋ ˆ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ C์—์„œ UB๊ฐ€ ์•„๋‹Œ ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ๊ฐ€์ง„ C ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋™์ผํ•œ LLVM-IR์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. , ๊ทธ๋ž˜์„œ LLVM์ด์ด Rust ํ”„๋กœ๊ทธ๋žจ์„ ์ž˜๋ชป ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋†€๋ž์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ ‡๋‹ค๋ฉด ์ข‹์€ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” IR์— llvm.sideffect ๋ฅผ ๋ฟŒ๋ ค์„œ ๋ฒค์น˜ ๋งˆํฌ๋ฅผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

C์—์„œ ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ, ํœ˜๋ฐœ์„ฑ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค, I / O ๋˜๋Š” ๋™๊ธฐํ™” ์›์ž ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

Btw, ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ€์ž‘์šฉ์„ ํฌํ•จํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ƒ์ˆ˜ ์กฐ๊ฑด (์˜ˆ : while (true) { /* ... */ } ) ์ด ์žˆ๋Š” ๋ฃจํ”„๋Š” ํ‘œ์ค€์—์„œ ๋ช…์‹œ ์ ์œผ๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C ++์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. LLVM์€ ์—ฌ๊ธฐ์„œ C ํ‘œ์ค€์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฌดํ•œ ๋ฃจํ”„ ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์œ„์—์„œ ์ฃผ์žฅํ–ˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๋น„ ์ข…๋ฃŒ Rust ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์€ ํ•ญ์ƒ ์ •์˜๋˜๋Š” ๋ฐ˜๋ฉด ๋น„ ์ข…๋ฃŒ LLVM-IR ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์€ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ƒ์„ฑ ๋œ LLVM-IR์˜ ๋™์ž‘์ด ์ •์˜๋˜๋„๋ก ๋ฌดํ•œ ๋ฃจํ”„์— ๋Œ€ํ•œ Rust์˜ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•ด @llvm.sideeffect ๋Š” ๊ฝค ์ข‹์€ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ ธ์Šต๋‹ˆ๋‹ค.

@SergioBenitez ๋Š” ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„ ์ข…๊ฒฐ Rust ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜๋„ @rkruppe ๋Š” ๋ฌดํ•œ ์žฌ๊ท€์™€ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋™๋“ฑํ•˜๋ฏ€๋กœ ๋‘˜ ๋‹ค ๋™์ผํ•œ ๋ฒ„๊ทธ

๋‚˜๋Š”์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๊ด€๋ จ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ๊ฐ™์€ ๋ฒ„๊ทธ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‚˜์—๊ฒŒ๋Š”์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ์†”๋ฃจ์…˜ ์ธก๋ฉด์—์„œ๋Š” ์ตœ์ ํ™” ์žฅ๋ฒฝ ( @llvm.sideeffect )์„ ๋น„ ์ข…๋ฃŒ ๋ฃจํ”„์—๋งŒ ์ ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋‹จ์ผ Rust ํ•จ์ˆ˜์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์†”๋ฃจ์…˜ ์ธก๋ฉด์—์„œ ์šฐ๋ฆฌ๋Š” ์ตœ์ ํ™” ์žฅ๋ฒฝ (@ llvm.sideeffect)์„ ๋น„ ์ข…๋ฃŒ ๋ฃจํ”„์—๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์—์„œ ๋ชจ๋“  ๋‹จ์ผ Rust ํ•จ์ˆ˜์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„ ์‚ฌ๊ฑด์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด, ์‚ฝ์ž…ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด์•ผํ•œ๋‹ค llvm.sideeffect ์— loop { ... } ๋ฐ while <compile-time constant true> { ... } ๊ณณ์—๋Š” ๋ฃจํ”„์˜ ๋ชธ์ด ๋” ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค break ํ‘œํ˜„์‹. ์ด๊ฒƒ์€ ๋ฌดํ•œ ๋ฃจํ”„์— ๋Œ€ํ•œ C ++ ์‹œ๋งจํ‹ฑ๊ณผ Rust ์‹œ๋งจํ‹ฑ์˜ ์ฐจ์ด๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. Rust์—์„œ๋Š” C ++์™€ ๋‹ฌ๋ฆฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฃจํ”„๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— _doesn't_ ์•Œ ์ˆ˜์žˆ์„ ๋•Œ ์ข…๋ฃŒ๋œ๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์‹ ์ฒด๊ฐ€ ๋‹นํ™ฉ ํ•  ์ˆ˜์žˆ๋Š” ๋ฃจํ”„์˜ ์ •๋ฉด์—์„œ ์ •ํ™•์„ฑ์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๊ฑฑ์ •ํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

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

ํ—‰

๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋ฌดํ•œ ๋ฃจํ”„ ์ผ€์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด llvm.sideeffect๋ฅผ ๋ฃจํ”„ {...}์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.{...} ๋ฃจํ”„์˜ ๋ณธ๋ฌธ์— break ํ‘œํ˜„์‹์ด ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด loop { if false { break; } } ๋Š” break ํ‘œํ˜„์‹์ด ํฌํ•จ ๋œ ๋ฌดํ•œ ๋ฃจํ”„์ด์ง€๋งŒ llvm์ด ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก @llvm.sideeffect ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. AFAICT ์šฐ๋ฆฌ๋Š” ๋ฃจํ”„๊ฐ€ ํ•ญ์ƒ ์ข…๋ฃŒ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด @llvm.sideeffect ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก

loop { if false { break; } } ๋Š” break ํ‘œํ˜„์‹์„ ํฌํ•จํ•˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„์ด์ง€๋งŒ llvm์ด์ด๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก @llvm.sideeffect ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ , ์˜ˆ, ๊ทธ๊ฑฐ ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” _ ์™„๋ฒฝ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ณด์ˆ˜์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฃจํ”„

while spinlock.load(Ordering::SeqCst) != 0 {}

( std::sync::atomic ๋ฌธ์„œ์—์„œ) ์ œ์–ด ์กฐ๊ฑด์ด ์ผ์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— @llvm.sideeffect ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์›์ž๋กœ๋“œ ์ž‘์—…์ด LLVM ๋ชฉ์ ์˜ ๋ถ€์ž‘์šฉ์œผ๋กœ ๋” ์ž˜ ๊ณ„์‚ฐ ๋จ). , ๋˜๋Š” ์šฐ๋ฆฌ๋Š” ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค). ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑ๊ธฐ์— ์˜ํ•ด ๋ฐฉ์ถœ ๋  ์ˆ˜์žˆ๋Š” ์œ ํ•œ ๋ฃจํ”„์˜ ์ข…๋ฅ˜,

loop {
    if /* runtime-variable condition */ { break }
    /* more stuff */
}

๋˜ํ•œ ๊ท€์ฐฎ์•„์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, "๋ฃจํ”„ ๋ณธ๋ฌธ์— ์ค‘๋‹จ ์‹ ์—†์Œ"๊ทœ์น™์ด ์ž˜๋ชป๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? _besides_

loop {
    if /* provably false at compile time */ { break }
}

?

์ด ๋ฌธ์ œ๋Š” ์ƒ์„ฑ ๋œ LLVM-IR์˜ ๋™์ž‘์ด ์ •์˜๋˜๋„๋ก ๋ฌดํ•œ ๋ฃจํ”„์— ๋Œ€ํ•œ Rust์˜ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•ด @ llvm.sideeffect๋Š” ๊ฝค ์ข‹์€ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ ธ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ๊ทธ๋Ÿฌ๋‚˜ ๋งํ–ˆ๋“ฏ์ด ๋ฌธ์ œ (Rust ์˜๋ฏธ๋ก ๊ณผ LLVM ์˜๋ฏธ๋ก  ๊ฐ„์˜ ๋ถˆ์ผ์น˜)๋Š” ์‹ค์ œ๋กœ ๋ฃจํ”„๊ฐ€ ์•„๋‹ˆ๋ผ ๋น„ ์ข…๋ฃŒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ถ”์ ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ—‰

๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋ฌดํ•œ ๋ฃจํ”„ ์ผ€์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด llvm.sideeffect๋ฅผ ๋ฃจํ”„ {...}์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.{...} ๋ฃจํ”„์˜ ๋ณธ๋ฌธ์— break ํ‘œํ˜„์‹์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌดํ•œ ๋ฃจํ”„์— ๋Œ€ํ•œ C ++ ์‹œ๋งจํ‹ฑ๊ณผ Rust ์‹œ๋งจํ‹ฑ์˜ ์ฐจ์ด๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. Rust์—์„œ๋Š” C ++์™€ ๋‹ฌ๋ฆฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฃจํ”„๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ ์ˆ˜์žˆ์„ ๋•Œ ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์‹ ์ฒด๊ฐ€ ๋‹นํ™ฉ ํ•  ์ˆ˜์žˆ๋Š” ๋ฃจํ”„์˜ ์ •๋ฉด์—์„œ ์ •ํ™•์„ฑ์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๊ฑฑ์ •ํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ C๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Rust์—์„œ๋Š” ๋ชจ๋“  ๋ฃจํ”„๊ฐ€ ๋ถ„๊ธฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ํƒ€๋‹นํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

while test_fermats_last_theorem_on_some_random_number() { }

Rust์—์„œ๋Š” ๊ดœ์ฐฎ์€ ํ”„๋กœ๊ทธ๋žจ์ด๊ณ  (C๋„ C ++๋„ ์•„๋‹™๋‹ˆ๋‹ค), ๋ถ€์ž‘์šฉ์—†์ด ์˜์›ํžˆ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ข…๋ฃŒ ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ๋ฃจํ”„ ์—ฌ์•ผ

ํ—‰

"๋ฃจํ”„ ๋ณธ๋ฌธ์— ์ค‘๋‹จ ์‹ ์—†์Œ"๊ทœ์น™์ด ์ž˜๋ชป๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

if /*compile-time condition */ ๋ฟ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„์ด ์˜ํ–ฅ์„ ๋ฐ›๊ณ  ( while , match , for , ...) ๋Ÿฐํƒ€์ž„ ์กฐ๊ฑด๋„ ์˜ํ–ฅ์„๋ฐ›์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์™„๋ฒฝ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋ณด์ˆ˜์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค.

์ค‘ํžˆ ์—ฌ๊ธฐ๋‹ค:

fn foo(x: bool) { loop { if x { break; } } }

์—ฌ๊ธฐ์„œ x ๋Š” ๋Ÿฐํƒ€์ž„ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ @llvm.sideeffect ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ foo(false) ์–ด๋”˜๊ฐ€์— ์ž‘์„ฑํ•˜๋ฉด foo ๊ฐ€ ์ธ๋ผ์ธ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง€์†์ ์ธ ์ „ํŒŒ ๋ฐ ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ๋กœ ๋ฃจํ”„๊ฐ€ ๋ถ€์ž‘์šฉ์ด์—†๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋กœ ์ธํ•ด ์ตœ์ ํ™” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด, LLVM์ด ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ณ€ํ™˜์€ foo ๋ฅผ foo_opt ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

fn foo_opt(x: bool) { if x { foo(true) } else { foo(false) } }

๋‘ ๋ถ„๊ธฐ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ตœ์ ํ™”๋˜๊ณ  @llvm.sideeffect ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘ ๋ฒˆ์งธ ๋ถ„๊ธฐ๊ฐ€ ์ž˜๋ชป ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

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

์ด ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์€ rustc ์—์„œ๋ณด๋‹ค LLVM์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๋ฉด์ฑ… ์กฐํ•ญ :์ด ๋‘ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค)

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด, LLVM์˜ ์ˆ˜์ •์€ ์ตœ์ ํ™”๋ฅผ ์‹คํ–‰ (๋น„ ์ข…๋ฃŒ ์ž…์ฆ || ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฆ๋ช…ํ•  ์ˆ˜ ์—†์Œ)์—์„œ ๋น„ ์ข…๋ฃŒ๊ฐ€ ์ž…์ฆ ๋  ์ˆ˜์žˆ์„ ๋•Œ๋งŒ (๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€) ์‹คํ–‰์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด (์–ด๋–ค ์‹ ์œผ๋กœ๋“ ) ์‰ฝ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์ง€๋งŒ LLVM์€ ์ด๋ฏธ (๋‚ด ์ƒ๊ฐ์—) ๋ฃจํ”„์˜ (๋น„) ์ข…๋ฃŒ๋ฅผ ์ฆ๋ช…ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

  1. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฃจํ”„ ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— @llvm.sideeffect ์ถ”๊ฐ€
  2. ๋น„ ์ข…๋ฃŒ ๋ฃจํ”„์—์„œ ์ž˜๋ชป๋œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก LLVM์„ ์ˆ˜์ •ํ•˜๊ณ  @llvm.sideeffects

์ด๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? 1 ๋‹จ๊ณ„์˜ ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ๋„ˆ๋ฌด ๋”์ฐํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. 2๊ฐ€ ๊ตฌํ˜„๋˜๋ฉด ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด๋ผ ํ• ์ง€๋ผ๋„โ€ฆ

@sunfishcode ๋‘ ๋ฒˆ์งธ ํŒจ์น˜๊ฐ€ ๋  ์ˆ˜์žˆ๋Š” @Ekleog : https://lists.llvm.org/pipermail/llvm-dev/2017-October/118595.html

๊ธฐ๋Šฅ ์†์„ฑ ์ œ์•ˆ์˜ ์ผ๋ถ€๋Š”
๋™์ž‘์„ ์ •์˜ํ•˜๋„๋ก LLVM IR์˜ ๊ธฐ๋ณธ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ potential-UB์— ์˜ตํŠธ ํŒ…ํ•˜๋Š” ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ
๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด @ llvm.sideeffect์˜ ์—ญํ• ์ด ์กฐ๊ธˆ
๋ฏธ๋ฌ˜ํ•œ-C์™€ ๊ฐ™์€ ์–ธ์–ด์˜ ํ”„๋ก ํŠธ ์—”๋“œ๊ฐ€ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž ์žฌ์  ์ธ UB๋กœ ์ „ํ™˜ ํ•œ ๋‹ค์Œ ๊ฐœ๋ณ„
๊ทธ ํ•จ์ˆ˜์˜ ๋ฃจํ”„.

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

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

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


๊ฐ€๋Šฅํ•œ ํƒ€ํ˜‘์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋นˆ loop { } (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ) ๋˜๋Š” ๋ฌด์กฐ๊ฑด ์žฌ๊ท€ (์ด๋ฏธ lint๊ฐ€ ์žˆ์Œ)๋ฅผ ์“ธ ๋•Œ rustc insert @ llvm.sideeffect๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ˆ์ถฉ์•ˆ์€ ์‹ค์ œ๋กœ ๋ฌดํ•œํ•œ ํšจ๊ณผ์—†๋Š” ํšŒ์ „ ๋ฃจํ”„๋ฅผ ์˜๋„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์–ป์„ ์ˆ˜์žˆ๊ฒŒํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์˜ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก ,์ด ํƒ€ํ˜‘์ด ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ํฌ๋ž˜์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹  ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •์€ ์ผ๋ฐ˜์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

์‹ ์ฒด์˜ ์–ด๋–ค ์ง€์‹œ์— ์ž ์žฌ์  ์ธ ๋ถ€์ž‘์šฉ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ๋Šฅ ๋ณธ์ฒด์— ๋ถ€์ž‘์šฉ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์‹์ ์œผ๋กœ ์‚ฌ๋ฌผ์„๋ณด๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ "๋น„ ์ข…๊ฒฐ"์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํšจ๊ณผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ํƒ€๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (Haskell์€ ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‘ ๊ฐ€์ง€ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค : ๋น„ ์ข…๋ฃŒ ๋ฐ ์˜ˆ์™ธ.)

๊ฐ€๋Šฅํ•œ ํƒ€ํ˜‘์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋นˆ ๋ฃจํ”„ {} (๋˜๋Š” ์œ ์‚ฌ) ๋˜๋Š” ๋ฌด์กฐ๊ฑด ์žฌ๊ท€ (์ด๋ฏธ lint๊ฐ€ ์žˆ์Œ)๋ฅผ ์ž‘์„ฑํ•  ๋•Œ rustc insert @ llvm.sideeffect๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ˆ์ถฉ์•ˆ์€ ์‹ค์ œ๋กœ ๋ฌดํ•œํ•œ ํšจ๊ณผ์—†๋Š” ํšŒ์ „ ๋ฃจํ”„๋ฅผ ์˜๋„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์–ป์„ ์ˆ˜์žˆ๊ฒŒํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์˜ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก ,์ด ํƒ€ํ˜‘์ด ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ํฌ๋ž˜์‹œํ•˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค.

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


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

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

๋‚ด ์š”์ ์„ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์€ pick_a_number_greater_2 ์–ด๋–ค ์ข…๋ฅ˜์˜ ํฐ ์ •์ˆ˜๋ฅผ (๋น„ ๊ฒฐ์ •์ ์œผ๋กœ) ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑด์ „ํ•œ Rust ์ƒ์ž๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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 ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‚ถ์˜ ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋Œ€๊ฐ€๋กœ ์ ์ ˆํ•œ ์ˆ˜์ •์„ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ. ๋‚ด๊ฐ€ ์ œ์•ˆ:

  • ์žฅ๊ธฐ์ ์ธ ๊ฑด์ „์„ฑ ๋ฒ„๊ทธ (# 10184)์— ๋Œ€ํ•œ ์ž ์žฌ์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๋‹ค๋ฅธ ์ˆ˜์ •๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์•ผ์ƒ์—์„œ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์˜ํ–ฅ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก -Z ํ”Œ๋ž˜๊ทธ ๋’ค์— ์ˆ˜์ •์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ํ–ฅ์ด ๋ฌด์‹œํ•  ์ˆ˜์žˆ๋Š” ์ˆ˜์ค€ ์ธ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ •์„ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ํšŒ๊ท€๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ LLVM ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์ ธ์™€ LLVM์„ ๋จผ์ € ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ํšŒ๊ท€๋ฅผ ๋จน๊ณ  ๋‚˜์ค‘์— ์ˆ˜์ •ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ์ •๋ณด์— ์ž…๊ฐ ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)
  • ํšŒ๊ท€๋กœ ์ธํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ์ ์–ด๋„ ๊ตฌ๋ฌธ ์ ์œผ๋กœ ๋น„์–ด์žˆ๋Š” ๋ฃจํ”„์— 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 ์ด๊ฑฐ? ์ด์ „ ํ•˜์ดํผ ๋งํฌ๋Š” in์ด ์˜๊ตฌ ๋งํฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋žซ๋™์•ˆ ๋Š์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ! ๐Ÿ˜›

@simnalamburt ์™„๋ฃŒ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

MIR ์˜ตํŠธ ์ˆ˜์ค€์„ ๋†’์ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ตœ์ ํ™” ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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
}

https://godbolt.org/z/N7VHnj

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 ์Šค๋ ˆ๋“œ์—์„œ) ์•ž์œผ๋กœ ์ง„ํ–‰์— ๊ด€ํ•œ ์กฐํ•ญ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

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

์ด ๋ช…๋ น๋ฌธ์€ ํ•ด๋‹น ๊ณ„์‚ฐ์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋น„ ์ข…๊ฒฐ์€ ๋ถ€์ž‘์šฉ์ด๋ฉฐ, ํ‘œ์ค€ ์ถœ๋ ฅ ( "์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์Œ")์œผ๋กœ ์ธ์‡„ํ•˜๋Š” ๊ณ„์‚ฐ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š” ๊ณ„์‚ฐ์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋‹ค์Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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์˜ ๋ฌดํ•œ ๋ฃจํ”„๋Š” ๋™์ž‘์„ ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ๋ณด์กด๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค).

์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šฐ๋ฉด ๋ฐฐ๊ฒฝ ์ž๋ฃŒ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Benjamin Pierce์˜ "Types and Programming Languages"๋ฅผ ์ถ”์ฒœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๊ฐ€ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ์ž˜ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ, ๋ถ€์„œ ์˜ˆ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ

x = 42 % y;
if y <= 0 { return 0; }

๊ทธ๋Ÿฐ ๋‹ค์Œ ์กฐ๊ฑด๋ถ€ _cannot_์ด ๋‚˜๋ˆ—์…ˆ ์œ„์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด y๊ฐ€ 0 ์ผ ๋•Œ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์ถฉ๋Œ์—์„œ 0์„ ๋ฐ˜ํ™˜).

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ

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 ๊ดœ์ฐฎ์•„, ์ด์ œ ์•Œ์•˜๋‹ค. ๋‚ด ์›๋ž˜ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์„œ "์ „์ง„ ์ง„ํ–‰ ๋ณด์žฅ"์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”๊ฐ€์˜€์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋Š” ์ „์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์—์„œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์‹ค์ˆ˜๋Š” ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์ด ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์–ธ์–ด ์˜๋ฏธ์— ๋”ฐ๋ผ ์™„์ „ํžˆ ์ •๋ ฌ ๋œ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ๊ฐ€ ์ด๊ณ„๋ผ๋ฉด, ์•ž์œผ๋กœ ์ง„ํ–‰ ๋ณด์žฅ ( "ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ์˜ ๋ชจ๋“  ํ•˜์œ„ ๊ฒฝ๋กœ๊ฐ€ ์œ ํ•œํ•˜๋‹ค"๋ผ๊ณ  ๋‹ค์‹œ ์–ธ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์Œ)์—†์ด ์šฐ๋ฆฌ๋Š” (์‹คํ–‰ ์ˆœ์„œ์—์„œ) ์ข…๋ฃŒ๋กœ _prove_ ํ•  ์ˆ˜์žˆ๋Š” ํ‘œํ˜„์‹ ๋งŒ ์žฌ์ •๋ ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ์ž‘์—…, OS ํ˜ธ์ถœ, IO ๋“ฑ์˜ ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์†์„ฑ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ข€ ๋” ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์ง€๋งŒ, x = y % 42 ์˜ˆ์ œ์—์„œ ๋ถ„ํ• ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ "์ธ์‹"ํ•  ์ˆ˜์žˆ๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜์ง€๋Š” ์•Š๋”๋ผ๋„ ๋™์ผํ•œ ๊ฒƒ์ด ์ž„์˜์˜ ๋ฃจํ”„์— ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ . ์ „์ฒด (ํ”„๋กœ๊ทธ๋žจ) ์ˆœ์„œ์™€ ๋ถ€๋ถ„ (์‹คํ–‰) ์ˆœ์„œ์˜ ๋Œ€์‘ ๊ด€๊ณ„์˜ ๋ฏธ๋ฌ˜ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ

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

์ข…๋ฃŒ๋กœ ์ฆ๋ช…ํ•  ์ˆ˜์žˆ๋Š” ํ‘œํ˜„์‹ ๋งŒ (์‹คํ–‰ ์ˆœ์„œ๋กœ) ์žฌ์ •๋ ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Divison์€ ์ž ์žฌ์ ์œผ๋กœ ๋ถˆ์ˆœํ•˜์ง€๋งŒ 0์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒฝ์šฐ์—๋งŒ ํŒจ๋‹‰, ์ฆ‰ ์ œ์–ด ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง์ ‘์ ์œผ๋กœ ๊ด€์ฐฐ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ„์ ‘์ ์œผ๋กœ (์˜ˆ๋ฅผ ๋“ค์–ด ํŒจ๋‹‰ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ stdout์— ์ถœ๋ ฅํ•˜๊ฒŒํ•จ์œผ๋กœ์จ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๋‚˜๋ˆ—์…ˆ์€ 0์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์žฌ์ •๋ ฌ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐ๋ชจ ์ฝ”๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์™„์ „ํžˆ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/uglyoldbob/rust_demo ์˜ git repo์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

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

@uglyoldbob llvm-objdump ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋„์›€์ด๋˜์ง€ ์•Š๊ณ  ๋ถ€์ •ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ˆ์ œ์—์„œ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ์ผ์ด ๋” ๋ช…ํ™• ํ•ด์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ bl #4 (์‹ค์ œ๋กœ ์œ ํšจํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๊ตฌ๋ฌธ์ด ์•„๋‹˜)์€ bl ๋ช…๋ น์–ด๊ฐ€ ๋๋‚œ ํ›„ 4 ๋ฐ”์ดํŠธ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, main ํ•จ์ˆ˜์˜ ๋์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๋Šฅ์˜ ์‹œ์ž‘. ๋‹ค์Œ ํ•จ์ˆ˜๋Š” (๋‚ด๊ฐ€ ๋นŒ๋“œ ํ•  ๋•Œ) _ZN11broken_loop18__cortex_m_rt_main17hbe300c9f0053d54dE ํ˜ธ์ถœ๋˜๋ฉฐ ์ด๊ฒƒ์ด ์‹ค์ œ main ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ณ€ํ˜•๋˜์ง€ ์•Š์€ ์ด๋ฆ„ main ์˜ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž์˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ cortex-m-rt ์ œ๊ณตํ•˜๋Š” #[entry] ๋งคํฌ๋กœ์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์ตœ์ ํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์‚ฌ์‹ค ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋นŒ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

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