Rust: Std::ptr::read_volatile рдХреЗ рд╕рд╛рде [рдмрдбрд╝реЗ] рд╕рд░рдгреА рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╕рдордп Rustc llvm codegen рдХреЗ рджреМрд░рд╛рди рд▓рдЯрдХ рдЬрд╛рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЕрдЧре░ 2018  ┬╖  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) };
}

рдиреНрдпреВрдирддрдо рд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП _volatile рдмрд┐рдирд╛ рднреА рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд┐рдирд╛ _volatile рдХреЗ рдЬрдВрдЧ рдореЗрдВ рджреЛрдмрд╛рд░рд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛; рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдПрд▓рдПрд▓рд╕реА (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрднрд╡рддрдГ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ) --emit llvm-ir рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп 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 рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

modsec picture modsec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Robbepop picture Robbepop  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmegaffin picture jmegaffin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dwrensha picture dwrensha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lambda-fairy picture lambda-fairy  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ