Skip to content

Segfault from mir-opt-level >= 3 (EnumSizeOpt) #118283

Closed as not planned
Closed as not planned
@cbeuw

Description

@cbeuw

Fuzzer generated custom MIR. Apologies I couldn't reduce it much further:

#![feature(custom_mir, core_intrinsics)]
#![allow(unused_parens, unused_assignments)]
extern crate core;
use core::intrinsics::mir::*;

fn print() {
    println!("here");
}
#[custom_mir(dialect = "runtime", phase = "initial")]
pub fn fn0() -> Adt58 {
    mir! {
    type RET = Adt58;
    let _26: ();
    {
    Call(RET.fld7.2 = fn1(), bb10, UnwindUnreachable())
    }
    bb10 = {
    Call(_26 = print(), bb11, UnwindUnreachable())
    }
    bb11 = {
    Return()
    }

    }
}
#[custom_mir(dialect = "runtime", phase = "initial")]
fn fn1() -> ((usize, u32, isize),) {
    mir! {
    type RET = ((usize, u32, isize),);
    let r: isize;
    let _12: Adt58;
    {
    RET.0 = (5_usize, 3938888967_u32, 121_isize);
    _12.fld0.0 = core::ptr::addr_of_mut!(RET.0.2);
    Call(r = fn6(_12.fld0.0), bb2, UnwindUnreachable())
    }
    bb2 = {
    Return()
    }
    }
}
#[custom_mir(dialect = "runtime", phase = "initial")]
pub fn fn6(mut _1: *mut isize) -> isize {
    mir! {
    let _6: *mut isize;
    let _11: [i8; 8];
    let _12: isize;
    let _19: Adt63;
    let _20: ([i128; 2], (usize, u32, isize), ((usize, u32, isize),), u64);
    let _23: (u128, [i128; 2]);
    let _24: Adt49;
    let _26: f32;
    {
    _6 = _1;
    Goto(bb1)
    }
    bb1 = {
    _12 = -(*_1);
    Call(_11 = core::intrinsics::transmute((*_1)), bb5, UnwindUnreachable())
    }
    bb5 = {
    _19.fld5.fld7.1 = (15794702092393743318_usize, 3565415235_u32, _12);
    _19.fld5.fld7.2.0 = _19.fld5.fld7.1;
    _1 = _6;
    _20.2 = _19.fld5.fld7.2;
    match _20.2.0.0 {
    0 => bb1,
    15794702092393743318 => bb6,
    _ => bb5
    }
    }
    bb6 = {
    _19.fld5.fld5 = _20.2.0.0;
    Call(_19.fld5.fld7.3 = fn7(_1, _1), bb7, UnwindUnreachable())
    }
    bb7 = {
    _24 = Adt49::Variant0 { fld0: _19.fld5.fld5,fld1: _23,fld2: _23.0,fld3: 0 };
    _19.fld0 = Adt60::Variant3 { fld0: 0,fld1: (-2414910124516489307_i64),fld2: 10387225622116096231080460783541968851_i128,fld3: _26,fld4: 275_i16 };
    _6 = core::ptr::addr_of_mut!(_19.fld5.fld7.1.2);
    _19.fld5.fld0 = (_1,);
    Goto(bb8)
    }
    bb8 = {
    match Field::<i128>(Variant(_19.fld0, 3), 2) {
    10387225622116096231080460783541968851 => bb10,
    _ => bb5
    }
    }
    bb10 = {
    match Field::<usize>(Variant(_24, 0), 0) {
    15794702092393743318 => bb11,
    _ => bb5
    }
    }
    bb11 = {
    Return()
    }

    }
}
#[custom_mir(dialect = "runtime", phase = "initial")]
pub fn fn7(
    mut _1: *mut isize,
    mut _2: *mut isize,
) -> u64 {
    mir! {
    let _7: (u8, (*mut isize,), i16, i8, i64, (usize, u32, isize));
    let _8: f64;
    let _10: f32;
    let _11: i32;
    let _12: [i128; 2];
    let _13: isize;
    let _14: isize;
    let _17: ((isize, f64), i8);
    let _20: isize;
    let _21: Adt63;
    {
    _7.4 = !3370110814453801772_i64;
    _7.5.0 = 7_usize & 1304353824105351931_usize;
    _8 = 0.;
    _7.5.2 = _8 as isize;
    _7.5 = (3302905616188524396_usize, 1150340430_u32, (-9223372036854775808_isize));
    _7.1.0 = core::ptr::addr_of_mut!((*_2));
    _7.5.2 = _8 as isize;
    _7.2 = -29299_i16;
    _7.3 = 40_i8;
    _7.2 = (-1339_i16);
    _7.3 = (-44_i8) * (-68_i8);
    _7.1.0 = core::ptr::addr_of_mut!(_7.5.2);
    _7.5 = (6_usize, 1690308138_u32, (-9223372036854775808_isize));
    _7.0 = 227_u8;
    _7.4 = (-8049829723332252308_i64);
    _7.3 = _7.0 as i8;
    _7.5.2 = 9223372036854775807_isize;
    _7.0 = 207_u8;
    (*_2) = _7.0 as isize;
    RET = 0;
    _7.3 = _7.5.1 as i8;
    _7.1 = (_1,);
    _7.5 = (3231788080604669159_usize, 268874823_u32, (-9223372036854775808_isize));
    _7.1 = (_2,);
    (*_2) = (-9223372036854775808_isize);
    _10 = (*_2) as f32;
    _7.1 = (_2,);
    _7.5.1 = 1559352357_u32;
    (*_1) = 9223372036854775807_isize - (-9223372036854775808_isize);
    _7.5 = (12370566778207505070_usize, 1393399085_u32, (-59_isize));
    _7.5.0 = 1_usize & 5_usize;
    _7.2 = !17549_i16;
    _7.5.0 = !2_usize;
    _13 = !(*_2);
    _17.0.0 = (-159775293299709533892712067148515424088_i128) as isize;
    _7.1.0 = _2;
    _14 = _7.5.2;
    Call(_7.5.2 = core::intrinsics::bswap(_14), bb7, UnwindUnreachable())
    }
    bb7 = {
    _7.1.0 = _2;
    _7.5.0 = 0_usize & 5_usize;
    (*_2) = _7.3 as isize;
    _7.0 = !14_u8;
    _7.3 = RET as i8;
    Call((*_2) = core::intrinsics::transmute(_7.4), bb8, UnwindUnreachable())
    }
    bb8 = {
    _7.0 = !188_u8;
    _20 = !_7.5.2;
    _7.2 = _10 as i16;
    _11 = !585373290_i32;
    (*_2) = _17.0.0 * _17.0.0;
    _21.fld2.0 = [(-78467358730145228102713254453611538061_i128),(-76811762829508806080346431520353784840_i128)];
    _21.fld5.fld7.1.1 = _7.5.1 % _7.5.1;
    _21.fld5.fld7.2.0.1 = !_21.fld5.fld7.1.1;
    _21.fld5.fld5 = _7.5.0 & _7.5.0;
    _21.fld4 = core::ptr::addr_of!(_7.2);
    (*_2) = !_20;
    _21.fld2.1.1 = _21.fld5.fld7.1.1;
    _21.fld5.fld7.1.2 = _11 as isize;
    _21.fld5.fld7.1 = _7.5;
    _21.fld5.fld7.2.0.0 = _21.fld5.fld7.1.0 + _21.fld5.fld7.1.0;
    _21.fld2.1.1 = !_21.fld5.fld7.2.0.1;
    _21.fld5.fld7.2.0 = (_7.5.0, _7.5.1, _13);
    _21.fld2.1 = (_21.fld5.fld7.2.0.0, _7.5.1, _7.5.2);
    place!(Field::<(((usize, u32, isize),),)>(Variant(_21.fld0, 1), 4)).0.0 = (_21.fld2.1.0, _21.fld5.fld7.2.0.1, _14);
    _21.fld5.fld4 = Move(Field::<Adt58>(Variant(_21.fld0, 1), 3).fld4);
    place!(Field::<Adt58>(Variant(_21.fld0, 1), 3)).fld7 = (_12, Field::<(((usize, u32, isize),),)>(Variant(_21.fld0, 1), 4).0.0, _21.fld5.fld7.2, RET);
    RET = Field::<Adt58>(Variant(_21.fld0, 1), 3).fld7.1.0 as u64;
    _21.fld5.fld2 = core::ptr::addr_of!(place!(Field::<i128>(Variant(_21.fld0, 1), 1)));
    Return()
    }

    }
}
pub fn main() {
    fn0();
}
#[derive(Debug, Copy, Clone)]
pub enum Adt49 {
    Variant0 {
        fld0: usize,
        fld1: (u128, [i128; 2]),
        fld2: u128,
        fld3: u16,
    },
    Variant1 {},
}
#[derive(Debug)]
pub struct Adt51 {
    fld2: ([i128; 2], (usize, u32, isize), ((usize, u32, isize),), u64),
    fld3: [i128; 6],
}
#[derive(Debug)]
pub struct Adt52 {}
#[derive(Debug)]
pub enum Adt53 {
    Variant0 { fld3: Adt51 },
    Variant1 {},
    Variant2 {},
}
#[derive(Debug)]
pub struct Adt56 {}
#[derive(Debug)]
pub struct Adt58 {
    fld0: (*mut isize,),
    fld1: (bool,),
    fld2: *const i128,
    fld4: Adt53,
    fld5: usize,
    fld7: ([i128; 2], (usize, u32, isize), ((usize, u32, isize),), u64),
}
#[derive(Debug)]
pub enum Adt60 {
    Variant0 {},
    Variant1 {
        fld0: [u64; 2],
        fld1: i128,
        fld2: usize,
        fld3: Adt58,
        fld4: (((usize, u32, isize),),),
    },
    Variant2 {},
    Variant3 {
        fld0: u16,
        fld1: i64,
        fld2: i128,
        fld3: f32,
        fld4: i16,
    },
}
#[derive(Debug)]
pub struct Adt63 {
    fld0: Adt60,
    fld2: ([i128; 2], (usize, u32, isize), ((usize, u32, isize),), u64),
    fld4: *const i16,
    fld5: Adt58,
}
$ rustc -Zmir-opt-level=2 -Copt-level=2 repro.rs && ./repro
here
$ rustc -Zmir-opt-level=3 -Copt-level=2 repro.rs && ./repro
Segmentation fault (core dumped)

(the segfault is from the compiled program, not the compiler)

Miri reports no UB under Tree Borrows.

$ rustc --version -v
rustc 1.76.0-nightly (a1a37735c 2023-11-23)
binary: rustc
commit-hash: a1a37735cbc3db359d0b24ba9085c9fcbe1bc274
commit-date: 2023-11-23
host: x86_64-unknown-linux-gnu
release: 1.76.0-nightly
LLVM version: 17.0.5

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions