Rust: рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдореЗрдВ рд╕реНрдореГрддрд┐ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдлрд╝рд░ре░ 2020  ┬╖  38рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ (рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг) рдЬреЛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд░рдгреА рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдЖрдЙрдЯ-рдСрдл-рдмрд╛рдЙрдВрдб рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред cargo run --release рд╕реНрдерд┐рд░ 1.41.0 рд░рд┐рд▓реАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИ (macOS 10.15 рдФрд░ Ubuntu 19.10 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛):

0 0 3 18446744073709551615
[1]    21065 segmentation fault  cargo run --release

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ 2**64 - 1 рдХреА рд▓рдВрдмрд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪреЗрдХрд┐рдВрдЧ рдХреА рд╕реАрдорд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред 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.

рдЕрдЧрд░ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд░реВрдБ рддреЛ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ:

  • рдпрд╛ рддреЛ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рд╣рдЯрд╛рдиреЗ do_test(...); рдореЗрдВ рдХреЙрд▓ main() ;
  • for _ in 0..1 { рд▓реВрдк рдирд┐рдХрд╛рд▓реЗрдВ;
  • for y in 0..1 { рд╕рд╛рде for y in 0..x { рд▓реВрдк рдмрджрд▓реЗрдВ;
  • 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 рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ);
  • cargo-bisect-rustc рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдЧрдорди рдкрд╣рд▓реЗ 2019-12-12 рд░рд╛рдд рдореЗрдВ рд╣реБрдЖ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ ред рдпрд╣ рдореБрдЭреЗ рд╕рдВрджреЗрд╣рд╛рд╕реНрдкрдж рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ 1.40.0 , рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рддрд┐рдерд┐ рдХреЗ рдмрд╛рдж рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

GitHub рд░реЗрдкреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд╛рд░реНрдЧреЛ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ 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);
}
A-LLVM C-bug I-unsound ЁЯТе ICEBreaker-LLVM P-medium T-compiler regression-from-stable-to-stable

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

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 рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдбрдХреНрд╢рди рд╡реИрд░рд┐рдПрдмрд▓ рд╕рд░рд▓реАрдХрд░рдг рдкрд╛рд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ 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 рдХреЗ рд░реВрдк рдореЗрдВ (рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ рдХрд┐ рдКрдкрд░ рдкреНрд░рддрд┐рдмрджреНрдз reverts) LLVM 9.0 рд╢рд╛рдЦрд╛ рдЬрдВрдЧ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

рд╕рднреА 38 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cc @ рдЬрдВрдЧ-рд▓рдВрдЧ / рд╕рдВрдХрд▓рдХ
@rustbot рдкрд┐рдВрдЧ рдЖрдЗрд╕рдмреНрд░реЗрдХрд░реНрд╕-llvm

рд░рд┐рд▓реАрдЬрд╝ рдЯреАрдо рд░реБрд╕реНрдЯ 1.41 рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рдВрджреБ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реА рд╣реИ (рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдХреА рдмреИрдардХ рдореЗрдВ рдЗрд╕рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЪрд░реНрдЪрд╛ рдХреА), рдФрд░ рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЬрд▓реНрдж рд╣реА рдПрдХ рдкреАрдЖрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред

рд╣реЗ LLVM ICE-рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ! рдЗрд╕ рдмрдЧ рдХреА рдкрд╣рдЪрд╛рди рдПрдХ рдЕрдЪреНрдЫреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЧрдИ рд╣реИ
"рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрд╕реАрдИ-рдмреНрд░реЗрдХрд┐рдВрдЧ рдЙрдореНрдореАрджрд╡рд╛рд░"ред рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдпрд╣рд╛рдБ рдХреБрдЫ рд╣реИрдВ
[рдирд┐рд░реНрджреЗрд╢] рдмрдЧ рдХреЗ рдЗрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдПред рд╢рд╛рдпрдж рджреЗрдЦ рд▓реЗрдВ?
рдзрдиреНрдпрд╡рд╛рдж! <3

cc @comex @DutchGhost @ hanna-kruppe @hdhoang @heyrutvik @ JOE1994 @jryans @mmilenko @nagisa @nikic @ рдиреЛрд╣рд╛-рдХреИрдиреЗрдбреА @SvvoshZarrasvand @spastorino @vertexclique @vgxbjj

рдХрд╛рд░реНрдЧреЛ рд░рди рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЪрд▓рд╛рдирд╛ - рд╕реНрдерд┐рд░ 1.41.0 рд░рд┐рд▓реАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ (рдореИрдХрдУрдПрд╕ 10.15 рдФрд░ рдЙрдмрдВрдЯреВ 10.10 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдореИрдВ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ ред рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо 1.41.0 рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрд╣, рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдорд┐рд░реА рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдпреВрдмреА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЧрд▓рдд рдорд┐рд╕рд╛рд▓ рд╣реИред

рдмрд╕ рдПрдХ рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдирд╡реАрдирддрдо рд░рд╛рдд рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

[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

рдореИрдВ 1 рд░реВрд╕реНрдЯ 1.41 рд╕реНрдерд┐рд░ рдХреЗ рд╕рд╛рде рдареАрдХ рдЙрд╕реА рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЬрдВрдЧ 1.40 рд╕реНрдерд┐рд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

$ ./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.

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм @dfyz рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣

  • cargo-bisect-rustc рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдЧрдорди рдкрд╣рд▓реА рдмрд╛рд░ 2019-12-12 рд░рд╛рдд рдореЗрдВ рд╣реБрдЖ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ ред рдпрд╣ рдореБрдЭреЗ рд╕рдВрджреЗрд╣рд╛рд╕реНрдкрдж рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ 1.40.0 , рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рддрд┐рдерд┐ рдХреЗ рдмрд╛рдж рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред 1.40.0 рдХреЛ 2019-12-19 рдХреЛ рдЙрд╕ рд╕рдордп beta рдмреНрд░рд╛рдВрдЪ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ master 6. https://doc.rust-lang.org/book/appendix-07-nightly-rust.html рджреЗрдЦреЗрдВред

рдЕрдЧрд░ рдореБрдЭреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдерд╛, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ https://github.com/rust-lang/rust/pull/67015 рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд░рд╛рдзреА рд╣реИред рдпрд╣ 3 рдХреЛрдбрдЬреЗрди рдореБрджреНрджреЛрдВ рдХреЛ рддрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдбрдЧреЗрди-рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдХреЛрдб рдХреЛ рдЫреВрддрд╛ рд╣реИред
Cc @ osa1 @ oli-obk @wesleywiser

рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ # 67015 рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ # 67015 рд╕рд┐рд░реНрдл рдПрдХ рдореМрдЬреВрджрд╛ рдмрдЧ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИред

рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд░рд╛рдд рднрд░ рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдХрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдЗрд╕ config.toml рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдореЗрд░реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ:

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]

рд░рд╛рдд рдореЗрдВ рд╕рд░рд╕рд░рд╛рд╣рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдореИрдВрдиреЗ рдХреЙрдиреНрд╕реНрдЯрдкреНрд░реЙрдк рд╕реЗ тАЛтАЛрдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдордЖрдИрдЖрд░ рдХреА рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдПрдордЖрдИрдЖрд░ рд╕рдорд╛рди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдХреЙрдиреНрд╕реНрдЯрдкреНрд░реЙрдк рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд╣реАрдВред

033662dfbca088937b9cdfd3d958484015b5e375b2 рдореЗрдВ рдкреНрд░рддрд┐рдЧрдорди

@rustbot рд▓реЗрдмрд▓ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ: -E-


@ osa1 debug-assertions = true рд╢рд╛рдпрдж рджреЛрд╖ рд╣реИред рдЬрдм рдореИрдВ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ (рдПрдХ рд╡реИрдирд┐рд▓рд╛ рдирд╛рдЗрдЯрд▓реА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде) рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо -C debug-assertions=y рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреИрдирд┐рдХ рдХреЗ рдмрдЬрд╛рдп рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдХреЗ рд╕рд╛рдеред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛! A983e0590a43ed8b0f60417828efd4e79b51f494 рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реЗ рджрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкрд░рд╛рдзреА рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдкрд░ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ :) рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкреАрдЖрд░ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ рдЯреЗрд╕реНрдЯрдХреЗрд╕ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрджрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ? рдпрд╣рд╛рдБ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдзрдиреНрдпрд╡рд╛рдж!

(рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрдкреА рджреНрд╡рд╛рд░рд╛ bisected рдерд╛)

рдореИрдВ debug-assertions рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @ hellow554)ред

рд░реЛрд▓рдЕрдк рдореЗрдВ рдХреБрдЫ PRs рдХрд╛ рдЙрд▓реНрдЯрд╛ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдШрд░реНрд╖ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрдм рд╕реЗ rustfmt -ed рд╕рдм рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ # 67174 рдХреЗ рдХрд╛рд░рдг рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдЙрд╕реА рд╕рдордп рдкрд╛рдпрд╛ рд╣реИ @shahn :)

@lqd рд╣рд╛рдБ, рдпрд╣ рд╡рд╣ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдз рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд╣ рдЕрдкрд░рд╛рдзреА рд╣реИред

рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рддрдм рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрдм codegen-units 3 рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо (рд░рд┐рд▓реАрдЬрд╝ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдорд╛рдирдХрд░, incremental=false ) рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм codegen-units 4 рдпрд╛ рдЕрдзрд┐рдХ рд╣реЛ рддреЛ рдореИрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

LLVM рдЬрдВрдк рдереНрд░реЗрдбрд┐рдВрдЧ рдкрд╛рд╕ рдХреЗ рдмрд╛рдж panic_bounds_check рдХрд╛ рдХреЙрд▓ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ LLVM 9 рд╕реЗ рдСрдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди LLVM 10 рд╕реЗ рдирд╣реАрдВред

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ 1 67174 рдХреЗ рдмрд┐рдирд╛ ./x.py build -i --stage 1 --keep-stage 0 src/libstd 1 rustc ( ./x.py build -i --stage 1 ) рдХрд╛ рдЪреЗрдХ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдФрд░ ./x.py build -i --stage 1 --keep-stage 0 src/libstd 67174 рдХреЗ рдмрд┐рдирд╛ libstd ( ./x.py build -i --stage 1 --keep-stage 0 src/libstd ) рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдФрд░ segfaulting рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдЪрд╛рд░ рдХреЛрдбрдЬрди рдЗрдХрд╛рдЗрдпрд╛рдВ ( rustc +stage1 -C opt-level=3 -C codegen-units=4 main.rs )ред рдЬреИрд╕реА рдХрд┐ рдЙрдореНрдореАрдж рдереА, рдЗрд╕рдиреЗ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдХреЛ рджреВрд░ рдХрд░ рджрд┐рдпрд╛ред рдЕрдЧрд░ рдореИрдВ # 67174 рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рджреЛ рд╕рдВрдХрд▓рдХ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ рдЬреЛ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрди рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЛ GOOD (no segfault) рдФрд░ BAD (segfault) рдХрд╣рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рддрдм рджреЗрдЦрд╛ рдХрд┐ *.ll _ GOOD ( -C no-prepopulate-passes ) рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди 4 _unoptimized_ *.ll рдлрд╛рдЗрд▓реЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдВ, рдЬреЛ BAD (рдХреЗрд╡рд▓ рдЕрдВрддрд░) рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдИрдбреА рдереЗ), рд▓реЗрдХрд┐рди _optimized_ *.ll рдлрд╝рд╛рдЗрд▓реЗрдВ (рдХреЛрдИ -C no-prepopulate-passes ) рдмреЗрддрд╣рд╛рд╢рд╛ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИ, рджреЛрдиреЛрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдЪрд┐рдд рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд░ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдВрддрд░ рд╣реИ, I _think_ LTO рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдореИрдВ -Z thinlto=no , -C lto=no , -C lto=yes , -C lto=thin (рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рднреА рд░реВрдкреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ -C lto ThinLTO рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд╕реЗ BAD рддрдХ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ LTO рдпрд╣рд╛рдБ рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИ?

рдореИрдВрдиреЗ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдкрдврд╝рд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд╣ рд╡рдЪрди рдкрдврд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдЕрднреА рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЯреВрдЯ рдЧрдпрд╛?

рдХреНрдпрд╛ рдЯреВрдЯ рдЧрдпрд╛?

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЯреВрдЯ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЕрд╕реНрдерд╛рдпреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╣ рд╣реИ (рдХреГрдкрдпрд╛ рдирдордХ рдХреЗ рдПрдХ рджрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдВ, рдореИрдВ рд░рд╕реНрдЯ рдЯреАрдо рдпрд╛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЯреАрдо, рд╕рднреА рдкрд░ рдирд╣реАрдВ рд╣реВрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореЗрдВ рдШреВрд░ рд╕рдХрддреЗ рд╣реИрдВ):

  • рд╣рдордиреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ Layout::repeat() рдореЗрдВ рдПрдХ рдПрдХрд▓ рд▓рд╛рдЗрди рд╕реЗ рдУрд╡рд░рдлреНрд▓реЛ рдЪреЗрдХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдВрддрддрдГ рдпрд╣ рдореЗрдореЛрд░реА рдЕрдиреИрдлрд┐рд▓рд┐рдЯреА рд╣реЛ рдЧрдИред рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЬреЛрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА (рдФрд░ Layout::pad_to_align() ) рдпрд╣ рднреА рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ;
  • рдореЗрд░реА рдХреЛрдб рдореБрджреНрджрд╛ рдкреНрд░рджрд░реНрд╢рди рдирдореВрдирд╛ рднреА рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдлреЛрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ Vec , рдЬреЛ рдкрд░реЛрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ Vec::reserve_internal() рд╣реИ, рдЬреЛ рдмрд╛рд░реА-рдмрд╛рд░реА рдХреЙрд▓ Layout::repeat() ;
  • Layout::repeat() #[inline] рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ GOOD рдФрд░ BAD рдмреАрдЪ рдХреЗрд╡рд▓ рдпрд╣реА рдЕрдВрддрд░ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди do_test() рдореЗрдВ рдЭреБрдХрд╛ рд╣реИ? рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЪреЗрдХ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ; #[inline] рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ; рдПрд▓рдЯреАрдУ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ), рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рджреБрд╖реНрдЯ рдПрд▓рдПрд▓рд╡реАрдПрдо рдкрд╛рд╕ рдпрд╛ рдкрд╛рд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдЖрдИрдЖрд░ рдХреЛ рдЧрд▓рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЧрд▓рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣реА рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рдЬреИрд╕реЗ рдЧреИрд░-рдПрд▓рдПрд▓рд╡реАрдПрдо-рдЖрдИрд╕реАрдИ-рдмреНрд░реЗрдХрд░ рдХреЗ рд▓рд┐рдП) рдХреНрдпреЛрдВрдХрд┐ рдЖрдИрдЖрд░ GOOD рдФрд░ BAD рдорд╛рдореВрд▓реА рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реИ рд╡рд┐рд╢рд╛рд▓ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЦрд░рд╛рдм рд╕рдВрд╕реНрдХрд░рдг panic_bounds_check , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, @tmiasko рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди LLVM рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЬрдВрдЧ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ LLVM 10rc1 рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (рдирд╡реАрдирддрдо рджреЛрд╖рдкреВрд░реНрдг LLVM рд╕рдВрд╕реНрдХрд░рдг рдЬреЛ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ 9.0.1 рд╣реИ)ред рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдк рдереНрд░реЗрдбрд┐рдВрдЧ рдкрд╛рд╕ рдХреЛ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ 9.0.1 рдФрд░ 10rc1 рдХреЗ рдмреАрдЪ рдХреЛрдИ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХрдорд┐рдЯ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред

рдпрджрд┐ Layout::repeat() рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рдПрдХ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЗ рдПрдХ рд▓рдХреНрд╖рдг рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЪреАрдЬрд╝ рдкрд▓рдЯ рд░рд╣реА рд╣реИ?

рдпрджрд┐ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрджрд▓рдирд╛ :: рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ () рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рдПрдХ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЗ рдПрдХ рд▓рдХреНрд╖рдг рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░:

  • рдкрд░рд┐рд╡рд░реНрддрди рд╢рд┐рдк рд╣реИ
  • рдпрд╣ рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ
  • рдЗрд╕реЗ рдареАрдХ рд╕реЗ рддрдп рдХрд░рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛

рдЕрдЧрд░ рдпреЗ рдкрдХрдбрд╝ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдКрдВрдЧрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдирдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд╢рд┐рдк рдХрд░реЗрдВ (рдЪреАрдЬреЗрдВ рдмрдЧреИрд░ рдареАрдХ рд╣реБрдП рднреА рдХрд╛рдо рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрдЧ рдЕрднреА рднреА рдерд╛), рдФрд░ рдлрд┐рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдЧ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВред

рдПрдХ рдФрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ред рд╣рдордиреЗ рдПрдХ рд░рд┐рд▓реАрдЬрд╝ рд╢рд╛рдЦрд╛ рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдорд╛рд╕реНрдЯрд░ рдкрд░ рдирд╣реАрдВ (рдЬреЛ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╛рдж рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛), рдПрдХ рдирдИ рдЫреЛрдЯреА рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рднреЗрдЬ рджрд┐рдпрд╛ред рдлрд┐рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдЧ рддрдп рдХрд┐рдпрд╛ред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рддрдХ рдмрдЧ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдПрдЧреА рдФрд░ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрдорд┐рдЯ рдПрдХ рдмрдЧ рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред

рддреЛ рдПрдХ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ? рдЕрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рд╢рд╛рдорд┐рд▓ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдЧреЗ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рддреБрдЪреНрдЫ for _ in 0..1 рд▓реВрдк) рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдмрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд╢реБрдн рд╣реЛ рдЧрдпрд╛ рд╣реВрдВред

рд╡реИрд╕реЗ рднреА, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдкрд░реЗрд╢рд╛рдиреА рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ @Shn Layout::new() рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдИ @SimonSapin рдиреЗ рдЬреЛ рдХрд╣рд╛ рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛):

  • Layout::repeat() рдореЗрдВ рдУрд╡рд░рдлреНрд▓реЛ рдЪреЗрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ LLVM рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рдореЗрдВ Vec::reserve() рдЗрдирд▓рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдорд╛рдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ);
  • рд╡рд╕реНрддреБрддрдГ libcore/alloc.rs ( Layout::pad_to_align() ) рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЕрдирдЪрд╛рд╣реЗ рдЬреЛрдбрд╝ рдХреЗ рд╕рдорд╛рди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдареАрдХ рдЙрд╕реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЬреЛ рдпрд╣ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИред Layout::repeat() рдореЗрдВ рдУрд╡рд░рдлреНрд▓реЛ рдХреА рдЬрд╛рдБрдЪ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рд▓реЗрдХрд┐рди Layout::pad_to_align() рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рдирд╣реАрдВ рд▓рдЧрддрд╛;
  • рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реВрдВ), рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдиреНрдп рд╡рд░реНрдХрдЖрд░реНрдб рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ stdlib рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдерд┐рдирд▓реЛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ, рдЕрдиреБрдХреВрд▓рди рд╕реНрддрд░ рдмрджрд▓реЗрдВ, рдХреЛрдбреЗрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдХрд░реЗрдВ)ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рд░рдХреНрд╖рд╛рддреНрдордХ рд░рдХреНрд╖рд╛-рдпреБрдХреНрдд рдЬреЛрд░-рдЬреЛрд░ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЖрддрдВрдХрд┐рдд рд╣реЛ рдЬрд╛рдП рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдЬ-рдХреЗрд╕ рдпрд╛ рдХреБрдЫ рдбрд┐рдмрдЧрд░-рдлрд╝реНрдпреВ рдХрд╛ рд╢рд┐рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЧрдгрдирд╛ рд╣реЛ рд░рд╣реА рд╣реИред

рдлрд┐рд░, рдЬрдм рдЗрд╕реЗ рдиреАрдЪреЗ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдХрд╣реАрдВ-рдХрд╣реАрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рд╕реАрдЦрд╛, 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 рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдбрдХреНрд╢рди рд╡реИрд░рд┐рдПрдмрд▓ рд╕рд░рд▓реАрдХрд░рдг рдкрд╛рд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ 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 рдХреЗ рд░реВрдк рдореЗрдВ (рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ рдХрд┐ рдКрдкрд░ рдкреНрд░рддрд┐рдмрджреНрдз reverts) LLVM 9.0 рд╢рд╛рдЦрд╛ рдЬрдВрдЧ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЯреА-рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреНрд░рд╛рдЗрдПрдЬ: рдкреА-рдореАрдбрд┐рдпрдо, рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░:

pnkfelix: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ # 69225 рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ рдХрд╛рд░реНрдп рдЖрдЗрдЯрдо 1. LLVM рдХреЛ рдареАрдХ рдХрд░реЗрдВ (рдпрд╛ рддреЛ рдЙрдирдХреЗ 58e8c793d0e43150a6452e971a32d7n7a8a7401 рдкрд░ рдЪреЗрд░реА рдХреЛ рдЪреБрдирдХрд░ рдпрд╛ LLVM 10 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдХреЗ) рдФрд░ рдлрд┐рд░ 2. рдкреАрдЖрд░ PR # 67174 рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
pnkfelix: рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдореБрдЭреЗ рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рд░рд╛ред
pnkfelix: рдХрдо рд╕реЗ рдХрдо, рдпрд╣ LLVM рдмрдЧ рдЕрдиреНрдп LLVM рдХреЛрдбреАрди рдмрдЧреНрд╕ рд╕реЗ рдмреЗрд╣рддрд░ рдпрд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @simulacrum рдиреЗ рдЕрднреА рдХрд╣рд╛ рд╣реИред

рдЕрдкрдбреЗрдЯ: рдПрд▓рдПрд▓рд╡реАрдПрдо 10 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдкреАрдЖрд░ # 67759 рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдЕрджреНрдпрддрди 2: рдпрд╣ рдЖрдБрдЦ рдореВрдВрджрдХрд░ рдЪреЗрд░реА-рд░рд┐рд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рд╕рдордЭ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЪреЗрд░реА рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЪреБрди рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд░рд┐рд╡рд░реНрдЯ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░, рдПрд▓рдПрд▓рд╡реАрдПрдо 10 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╕рдВрднрд╡рдд: рдЪреЗрд░реА рдХреЛ рдкрд▓рдЯрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдмрд░реНрдмрд╛рдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ ...)

рдХреНрдпрд╛ рдореВрд▓ рдкреНрд░рддрд┐рдмрджреНрдз рдЪреЗрд░реА-рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛? рдХрдо рд╕реЗ рдХрдо @ рд╡реЗрд▓рдХреНрд╕ рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЬреЛ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ ("рдПрд▓рдПрд▓рд╡реАрдПрдо 9.0 рд╢рд╛рдЦрд╛ рд░рд╕реНрдЯ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ" рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрд▓рдПрд▓рд╡реАрдПрдо 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); ) рдХреЛ рдмрджрд▓рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ _not_ рдЪреЗрд░реА-рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рджреБрд░реНрднрд╛рдЧреНрдп рд╣реИ - рдкреВрд░реНрд╡рд╡рдд рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реБрдЖ рдХреЗ рдмрд╛рдж 9.0.0 рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдирджреА рдХреЗ рдКрдкрд░ 9.0.0 рдЕрднреА рднреА рд╣реИ рд╣рдорд▓рд╛рд╡рд░ рдкреИрд░рд╛рдореАрдЯрд░ред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рд╡рд╛рдкрд╕ 9.0.1 рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ред 10.0.0-RC1 рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рд╡рд╛рдкрд╕ред

рдпрд╣рд╛рдБ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ рдЬреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, nsw рдпрд╛ nuw рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдПрд▓рдПрд▓рд╡реАрдПрдо рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреЗрд░реА-рдкрд┐рдХрд┐рдВрдЧ рд░рд┐рд╡рд░реНрдЯ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдФрд░ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╣реИред

PS- рд╡рд┐рд╢рд╛рд▓ kudos @ рдореВрд▓-рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛

FWIW рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ https://github.com/llvm/llvm-project/commit/58e8c793d0e43150a6452e971a32d7407a8a7401 рдЪреЗрд░реА-рдкрд┐рдХ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдпрд╣ рдПрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдпрд╣ рднреА рджреЗрдЦреЗрдВ рдХрд┐

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл # 67174 рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдв рд▓рд┐рдпрд╛ред рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ, рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХрдУрдПрд╕ рдкрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ # 67174 рдХреЗ рд╕рд╛рде рдирд╡реАрдирддрдо рд░рд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкреАрдЫреЗ рд╣рдЯрддрд╛ рд╣реИ:

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);
}

рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдБ:

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)

рдореИрдХ рдУ рдПрд╕:

╬╗ 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

рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдбрдЬреЗрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╕реЗрдЧрдлреБрд▓реНрдЯреНрд╕, рднреА (рд╕реНрдерд┐рд░, рдмреАрдЯрд╛ рдФрд░ рд░рд╛рдд рдкрд░)ред рдореИрдВрдиреЗ LLV 9 рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдорд╛рд╕реНрдЯрд░ (# 67174 рд░рд┐рд╡рд░реНрдЯреЗрдб) тАЛтАЛрдХреЗ рд╕рд╛рде rustc рд╕рдВрдХрд▓рди рдХрд░рдХреЗ рднреА рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ред

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдмрдЧ рдЕрднреА рднреА рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрд▓рдПрд▓рд╡реАрдПрдо 10 рдпрд╛ рдЪреЗрд░реА-рдПрд▓рдПрд▓рд╡реАрдПрдо рдлрд┐рдХреНрд╕ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рд╕реАрдЧрдлреЙрд▓реНрдЯ рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рдХрд┐ рдмреЗрд╣рддрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реАрдорд╛ рдЪреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд nuw рд╡рдЬрд╣ рд╕реЗ @ рдорд┐рд▓рд┐рдХ рд╕реЗ рд▓рд┐рдВрдХ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдЦрд░рд╛рдм рдЕрдиреБрдХреВрд▓рди рд╣реЛрддрд╛ рд╣реИ, рддрдм рддрдХ рдореИрдВ рдПрд▓рдПрд▓рд╡реАрдПрдо рдмреБрдирд┐рдпрд╛рджреА рдмреНрд▓реЙрдХреЛрдВ рдХреА рдкрд░рддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реВрдВ; рдмрджрддрд░, рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдХреЛрдИ рднреА рдкреНрд░рддреАрдд рдирд╣реАрдВ-рдЕрдк рдкрд░рд┐рд╡рд░реНрддрди (рдЬреИрд╕реЗ, cnt рдЪрд░) рдХреЛ рд╣рдЯрд╛рдХрд░ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдмрд╣реБрдд рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЧрд╛рдпрдм рдХрд░ рджреЗрддрд╛ рд╣реИред

рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рез.рекрез.рез рдХреЛ рд╕рд┐рд░реНрдл # рем реп рейрел реп (рдореЗрд░реА рдУрд░ рд╕реЗ рдЦрд░рд╛рдм рд╕рдордп) рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдПрд▓рдПрд▓рд╡реАрдПрдо рдореБрджреНрджреЗ рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде Layout::repeat() рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореИрдВ рдПрдХ рдкреАрдЖрд░ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВред

рдореЗрд░реА рдзрд╛рд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рез.рекрез.рез рдХреЛ рд╕рд┐рд░реНрдл # рем реп рейрел реп (рдореЗрд░реА рдУрд░ рд╕реЗ рдЦрд░рд╛рдм рд╕рдордп) рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо 1.41.1 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреИрдЪ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдореЗрдВ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдирдП рдирд┐рд░реНрдзрд╛рд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд░рд┐рд╣рд╛рдИ рдЯреАрдо рдХреА рдмреИрдардХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ backport LLVM рджреБрд╡рд┐рдзрд╛ рдореЗрдВ рдЖрдо рд╕рд╣рдорддрд┐ рдереА, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдЗрд╕ рдирдП PoC рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдФрд░ рдЪрд░реНрдЪрд╛ рд╡рд╛рд░рдВрдЯ рд╕рдХрддрд╛ рд╣реИред

cc @ Mark-Simulacrum @ рдЬрдВрдЧ-рд▓рдВрдЧ / рд░рд┐рд▓реАрдЬ

@dfyz рд╣рдо рдПрд▓рдПрд▓рд╡реАрдПрдо рдлрд┐рдХреНрд╕ рдмреИрдХрдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде 1.41.1 рдХрд╛ рдПрдХ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд┐рдкрд┐рдВрдЧ рдкрд░ рдЖрдо рд╕рд╣рдорддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореЗрд░реЗ рд▓рд┐рдП рдирдпрд╛ рдкреНрд░рдЬрдирдирдХрд░реНрддрд╛ 1.38.0 рдФрд░ рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕реНрдерд┐рд░ (рдкреВрд░реНрд╡ рдореЗрдВ index out of bounds ) рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 1.39.0 рдФрд░ рдмрд╛рдж рдореЗрдВ segfaultsред LLVM рдореЗрдВ 1.38 рдФрд░ 1.39 (https://github.com/rust-lang/llvm-project/compare/71fe7ec06b85f612fc0e4eb4c4a7a7d0f23fac5...8adf9bdccfebb8d03/03/03) рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рд░рд╛рд╕реНрддреЗ рдореЗрдВ рднреАред

рдирдпрд╛ рдкреНрд░рдЬрдирдирдХрд░реНрддрд╛ 1.38.0 рдкрд░ рд╕реНрдерд┐рд░ (рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░) рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдореБрдЭреЗ (рдЧрд▓рддреА рд╕реЗ) рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ 1.38.0 рдкрд░ -C codegen-units=1 рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддреА рд╣реИред 1.37.0 рдореЗрд░реЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдВрдпреЛрдЬрди рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ рдЬреЛ рдПрдХ segfault рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ)ред

рдЙрдкреЗрдХреНрд╖рд╛, 1.37.0 рдПрд▓рдПрд▓рд╡реАрдПрдо 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ 1.37.0 рдФрд░ 1.38.0 ( -C codegen-units=1 ) рдХреЗ рдмреАрдЪ рднрд┐рдиреНрди рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ

- %71 = icmp eq {}* %70, null
+ %71 = icmp ule {}* %70, null

(рдЬрд╣рд╛рдВ %70 <core::slice::IterMut<T> as core::iter::traits::iterator::Iterator>::next() рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ)

рдпрд╣ рдЕрдХреЗрд▓реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЛ рдЦреВрдВрдЦрд╛рд░ nuw рд╕реЗ add nuw i64 %x, -1 рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

1.37.0 рдореЗрд░реЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдВрдпреЛрдЬрди рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ рдЬреЛ рдПрдХ segfault рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ)ред

рдпрд╣ LLVM 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП SCEV рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рджреЛрд╖ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╣ рдПрд▓рдПрд▓рд╡реАрдПрдо 8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ

рдореЗрд░рд╛ рдмреБрд░рд╛, рднреНрд░рдо рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ (рдореИрдВ рдЗрд╕реЗ рдПрдХ-рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд╢ рдерд╛, рдореИрдВрдиреЗ рдПрд▓рдПрд▓рд╡реА рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рднреА рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛)ред

рд╣рдордиреЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдлрд┐рдХреНрд╕ рдЪреЗрд░реА-рдкрд┐рдХ рдХреЗ рд╕рд╛рде рдирдИ 1.41.1 рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рддреИрдпрд╛рд░ рдХреАрдВред рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable

pg рдореЗрдВ https://github.com/rust-lang/rust/issues/69225#issuecomment -586941455

[triagebot] рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрд┐рдВрдЧ рдХрд┐рдП рдЧрдП рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреАрдо рд╕реЗ рдХрд┐рд╕реА рднреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдмреНрд░реЗрдЯреА рдЕрдЪреНрдЫрд╛ рд╣реИред

1.41.1 рдмрд╛рд╣рд░ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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