Rust: Rustc๋Š” std::ptr::read_volatile์ด ์žˆ๋Š” [ํฐ] ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•  ๋•Œ llvm codegen ๋™์•ˆ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 08์›” 27์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด ๋ฌธ์ œ๋Š” Windows, OSX ๋ฐ Linux์—์„œ ์•ˆ์ •์ ์ด๊ณ  ์•ผ๊ฐ„์— ์žฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

cargo 1.28.0 (96a2c7d16 2018-07-13)
release: 1.28.0
commit-hash: 96a2c7d16249cb47c61c887fc95ca8be60e7ef0a
commit-date: 2018-07-13

cargo 1.29.0-nightly (6a7672ef5 2018-08-14)
release: 1.29.0
commit-hash: 6a7672ef5344c1bb570610f2574250fbee932355
commit-date: 2018-08-14

์•”ํ˜ธ:

fn main() {
    let x = [0u8; 128 * 128 * 4];
    let _y = unsafe { std::ptr::read_volatile(&x) };
}

์ตœ์†Œํ•œ์˜ ์žฌํ˜„์„ ์œ„ํ•ด @talchas ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด _volatile ์—†์ด ๊ทธ๊ฒƒ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค.

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

์ •ํ™•ํžˆ ๋งํ•˜๋ฉด _volatile ์—†์ด ๋…น์Šฌ์ง€ ์•Š๊ณ  ์žฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. --emit llvm-ir ์ถœ๋ ฅ์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‚ด ์‹œ์Šคํ…œ llc(๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ฒ„์ „์—์„œ)๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์ง€๋งŒ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ segfaulted

define internal void @_ZN3foo4main17hb80e1f71fc6968e1E() unnamed_addr #0 {
start:
  %_y = alloca [65536 x i8], align 1
  %0 = load volatile [65536 x i8], [65536 x i8]* %_y, align 1
  ret void
}

๋˜๋Š”

define internal void @_ZN3foo4main17hb80e1f71fc6968e1E() unnamed_addr #0 {
start:
  %_y = alloca [65536 x i8], align 1
  %0 = load [65536 x i8], [65536 x i8]* %_y, align 1
  ret void
}

๊ด€๋ จ ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ •ํ™•ํžˆ ๋งํ•˜๋ฉด _volatile ์—†์ด ๋…น์Šฌ์ง€ ์•Š๊ณ  ์žฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. --emit llvm-ir ์ถœ๋ ฅ์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‚ด ์‹œ์Šคํ…œ llc(๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ฒ„์ „์—์„œ)๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์ง€๋งŒ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ segfaulted

define internal void @_ZN3foo4main17hb80e1f71fc6968e1E() unnamed_addr #0 {
start:
  %_y = alloca [65536 x i8], align 1
  %0 = load volatile [65536 x i8], [65536 x i8]* %_y, align 1
  ret void
}

๋˜๋Š”

define internal void @_ZN3foo4main17hb80e1f71fc6968e1E() unnamed_addr #0 {
start:
  %_y = alloca [65536 x i8], align 1
  %0 = load [65536 x i8], [65536 x i8]* %_y, align 1
  ret void
}

๊ด€๋ จ ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

https://bugs.llvm.org/show_bug.cgi?id=37000 ์€ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” LLVM ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜: ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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