์์ ๋ฐฐ์ด์ ์ฌ๋ผ์ด์คํ๊ณ ์ฌ๋ผ์ด์ค์ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ ์์์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ๋ ์์ ํ๋ก๊ทธ๋จ (๋ ํฐ ํ๋ก์ ํธ์ ํ
์คํธ ํจ์ ๋จ์ํ)์ด ์์ต๋๋ค. ์์ ์ ์ธ 1.41.0
๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ์ฌ cargo run --release
์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค (macOS 10.15 ๋ฐ Ubuntu 19.10์์ ํ
์คํธ ๋จ).
0 0 3 18446744073709551615
[1] 21065 segmentation fault cargo run --release
๊ฒฐ๊ณผ ์กฐ๊ฐ์ ๊ธธ์ด๊ฐ 2**64 - 1
์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์๋ต๋์ด ์์๋๋ก segfault๊ฐ ๋ฐ์ํฉ๋๋ค. 1.39.0
๋ฐ 1.40.0
์์ ๋๊ฐ์ ํ๋ก๊ทธ๋จ์ด ๋ด๊ฐ ๊ธฐ๋ํ๋ ๊ฒ์ ์ธ์ํฉ๋๋ค.
0 0 3 0
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 16777216', src/main.rs:13:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
๋ค์ ์ค ํ๋๋ฅผ ์ํํ๋ฉด ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋๋ค.
main()
์์ ๋ ๊ฐ์ do_test(...);
ํธ์ถ ์ค ํ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.for _ in 0..1 {
๋ฃจํ ์ ๊ฑฐ;for y in 0..x {
๋ฃจํ๋ฅผ for y in 0..1 {
.z.extend(std::iter::repeat(0).take(x));
์ค์ ์ ๊ฑฐํ๊ฑฐ๋ z.extend(std::iter::repeat(0).take(1));
.for arr_ref in arr {
๋ฃจํ๋ฅผ let arr_ref = &arr[0];
.RUSTFLAGS="-C opt-level=2"
;RUSTFLAGS="-C codegen-units=1"
.๋ด ๊ฐ์ฅ ์ข์ ์ถ์ธก์ -C opt-level=3
๋ LLVM์์ ๋ฌธ์ ๊ฐ์๋ ์ต์ ํ ํจ์ค๋ฅผ ๊ฐ๋ฅํ๊ฒํ์ฌ ์๋ชป๋ ์ปดํ์ผ์ ์ด๋ํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ์ต์ ํ ์ MIR ( --emit mir
) ๋ฐ LLVM IR ( --emit llvm-ir -C no-prepopulate-passes
)์ด -C opt-level=2
๋ฐ -C opt-level=3
๋ชจ๋์ ๋ํด ๋์ผํ๋ค๋ ์ฌ์ค์ ์ํด ์
์ฆ๋ฉ๋๋ค.
๋์์ด ๋ ์์๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด :
codegen-units = 1
์ฌ์ฉํ๊ธฐ ๋๋ฌธ์).1.41.0
๋ฆด๋ฆฌ์ค๋ก Windows 10์์ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค (๋ฌด์์ด ๋ค๋ฅธ์ง ์ ์ ์์).cargo-bisect-rustc
๋ ํ๊ท๊ฐ 2019-12-12
๋ฐค๋ง๋ค, ํนํ์ด ์ปค๋ฐ์์ ์ฒ์ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ํ๋ด์ง ์๋ 1.40.0
๊ฐ์ด ๋ ์ง ์ดํ์ ์ถ์ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋์๊ฒ ์์ฌ์ค๋ฌ์ ๋ณด์
๋๋ค.GitHub ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ธ๋ผ์ธ์ผ๋ก ์ฒจ๋ถํฉ๋๋ค (Cargo์์ด ์ปดํ์ผํ๋ ค๋ฉด rustc -C opt-level=3 main.rs
).
fn do_test(x: usize) {
let arr = vec![vec![0u8; 3]];
let mut z = Vec::new();
for arr_ref in arr {
for y in 0..x {
for _ in 0..1 {
z.extend(std::iter::repeat(0).take(x));
let a = y * x;
let b = (y + 1) * x - 1;
let slice = &arr_ref[a..b];
eprintln!("{} {} {} {}", a, b, arr_ref.len(), slice.len());
eprintln!("{:?}", slice[1 << 24]);
}
}
}
}
fn main() {
do_test(1);
do_test(2);
}
cc @ rust-lang / ์ปดํ์ผ๋ฌ
@rustbot ํ icebreakers-llvm
๋ฆด๋ฆฌ์ค ํ์ Rust 1.41 (์ง๋ ์ฃผ ํ์์์ ๊ฐ๋ตํ๊ฒ ๋ ผ์)์ ๋ํ ํฌ์ธํธ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ๊ณ ์์ผ๋ฉฐ, ๊ณง PR์ ์ป์ ์ ์๋ค๋ฉด์ด ๋ด์ฉ์ด ํฌํจ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์๋
ํ์ธ์ LLVM ICE-breakers! ์ด ๋ฒ๊ทธ๋ ์ข์ ๊ฒ์ผ๋ก ํ์ธ๋์์ต๋๋ค
"LLVM ICE-breaking ํ๋ณด". ์ ์ฉํ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง
์ด๋ฌํ ์ข
๋ฅ์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ [์ง์นจ]. ํ ๋ฒ ๋ณด์๊ฒ ์ต๋๊น?
๊ฐ์ฌ! <3
cc @comex @DutchGhost @ hanna-kruppe @hdhoang @heyrutvik @ JOE1994 @jryans @mmilenko @nagisa @nikic @ Noah-Kennedy @SiavoshZarrasvand @spastorino @vertexclique @vgxbj
์์ ์ ์ธ 1.41.0 ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ์ฌ cargo run --release๋ก ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค (macOS 10.15 ๋ฐ Ubuntu 19.10์์ ํ ์คํธ ๋จ).
๋๋ ์ด๊ฒ์ ๋์ดํฐ์์ ์ฌํ ํ ์ ์๋ค . ์ด ํ๋ก๊ทธ๋จ์ ๋ฆด๋ฆฌ์ค ๋ชจ๋์ 1.41.0์์ ์ ์๋ํฉ๋๋ค.
ํธ์ง : ์, ๋น์ ์ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ๋งํ์ต๋๋ค.
๋ํ ํ๋ก๊ทธ๋จ์ Miri์์ ๊ด์ฐฎ์ผ๋ฏ๋ก UB๊ฐ ์๋๋ผ ์๋ชป๋ ์ปดํ์ผ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด Linux์์ ์ต์ ์ผ๊ฐ์ผ๋ก์ด๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค.
[andrew<strong i="6">@krusty</strong> rust-69225]$ rustc --version
rustc 1.43.0-nightly (5e7af4669 2020-02-16)
[andrew<strong i="7">@krusty</strong> rust-69225]$ cat main.rs
fn do_test(x: usize) {
let arr = vec![vec![0u8; 3]];
let mut z = Vec::new();
for arr_ref in arr {
for y in 0..x {
for _ in 0..1 {
z.extend(std::iter::repeat(0).take(x));
let a = y * x;
let b = (y + 1) * x - 1;
let slice = &arr_ref[a..b];
eprintln!("{} {} {} {}", a, b, arr_ref.len(), slice.len());
eprintln!("{:?}", slice[1 << 24]);
}
}
}
}
fn main() {
do_test(1);
do_test(2);
}
[andrew<strong i="8">@krusty</strong> rust-69225]$ rustc -C opt-level=3 main.rs
[andrew<strong i="9">@krusty</strong> rust-69225]$ ./main
0 0 3 18446744073709551615
zsh: segmentation fault (core dumped) ./main
Rust 1.41 ์์ ์์ ๋๊ฐ์ ์ถ๋ ฅ์ผ๋ก ์์ ๋ด์ฉ์ ์ฌํ ํ ์์์์ต๋๋ค. Rust 1.40 stable์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
$ ./main
0 0 3 0
thread 'main' panicked at 'index out of bounds: the len is 0 but the index is 16777216', main.rs:13:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
๋๋ ์ด๊ฒ์ด ์ ์ด๋ macOS ํน์ ์ด ์๋์ ํ์ธํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ @dfyz ์ ๋ณด๊ณ ์์ ์ผ์นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
cargo-bisect-rustc
๋ ํ๊ท๊ฐ2019-12-12
์ผ๊ฐ์, ํนํ์ด ์ปค๋ฐ์์ ์ฒ์ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ํ๋ด์ง ์๋1.40.0
๊ฐ์ด ๋ ์ง ์ดํ์ ์ถ์ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋์๊ฒ ์์ฌ์ค๋ฌ์ ๋ณด์ ๋๋ค.
์ด๊ฒ์ ์์๋ฉ๋๋ค. 1.40.0์ด๋์๋ค 2019๋
12์ 19์ผ์ ๋ฐํ ํ ํ ๋ฌด์์ ๊ธฐ์ค์ผ๋ก beta
์์ ๋ถ๊ธฐ ๋ ์ง์ , master
์ก์ฃผ ์ด์ ํฉ๋๋ค (1.39.0 ๋ฆด๋ฆฌ์ค ์๊ฐ ์ ๋). ๋ฆด๋ฆฌ์ค ์ฑ๋์ ๋ํ ์์ธํ ๋ด์ฉ์ https://doc.rust-lang.org/book/appendix-07-nightly-rust.html ์ ์ฐธ์กฐ
์ถ์ธกํด์ผํ๋ค๋ฉด https://github.com/rust-lang/rust/pull/67015 ๊ฐ ๋ฒ์ธ์ด๋ผ๊ณ ๋งํ ์
Cc @ osa1 @ oli-obk @wesleywiser
ํ ๊ฐ์ฌํฉ๋๋ค. ํ์ฌ ์กฐ์ฌ๋ฅผ ์ํด ๋น๋๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค. # 67015์์ ๋์ ๋ ๋ฒ๊ทธ ์ผ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ # 67015๊ฐ ๋ฐฉ๊ธ ๊ธฐ์กด ๋ฒ๊ทธ๋ฅผ ๊ณต๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค.
Linux์์ nightly rustc๋ฅผ ์ฌ์ฉํ์ฌ segfault๋ฅผ ์ฌํํ์ง๋ง์ด config.toml๋ก ์์ฑ ๋ ๋น๋๋ก๋ ๋ง๋ค์ง ๋ชปํ์ต๋๋ค.
[llvm]
[build]
[install]
[rust]
optimize = true
debug = true
codegen-units = 0
debug-assertions = true
debuginfo-level = 2
[target.x86_64-unknown-linux-gnu]
llvm-config = "/usr/bin/llvm-config-9"
[dist]
rustc nightly๋ฅผ ์ฌ์ฉํ์ฌ ConstProp ์ ํ์ MIR์ ํ์ธํ์ผ๋ฉฐ MIR์ด ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ด ConstProp์ ์ํด ๋ฐ์ํ๋ค๋ฉด์ด ํ๋ก๊ทธ๋จ์ด ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑ ๋ ์ฝ๋์ ์ฐจ์ด ๋๋ฌธ์ ๋๋ค.
033662dfbca088937b9cdfd3d9584015b5e375b2์ ํ๊ท
@rustbot ๋ผ๋ฒจ ์์ : -E-needs-bisection
@ osa1 debug-assertions = true
์ ์๋ง๋ ๋น๋๋ฐ์ ๊ฒ์
๋๋ค. -C debug-assertions=y
๋ก ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ๋ ค๊ณ ํ๋ฉด (๋ฐ๋๋ผ ์ผ๊ฐ ์ปดํ์ผ๋ฌ๋ก) segfault ๋์ ํ๋ก๊ทธ๋จ ํจ๋์ด ๋ฐ์ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ๋ค! a983e0590a43ed8b0f60417828efd4e79b51f494๋ฅผ ๋ ๋๋ฆฌ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ํ๋ฃจ ์ข ์ผ ์ ์๊ฒ ๋ฒ์ธ์ฒ๋ผ ๋ณด์์ง๋ง ์ง์ฅ์์ ํ ์คํธ ํ ์ ์์์ต๋๋ค. :) ๋๊ตฐ๊ฐ๊ฐ์ด ๋ฌธ์ ์ ๋ํ PR์ ๊ฐ์ฅ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋์ ์ค ์ ์์ต๋๊น? ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์คํจํด์ผํ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ด๊ฒ์ ๋งค์ฐ ํ๋ซํผ์ ํนํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ๊ฒฐ๊ตญ ์ข์ ์๊ฐ์ด ์๋๊น์? ์ฌ๊ธฐ์ ์ด๋ค ์์ด๋์ด๊ฐ ์์ต๋๊น? ๊ฐ์ฌ!
(์ด๊ฒ์ ์ด๋ฏธ OP์ ์ํด ์๋ถ๋์์ต๋๋ค)
debug-assertions
์ ๋ ์ํ์์ ๋ก์ปฌ ๋น๋๋ก ์ด๊ฒ์ ์ฌํํ์ต๋๋ค (@ hellow554์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค).
๋กค์
์ ์ผ๋ถ PR์ ๊ทธ ์ดํ๋ก ๋ชจ๋ ๊ฒ์ rustfmt
-edํ๊ธฐ ๋๋ฌธ์ ๋๋๋ฆด ๋ ์ถฉ๋์ ์ผ์ผํค์ง ๋ง์ด ๋ฌธ์ ๋ # 67174 ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง : ์ฐ๋ฆฌ๊ฐ ๋์์ @shahn์ ์ฐพ์ ๊ฒ ๊ฐ์ต๋๋ค :)
@lqd ์, ์ด๊ฒ์ ์์์ ์ฐธ์กฐํ ์ปค๋ฐ์ ํฌํจํ๋ ๋ฌธ์ ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋ฒ์ธ์ ๋๋ค.
๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด, ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง codegen-units
์ดํ (ํจ๊ป ๋ฐฉ์ถ ํ๋กํ์ผ์ ๊ฐ์ ๋๋ 3์ผ๋ก ์ค์ ๋์ด incremental=false
). ์ฆ, codegen-units
๊ฐ 4 ์ด์์ผ ๋ ์ฌํ ํ ์ ์์ต๋๋ค.
panic_bounds_check
๋ํ ํธ์ถ์ LLVM ์ ํ ์ค๋ ๋ฉ ํต๊ณผ ํ ์ฌ๋ผ์ง๋๋ค. LLVM 9์์ opt๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ง๋ง LLVM 10์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ 1 ๋จ๊ณ rustc
( ./x.py build -i --stage 1
)๋ฅผ ์ฒดํฌ ์์ํ๊ณ ๋น๋ํ๊ณ , # 67174์์ด libstd
( ./x.py build -i --stage 1 --keep-stage 0 src/libstd
)๋ฅผ ๋ค์ ๋น๋ํ๊ณ , ๋ค์๊ณผ ๊ฐ์ด segfaulting ํ๋ก๊ทธ๋จ์ ๋ค์ ์ปดํ์ผํ์ต๋๋ค. 4 ๊ฐ์ codegen ๋จ์ ( rustc +stage1 -C opt-level=3 -C codegen-units=4 main.rs
). ์์๋๋ก ์ด๋ก ์ธํด segfault๊ฐ ์ฌ๋ผ์ก์ต๋๋ค. # 67174๋ฅผ ๋ค์ ์ ์ฉํ๋ฉด segfault๊ฐ ๋ฐํ๋ฉ๋๋ค.
์ด๊ฒ์ ์ด์ ๊ทธ๋ค์ด ์ฌ์ฉํ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ง ๋ค๋ฅธ ๋ ๊ฐ์ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ์ด ์ปดํ์ผ๋ฌ๋ฅผ GOOD
(segfault ์์) ๋ฐ BAD
(segfault)๋ผ๊ณ ํฉ์๋ค.
๋๋ ๊ทธ ๋ฐ๊ฒฌ์ด 4 _unoptimized_ *.ll
์ ์ํด ์์ฑ ๋ ํ์ผ GOOD
( -C no-prepopulate-passes
) ๊ฝค ๋ง์ด ์์ต๋๋ค์ ์ํด ์์ฑ ๋ ๊ฒ๊ณผ ๊ฐ์ BAD
(์ ์ผํ ์ฐจ์ด์ ํจ์ ์ด๋ฆ์ ๋ค๋ฅธ ์์์ ID๊ฐ์๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๊ทธ๋ฌ๋ _optimized_ *.ll
ํ์ผ ( -C no-prepopulate-passes
์๋)์ ํฌ๊ฒ ๋ค๋ฆ
๋๋ค. ๋๋ ์ด๋ค ์ ์ผ๋ก๋ ์ปดํ์ผ๋ฌ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง ์ปดํ์ผ๋๋ ํ๋ก๊ทธ๋จ์ด ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋๊ฐ๊ธฐ ๋๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ ๋ชจ๋ ๋๊ฐ๊ณ ์ ์ผํ ์ฐจ์ด์ ์ ๋ฏธ๋ฆฌ ์ปดํ์ผ ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ค๋ ๊ฒ์
๋๋ค. I _think_ LTO๊ฐ ๊ด๋ จ ๋ ์ ์์ต๋๋ค. .
์ค์ ๋ก -Z thinlto=no
, -C lto=no
, -C lto=yes
, -C lto=thin
์ค ํ๋๋ฅผ ํต๊ณผํ๋ฉด (์ด ์์ ์์๋ ํ์คํ์ง ์์ง๋ง ๋ชจ๋ ์์์ -C lto
์ BAD
, segfault๊ฐ ๋ค์ ํ ๋ฒ ์ฌ๋ผ์ง๋๋ค.
์ฌ๊ธฐ์ LTO๊ฐ ์๋ชป๋์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฝ์์ต๋๋ค. ๋ ๋๋ฆฌ๋ ์ปค๋ฐ์ ์ฝ์์ต๋๋ค. ๋๋ ์์ง๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง์ ๋ํด ๊ฐ์ฅ ์๊ฐ๊ฐ ๋๋ค. ๋ฌด์์ด ๊ณ ์ฅ ๋ฌ์ต๋๊น?
๋ฌด์์ด ๊ณ ์ฅ ๋ฌ์ต๋๊น?
๋๋์ด ์์ ์์ ๋๊ตฌ๋ ์ ํํ ๋ฌด์์ด ๊ณ ์ฅ ๋ฌ๋์ง ํ์คํ ๋งํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง, ๋ด ์ ์ ์ ์ธ ๋ถ์์ ์ด๊ฒ์ ๋๋ค. (๋ค์์ ์๊ธ์ผ๋ก ๊ฐ์ ธ ๊ฐ์ญ์์ค. ์ ๋ Rust ํ์ด๋ LLVM ํ์ ์ํด ์์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ฅผ ์กฐ์ํ๊ณ LLVM IR์ ์์ํ๋ ๊ฒ์ ๋๋ค.)
Layout::repeat()
์ ํ ์ค ์์ ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ์ฌ ๊ฒฐ๊ตญ์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ํ์ง ์๊ฒ๋์์ต๋๋ค. ์ํ์ ์ผ๋ก ์ฌ๊ธฐ์ ์ฒดํฌํ์ง ์์ ๋ง์
์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ์์ ํด์ผํฉ๋๋ค.์ด ํจ์ (๋ฐ Layout::pad_to_align()
)์ ์ฃผ์์ด ์ด์ ๋ฅผ ์ค๋ช
ํฉ๋๋ค.Vec
๋ฅผ ์ฌ์ฉํฉ๋๋ค. Vec::reserve_internal()
๋ฅผ ์์ ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ฐจ๋ก๋ก Layout::repeat()
ํธ์ถํฉ๋๋ค .Layout::repeat()
๋ #[inline]
๋ก ํ์๋๋ฉฐ GOOD
์ BAD
์ฌ์ด์ ์ ์ผํ ๊ด๋ จ ์ฐจ์ด์ ์์ด ํจ์๊ฐ do_test()
์ธ๋ผ์ธ๋๋์ง ์ฌ๋ถ์
๋๋ค. ์๋. ์๋ฅผ ๋ค์ด, ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ๋ณต์ํ๋ฉด ์ธ๋ผ์ธ์ด ๊ธ์ง๋๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. #[inline]
์์ฑ์ ์ ๊ฑฐํ๋ฉด ๋์ผํ ํจ๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค. LTO๋ฅผ ๋นํ์ฑํํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ ๋ํ ์ธ๋ผ์ธ์ด ๋นํ์ฑํ๋๊ณ ๋ฌธ์ ๊ฐ ๋ค์ ์์ ๋ฉ๋๋ค.์ด๊ฒ์ด ์ฌ์ค์ด๋ผ๋ฉด (๋ค์ ๋ง์ ๋๋ฆฌ์ง๋ง, ์ ์ฌํญ์ ๋ํด 100 % ํ์ ํ์ง ๋ชปํฉ๋๋ค) ์ด๋ ์ผ๋ถ ๋ถ๋ LLVM ํต๊ณผ ๋๋ ํต๊ณผ ์กฐํฉ์ด ์ธ๋ผ์ธ ํ IR์ ์๋ชป ์ต์ ํํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ํ์ฌ ์กฐ์ฌํ๋ ค๊ณ ํ๋ ๊ฒ์
๋๋ค.ํ์ง๋ง ์ฌํ๊ฒ๋ GOOD
์ BAD
์ฌ์ด์ IR ์ฐจ์ด๊ฐ ์ ๋นํ๊ธฐ ๋๋ฌธ์ (์ ์ด๋ ์ ์ ๊ฐ์ ๋น LLVM-ICE-breaker์๊ฒ๋) ์ฝ์ง ์์ต๋๋ค. ํฐ. ์๋ชป๋ ๋ฒ์ ์ด panic_bounds_check
์๋ต ํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ ํ ๊ทธ ์ด์ ๋ฅผ ์ ํํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ @tmiasko ์ ์๊ฒฌ์์ ์๊ฐ์ ๋ฐ์ ๋ค๋ฅธ LLVM ๋ฒ์ ์ผ๋ก rustc๋ฅผ ์ปดํ์ผํ๋ ค๊ณ ํ๋๋ฐ LLVM 10rc1์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค (๋ด๊ฐ ์๋ํ ์ต์ ๊ฒฐํจ LLVM ๋ฒ์ ์ 9.0.1์ ๋๋ค). 9.0.1๊ณผ 10rc1 ์ฌ์ด์ ๊ด๋ จ ์ปค๋ฐ์ด ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ Jump Threading ํจ์ค๊ฐ ๋น๋๋ฐ์ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
Layout::repeat()
๋ณ๊ฒฝ ์ฌํญ์ ๋ ๋๋ฆฌ๋ ๊ฒ์ด ๊ด๋ จ์๋ ๋ฒ๊ทธ์ ํน์ ๋ฐ์
Layout :: repeat () ๋ณ๊ฒฝ์ ๋ ๋๋ฆฌ๋ ๊ฒ์ด ๊ด๋ จ๋์ง ์์ ๋ฒ๊ทธ์ ํน์ ๋ฐ์ ํ ๊ฐ์ง ์ฆ์ ๋ง ์จ๊ธฐ๋ ๊ฒฝ์ฐ ๋ ๋๋ฆฌ๋ ๊ฒ์ด ์ ๋ง ์ฌ๋ฐ๋ฅธ ์ผ์ ๋๊น?
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๊ด์ฐฎ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด ๋ณด๋ฅ๋๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๊ณ ์ฌ์ฉ์ ์ฐจ๋จ์ ํด์ ํ๊ธฐ ์ํด ๋ถ ๋ฆด๋ฆฌ์ค๋ฅผ ์ ๊ณต ํ ๋ค์ (๋ฒ๊ทธ๊ฐ ์ฌ์ ํ ์กด์ฌํ๋๋ผ๋ ๋ณ๊ฒฝ ์ฌํญ์์ด ์ ์๋ ํจ) ์ค์ ๋ฒ๊ทธ์ ์ง์คํฉ๋๋ค.
๋ค๋ฅธ ์ปดํ์ผ๋ฌ์์ ๋๋ ์ค์ ๋ก ์ด๊ฒ์ ํ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ๋ฆด๋ฆฌ์ค ๋ธ๋์น์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ ๋ ธ์ง๋ง ๋ง์คํฐ๊ฐ ์๋ (์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ฉฐ ๋์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ ํจ) ์๋ก์ด ๋ง์ด๋ ๋ฆด๋ฆฌ์ค๋ฅผ ์ถ์ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ค์ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
์ด์จ๋ ๋ฒ๊ทธ์ ์ฐ์ ์์๊ฐ ์ง์ ๋๊ณ ์์ ๋๊ณ ๋ฒ๊ทธ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ํธ๋ฆฌ๊ฑฐํ๋ ์ปค๋ฐ์ด ๋ฒ๊ทธ ์์ ์์ฒด๊ฐ ์๋๋ผ๋ฉด ์ง๊ธ์ ๋ฒ๊ทธ๋ฅผ ๋ ๋๋ฆฌ๋ ๋ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋์ ์ง๋ฌธ์,์ด ๋ฒ๊ทธ๊ฐ ์ ๋ง ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ฌ์ด๊ฐ์? ์ง๊ธ๊น์ง ๋ ์ต์ํํ๋ ค๋ ์๋ (์ : ๊ฒ๋ณด๊ธฐ์ ์ฌ์ํ for _ in 0..1
๋ฃจํ ํ๊ธฐ)๊ฐ ์ฌํ๋์ง ์๋ ๋ค์ ๊ด๋ จ๋ ํ
์คํธ ์ผ์ด์ค๊ฐ ํฌํจ ๋ ๋ณด๊ณ ์๊ฐ ์์ต๋๋ค.
๋๋ ๋ฒ๊ทธ๊ฐ ์ ๋ฐํ๊ธฐ ์ฝ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ถํํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์จ๋ @shahn ์ด Layout::new()
๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๊ธฐ ์ํด ๊ฒช์ ์๊ณ ์ ๋ํด ์ ๋ง ๊ฐ์ฌํ์ง๋ง IMO์์ ๋ ๋๋ฆฌ๋ ๊ฒ์์ด ๊ฒฝ์ฐ์ ์ณ์ ์ผ์ด ์๋๋๋ค. ๋ด ์ถ๋ก ( @SimonSapin์ด ๋งํ ๊ฒ
Layout::repeat()
์์ ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ๋ฉด LLVM์ด ๋ฆด๋ฆฌ์ค ๋น๋์์ Vec::reserve()
๋ฅผ ์ธ๋ผ์ธ ํ ์ ์์ต๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์ข์ ์ฑ๋ฅ ํฅ์์ ์ ๊ณต ํ ์ ์์ต๋๋ค (๋ฌผ๋ก ์ธก์ ํด์ผํ์ง๋ง).libcore/alloc.rs
( Layout::pad_to_align()
)์ ์ด์ ํจ์๋ ํ์ธ๋์ง ์์ ์ถ๊ฐ์ ๋์ผํ ํจํด์ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒํ๋ ๊ฒ์ ์ค๋ช
ํ๋ ๋์ผํ ์ฃผ์์ ์ฌ์ฉํฉ๋๋ค. Layout::repeat()
์์ ์ค๋ฒํ๋ก ๊ฒ์ฌ๋ฅผ ๋ณต์ํ์ง๋ง Layout::pad_to_align()
์์๋ ๋ณต์ํ์ง ์๋ ๊ฒ์ด ์ ๋ง ์ด์ํด ๋ณด์
๋๋ค.์ด ํน์ ์ฃ์ง ์ผ์ด์ค ๋๋ ๋๋ฒ๊ฑฐ ํธ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ํน์ ์ธ๋ถ ์ฌํญ์ผ๋ก ํจ๋ํ๋๋ก ์ฌ์ ์กฐ๊ฑด์ผ๋ก ๋ถ๋ณ์ ๋ฆด๋ฆฌ์ค ํฌํจ ๋ฐฉ์ด ์ ์ฃผ์ฅ์ ๋ก์ปฌ๋ก ๋์ง ์ ์์ต๋๊น? ๋๋ ํน์ ์กฐ๊ฑด์์ ํต๊ณผํ๋ ํ์ธ๋์ง ์์ ๊ณ์ฐ ์ผ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ถ์ ํ ๋ (๋ฐฉ๊ธ ๋ฐฐ์ด LLVM ์ด๋๊ฐ์ ty @dyfz) ํ๊ท ํ ์คํธ ์ผ์ด์ค๊ฐ ๋ฉ์ ธ์ ๋ค์ ๋ฐ์ํ์ง ์์ต๋๋ค. ๐
LLVM IR ์ฌ์๊ธฐ : https://gist.github.com/comex/881074b1bcc545e299e65527c719eef4
opt bconfused.ll -scalar-evolution -loop-idiom -scalar-evolution -indvars -S -O3 -o - | grep xprint
ํฉ๋๋ค. ๊ดํธ ์์ด i64 -1
์ด๋ฉด ๋ฒ๊ทธ๊ฐ์๋ ์ต์ ํ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ... ์์ ์๋ ์์ง๋ง ํ์ ํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.
LLVM์์ Induction Variable Simplification ํจ์ค์ ์ผ๋ถ๋ก nuw
๋ฅผ add nuw i64 %x, -1
์๋ชป ์ถ๊ฐ ํ ๊ฒ ๊ฐ์ต๋๋ค. x
๋ ํจ์์ ๋ํ ์ธ์์ด๊ณ nuw
๋ ์๋ช
๋์ง ์์ ๋ฉ์ด ์์์ ์๋ฏธํ๋ฏ๋ก ์ธ์๊ฐ ๋ณด์ฅ๋์ง ์๋ ํจ์์ ์ง์ ์์ ์ธ์๊ฐ 0์ด๋ผ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฃผ์ฅํฉ๋๋ค.
Bisecting (ํธ์ง : LLVM 9์์ LLVM 10์ผ๋ก, @tmiasko ๋ ์ํฅ์๋ฐ์ง
commit 58e8c793d0e43150a6452e971a32d7407a8a7401
Author: Tim Northover <[email protected]>
Date: Mon Sep 30 07:46:52 2019 +0000
Revert "[SCEV] add no wrap flag for SCEVAddExpr."
This reverts r366419 because the analysis performed is within the context of
the loop and it's only valid to add wrapping flags to "global" expressions if
they're always correct.
llvm-svn: 373184
r366419 (์์ ์ปค๋ฐ์ด ๋ ๋๋ฆฌ๋ ์ปค๋ฐ)๊ฐ Rust๊ฐ ์ฌ์ฉํ๋ LLVM 9.0 ๋ธ๋์น์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ง ํด ๋ณด์ ๋๋ค.
T- ์ปดํ์ผ๋ฌ ๋ถ๋ฅ : ๋ค์ ์ํฉ ์์ฝ ์ ๊ธฐ๋ฐ์ผ๋กํ๋ P- ์ค๊ฐ :
pnkfelix : # 69225์ ๋๋จธ์ง ์์ ํญ๋ชฉ์ 1. ์์ LLVM (58e8c793d0e43150a6452e971a32d7407a8a7401์ ์ ํํ๊ฑฐ๋ LLVM 10์ผ๋ก ์ ๊ทธ๋ ์ด๋) ํ ๋ค์ 2. PR # 67174๋ฅผ ์ฝ์์ต๋๋ค.
pnkfelix : ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค ์ค ์ด๋ ๊ฒ๋ ๋์๊ฒ ์ฐ์ ์์๊ฐ ๋์ ํญ๋ชฉ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
pnkfelix : ์ ์ด๋์ด LLVM ๋ฒ๊ทธ๋ ๋ค๋ฅธ LLVM ์ฝ๋ ์์ฑ ๋ฒ๊ทธ๋ณด๋ค ๋ ์ข๊ฑฐ๋ ๋์๊ฒ ๋ณด์ด์ง ์์ต๋๋ค. @simulacrum์ด ๋ฐฉ๊ธ ๋งํ ๊ฒ์ ๋๋ค.
์ ๋ฐ์ดํธ : PR # 67759์์ LLVM 10์ผ๋ก ์ ๊ทธ๋ ์ด๋ ์๋ ์ค
์ ๋ฐ์ดํธ 2 : ์ด๋ค ์ด์ ๋ก ๋ ์๋ณธ์ ์ฒด๋ฆฌ๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋๋ฆฌ๊ธฐ ์ปค๋ฐ์ ๋งน๋ชฉ์ ์ผ๋ก ์ฒด๋ฆฌ๋ก ์ ํํ๋ ๊ฒ์ ํ๋ช ํ์ง ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ณต๊ท๋ ์๋ํ์ง ์์ ๋ค์ด ์คํธ๋ฆผ ํจ๊ณผ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ ์ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ดํดํ์ง ์๊ณ ์๋ํด์๋ ์๋ฉ๋๋ค. (LLVM 10์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ค๋ ๋ ธ๋ ฅ์ ๊ฐ์ํ ๋, ๋๋ถ๋ถ์ ๋ ธ๋ ฅ์ด ๋ญ๋น ๋ ์ ์์ผ๋ฏ๋ก ๋๋๋ฆฌ๊ธฐ๋ฅผ ์ ํ ์ ํํ์ง ์์์ผํฉ๋๋ค ...)
์๋ ์ปค๋ฐ์ ์ฒด๋ฆฌ๋ฅผ ๋ฐ๋์ต๋๊น? ์ ์ด๋ ๋์๊ฒ ๋ช ํํ์ง ์์ @comex ์ ์ฝ๋ฉํธ์์ ( "Lust๊ฐ ์ฌ์ฉํ๋ LLVM 9.0 ๋ธ๋์น์ ํฌํจ๋์ด์๋ค"๋ ๊ฒ์ LLVM 9.0์ ์ผ๋ถ์ผ ์๋ ์์์ ์๋ฏธ ํ ์๋ ์์ต๋๋ค).
๋ฌธ์ ์ ์ปค๋ฐ์ ํจ์ ํธ์ถ์ ๋จ์ผ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํ๊ณ ๋ฌธ์ ๊ทธ๋๋ก it is safe [in this case] to add SCEV::FlagNSW
๋ผ๊ณ ๋งํ๋ ๋งค์ฐ ์ง์ญ์ ์ด๊ณ ์์ ๋ณ๊ฒฝ ์ฌํญ ์
๋๋ค (์ฝ๋์์ ํ๋จ ํ ๋ ์ ๋งค๊ฐ ๋ณ์๋ SCEV::FlagNUW
). ๊ทธ๋์ ์ด๊ฒ์ด ๋ฐ๋ก ์ด๊ฒ์ด ์ค ์ต์ ํ์ ์์ธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐ (์ : (void)getAddRecExpr(getAddExpr(StartVal, Accum, Flags), Accum, L, Flags);
๋ฅผ (void)getAddRecExpr(getAddExpr(StartVal, Accum), Accum, L, Flags);
)ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์์ ํ์ธํ ์ ์์ต๋๋ค.
๋์ฑ์ด,์ด ๋ฌธ์ ๊ฐ์๋ ์ปค๋ฐ์ ์ฒด๋ฆฌ๋ฅผ ๋ฝ์ง _ ์์์ต๋๋ค _. ๋จ์ง ๋ถ์ด ์ผ๋ฟ์ ๋๋ค. 9.0.0์ด ์์ฑ ๋ ํ ๋ณต๊ท๊ฐ ๋ฐ์ํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ ์คํธ๋ฆผ 9.0.0 ์๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ๋๋ ๋งค๊ฐ ๋ณ์๊ฐ ์์ต๋๋ค. ๋๋๋ฆฌ๊ธฐ ๋ ์ด๋ค ์ด์ ๋ก ๋ 9.0.1๋ก ๋ฐฑ ํฌํธ ์๋ ๋๋๋ฆฌ๊ธฐ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์ nsw
๋๋ nuw
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ค์ ๋ก ์์ ํ์ง ์์ ์ด์ ๋ฅผ ์ค๋ช
ํ๋ ์ฃผ์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋ํด LLVM ๊ฐ๋ฐ์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ง๋ง, ๋๋๋ฆผ์ ์ ํํ๋ฉด์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ๋๋ฌด ์๊ณ ๋
๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ ํจ๊ณผ๊ฐ ์ ํ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
PS @comex ์ ๊ทผ๋ณธ ์์ธ์ ๋ํ ์์ฒญ๋ ๋ช ์ฑ. ํ์์ ์ธ ์ง์ .
FWIW https://github.com/llvm/llvm-project/commit/58e8c793d0e43150a6452e971a32d7407a8a7401 ์ด ์ฒด๋ฆฌ ์ ํ์ ์์ ํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ ๋ณด์์ ์ธ ๋ณ๊ฒฝ์ ๋๋ค. SCEV nowrap ํ๋๊ทธ์ ๋ฌธ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ https://lists.llvm.org/pipermail/llvm-dev/2019-September/135195.html์ ์ฐธ์กฐํ์ญ์์ค.
# 67174๋ฅผ ๋ ๋๋ฆฐ ํ์๋ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์์๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์์ Windows, Linux ๋ฐ macOS์์ # 67174๋ก ๋ ๋๋ฆฐ ์ต์ ์ผ๊ฐ์ ์ฌ์ฉํ์ฌ ์์ ์ ์ผ๋ก segfaultํ๋ ์ฝ๊ฐ ๋ ๊ธธ์ง๋ง ์ฌ์ ํ ์์ ํ ํ๋ก๊ทธ๋จ์ ๋๋ค.
fn do_test(x: usize) {
let mut arr = vec![vec![0u8; 3]];
let mut z = vec![0];
for arr_ref in arr.iter_mut() {
for y in 0..x {
for _ in 0..1 {
z.reserve_exact(x);
let iterator = std::iter::repeat(0).take(x);
let mut cnt = 0;
iterator.for_each(|_| {
z[0] = 0;
cnt += 1;
});
let a = y * x;
let b = (y + 1) * x - 1;
let slice = &mut arr_ref[a..b];
slice[1 << 24] += 1;
}
}
}
}
fn main() {
do_test(1);
do_test(2);
}
Windows :
PS> rustup run nightly rustc --version
rustc 1.43.0-nightly (6d0e58bff 2020-02-23)
PS> rustup run nightly cargo run --release
Finished release [optimized] target(s) in 0.01s
Running `target\release\rust-segfault.exe`
error: process didn't exit successfully: `target\release\rust-segfault.exe` (exit code: 0xc0000005, STATUS_ACCESS_VIOLATION)
๋ฆฌ๋ ์ค :
$ rustup run nightly rustc --version
rustc 1.43.0-nightly (6d0e58bff 2020-02-23)
$ rustup run nightly cargo run --release
Finished release [optimized] target(s) in 1.13s
Running `target/release/rust-segfault`
Segmentation fault (core dumped)
๋งฅ OS:
ฮป rustup run nightly rustc --version
rustc 1.43.0-nightly (6d0e58bff 2020-02-23)
ฮป rustup run nightly cargo run --release
Finished release [optimized] target(s) in 0.01s
Running `target/release/rust-segfault`
[1] 24331 segmentation fault rustup run nightly cargo run --release
์ด ํ๋ก๊ทธ๋จ์ codegen ๋จ์์ ์์ ์์กดํ์ง ์์ผ๋ฏ๋ก Playground ์์๋ segfault (์์ , ๋ฒ ํ ๋ฐ ์ผ๊ฐ)ํฉ๋๋ค. ๋ํ LLVM 9์ ์ฐ๊ฒฐ๋ ๋ง์คํฐ (# 67174๊ฐ ๋ ๋๋ฆฐ ์ํ)์์ rustc
๋ฅผ ์ปดํ์ผํ์ฌ์ด๋ฅผ ์ฌํํ์ต๋๋ค.
๊ธฐ๋ณธ LLVM ๋ฒ๊ทธ๋ ์ฌ์ ํ ๋์ผํ๋ฏ๋ก LLVM 10์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ LLVM ์์ ์ ์ ํํ๋ฉด segfault๊ฐ ์ฌ๋ผ์ง๋๋ค.
๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํดํ์ผ๋ฉด ์ข๊ฒ ์ด์. ์๋ชป ์บ์ ๋ SCEV ๊ฐ์์ ๋น๋กฏ๋ ์ถ๊ฐ nuw
๋๋ฌธ์ ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์ ๊ฑฐ ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค ( @nikic์ด ์ฐ๊ฒฐ๋ ์ค๋ ๋์ C ํ๋ก๊ทธ๋จ cnt
๋ณ์ ์ ๊ฑฐ)์ด ๋งค์ฐ ๋ค๋ฅด๊ฒ ๋ณด์ด๋ LLVM IR๋ก ์ด์ด์ง๊ณ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋ค๋ ๊ฒ์
๋๋ค.
๋ด ์ธ์์ 1.41.1์ด ๋ฐฉ๊ธ # 69359 (๋ด ๋ถ๋ถ์ ํ์ด๋ฐ์ด ์ข์ง ์์)์์ ๋ง๋ฌด๋ฆฌ ๋์๊ธฐ ๋๋ฌธ์์ด ์์ ์์ ํ ์์๋ ์ผ์ด ๋ง์ง ์๋ค๋ ๊ฒ์
๋๋ค. LLVM ๋ฌธ์ ์ ๋ํ ๋ ์์ธํ ์ค๋ช
๊ณผ ํจ๊ป Layout::repeat()
์ ์ฃผ์ ์ ์
๋ฐ์ดํธํ๋ ๊ฒ์ด ์ ์ด๋ ์ข์ ์๊ฐ์
๋๊น? ๊ทธ๋ ๋ค๋ฉด PR์ ๋ณด๋ผ ์ ์์ต๋๋ค.
๋ด ์ธ์์ 1.41.1์ด ๋ฐฉ๊ธ # 69359 (๋ด ๋ถ๋ถ์ ํ์ด๋ฐ์ด ์ข์ง ์์)์์ ๋ง๋ฌด๋ฆฌ ๋์๊ธฐ ๋๋ฌธ์์ด ์์ ์์ ํ ์์๋ ์ผ์ด ๋ง์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
1.41.1์ ํฌํจ ๋ ํจ์น๋ก ๋ฌธ์ ๊ฐ ์ค์ ๋ก ํด๊ฒฐ๋์ง ์์ผ๋ฉด ์ ์์ ์ฌํญ์ ๋ฐฑ ํฌํธํ๊ณ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ค์ ๋น๋ํ ์ง ์ฌ๋ถ๋ฅผ ์ฌ๊ณ ํด์ผํฉ๋๋ค. ์ด ๋ฆด๋ฆฌ์ค ํ ํ์ํ์ง์ ๋ฐฑ ํฌํธ LLVM ์์ ์ ํฉ์ํ์ง๋ง, ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๋ค๋ฅธ ์์ PoC์ด ์ฃผ์ ์ ๋ํ ๋ค๋ฅธ ๋
ผ์๋ฅผ ๋ณด์ฆ ํ ์ ์๊ฐํฉ๋๋ค.
cc @ Mark-Simulacrum @ rust-lang / release
@dfyz ์ฐ๋ฆฌ๋ LLVM ํฝ์ค๊ฐ ๋ฐฑ ํฌํธ ๋ 1.41.1์ ๋ ๋ค๋ฅธ ๋น๋๋ฅผ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
FWIW, ์ ์๊ฒ ์๋ก์ด ์ฌํ ๊ธฐ๋ ์์ ์ ์ธ 1.38.0 ๋ฐ ์ด์ ๋ฒ์ ์์ ์์๋๋ก ์๋ํ์ง๋ง ( index out of bounds
) 1.39.0 ์ด์์์๋ segfault์
๋๋ค. 1.38๊ณผ 1.39 ์ฌ์ด์ LLVM์๋ ๋ง์ ์ฐจ์ด๊ฐ ์์ง๋ง (https://github.com/rust-lang/llvm-project/compare/71fe7ec06b85f612fc0e4eb4134c7a7d0f23fac5...8adf9bdccfefb8d03f0e8db3bgen012fb41da1580a4) ๊ธธ์ ๋ฐ๋ผ๋.
์ ์ฌ์์ฐ ๊ธฐ๋ ์์ ์ ์ธ 1.38.0์์ ์์๋๋ก ์๋ํฉ๋๋ค (๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ธ๋ฑ์ค).
๋๋ (์ค์๋ก) 1.38.0์์ -C codegen-units=1
์ค์ ์ด segfault๋ฅผ ์ฌํํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. 1.37.0์ ๋์๊ฒ ์์ ํด ๋ณด์
๋๋ค (๋ด๊ฐ ์๋ํ ์ต์
์กฐํฉ์ด segfault๋ฅผ ์์ฑํ์ง ์์).
1.37.0์ LLVM 8์ ์ฌ์ฉํฉ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ 1.37.0๊ณผ 1.38.0 ( -C codegen-units=1
) ์ฌ์ด์ LLVM IR ์ฐจ์ด๋ ํ ์ค์ ๋ถ๊ณผํฉ๋๋ค.
- %71 = icmp eq {}* %70, null
+ %71 = icmp ule {}* %70, null
( %70
๋ <core::slice::IterMut<T> as core::iter::traits::iterator::Iterator>::next()
์ ๊ฒฐ๊ณผ์์ ํ์ ๋จ)
์ด๊ฒ๋ง์ผ๋ก๋ LLVM์ ์์ฌ nuw
๋ฅผ add nuw i64 %x, -1
์์ต๋๋ค.
1.37.0์ ๋์๊ฒ ์์ ํด ๋ณด์ ๋๋ค (๋ด๊ฐ ์๋ํ ์ต์ ์กฐํฉ์ด segfault๋ฅผ ์์ฑํ์ง ์์).
๊ทธ๊ฒ์ LLVM 8์ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ๋น๋๋ฐ๋ SCEV ๋ณ๊ฒฝ์ด ์ ํ ์กด์ฌํด์๋ ์๋ฉ๋๋ค.
LLVM 8์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํผ๋์ค๋ฌ์์ ์ฃ์กํฉ๋๋ค (LLVM ๋ฒ์ ์ ํ์ธํ์ง๋ ์์ ํ ์ค ์ฐจ์ด๋ก ์ค์ด๊ฒ๋์ด ๋๋ฌด ๊ธฐ๋ปค์ต๋๋ค).
์ฐ๋ฆฌ๋ LLVM ์์ ์ฌํญ์ด ํฌํจ ๋ ์๋ก์ด 1.41.1 ์ํฐํฉํธ๋ฅผ ์ค๋นํ์ต๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ํ ์คํธ ํ ์ ์์ต๋๋ค.
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable
https://github.com/rust-lang/rust/issues/69225#issuecomment -586941455์์ ํ
[triagebot]์ด ๋ฌธ์ ๋ ํ๋ ์ปดํ์ผ๋ฌ ํ์ ๊ฐ์
์์ด ์ฑ๊ณต์ ์ผ๋ก ํด๊ฒฐ๋์์ต๋๋ค.
์ข์ Bretty.
1.41.1์ด ๋์์ผ๋ ๋ง์นจ๋ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
LLVM IR ์ฌ์๊ธฐ : https://gist.github.com/comex/881074b1bcc545e299e65527c719eef4
opt bconfused.ll -scalar-evolution -loop-idiom -scalar-evolution -indvars -S -O3 -o - | grep xprint
ํฉ๋๋ค. ๊ดํธ ์์ดi64 -1
์ด๋ฉด ๋ฒ๊ทธ๊ฐ์๋ ์ต์ ํ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ... ์์ ์๋ ์์ง๋ง ํ์ ํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.LLVM์์ Induction Variable Simplification ํจ์ค์ ์ผ๋ถ๋ก
nuw
๋ฅผadd nuw i64 %x, -1
์๋ชป ์ถ๊ฐ ํ ๊ฒ ๊ฐ์ต๋๋ค.x
๋ ํจ์์ ๋ํ ์ธ์์ด๊ณnuw
๋ ์๋ช ๋์ง ์์ ๋ฉ์ด ์์์ ์๋ฏธํ๋ฏ๋ก ์ธ์๊ฐ ๋ณด์ฅ๋์ง ์๋ ํจ์์ ์ง์ ์์ ์ธ์๊ฐ 0์ด๋ผ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฃผ์ฅํฉ๋๋ค.Bisecting (ํธ์ง : LLVM 9์์ LLVM 10์ผ๋ก, @tmiasko ๋ ์ํฅ์๋ฐ์ง
r366419 (์์ ์ปค๋ฐ์ด ๋ ๋๋ฆฌ๋ ์ปค๋ฐ)๊ฐ Rust๊ฐ ์ฌ์ฉํ๋ LLVM 9.0 ๋ธ๋์น์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ง ํด ๋ณด์ ๋๋ค.