๋ค์ ์ค ๋ํซ์ ํ์ฌ ์์ , ๋ฒ ํ ๋ฐ ์ผ๊ฐ์์ ๋ฆด๋ฆฌ์ค ๋ชจ๋๋ก ์ปดํ์ผ ํ ๋ ์ถฉ๋ํฉ๋๋ค.
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
๋ฅผ ์คํํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ต์ ํ ๋ ์ฝ๋์ 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 ์์ฒด์์ ๋ณด์์ ๋ถ์์ ์ํํ์ฌ ๋ค์์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ด ๋ ๊ฐ์ง ๋ชจ๋ ์ ์๋์ง ์์ ๋์์ ํผํ๊ธฐ์ ์ถฉ๋ถํด์ผํฉ๋๋ค.
๋ถ๋ฅ : 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์ด ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ข ๋ ๋ฌถ์ด ์ด๋ฏธ์ง ํ ์ ์์ต๋๋ค. ์ฆ, 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 ์ง๊ธ ๋ฒ๊ทธ๋ฅผ ์ ๊ณ ํ๊ณ ์์ต๋๋ค.
# 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
๋ ๋ฃจํ์ (๋น) ์ข
๋ฃ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์๋ก์ด ์ฝ๋๋ฅผ ์ฝ์
ํด์ผํฉ๋๋ค.
๋ฐ๋ผ์ ์์ผ๋ก์ ๊ธธ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@llvm.sideeffect
์ถ๊ฐ@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 ํ๋ก๊ทธ๋๋จธ์ ์ถ์ ์ง์ ํฅ์์ํค๋ ๋๊ฐ๋ก ์ ์ ํ ์์ ์ ์ฝ๊ฐ ์ง์ฐ์ํค๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ ๊ฒ์ด ํ๋ช
ํ ์ ์์ต๋๋ค. ์๊ฐ. ๋ด๊ฐ ์ ์:
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
}
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]
๋งคํฌ๋ก์ ์ํด ์์ฑ ๋ ์์ ํ ๋ค๋ฅธ ํจ์์
๋๋ค. ๊ทํ์ ์ฝ๋๋ ์ค์ ๋ก ์ต์ ํ๋์ง ์์ต๋๋ค. (์ฌ์ค ๋๋ฒ๊ทธ ๋ชจ๋์์ ๋น๋ํ๊ธฐ ๋๋ฌธ์ ์ต์ ํ ํ๋ก๊ทธ๋จ์ด ์คํ๋์ง ์์ต๋๋ค.)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
https://github.com/rust-lang/rust/pull/59546์ @sfanxiang ์ ์ํด ์ถ๊ฐ ๋
-Z insert-sideeffect
rustc ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณ์ ๋ฐ๋ณต๋ฉ๋๋ค. :)์ ์:
ํ: