Skip to content

Another UB found using rustlantis #691

Open
@FractalFir

Description

@FractalFir

This program has a different result under GCC debug and GCC release.

2 1 //debug
2 -1 // release
fn dump_var(var2: usize, val2: usize, var3: usize) {
    println!("val2:{val2}")
}
#[inline(never)]
fn dump_var2(var2: usize, val2: usize, var3: usize) {
    println!("val2:{val2}")
}
fn fn6(arg: bool, arg2: usize) -> bool {
    dump_var(0, arg2, 0);
    dump_var2(0, !arg as usize, 0);
    true
}
fn main() {
    let mut _1 = false;
    let mut _3 = 2;
    let mut _4 = (&1, 1);
    loop {
        if _4.1 == 0 {
            if _4.1 == 1 {
                _1 = true;
            } else {
                _1 = false;
            }
        } else if fn6(_1, _3) {
            loop {
                _3 = _4.1;
                let mut _6 = 0;
                _6 = 0;
                let tmp2 = _6;
                if tmp2 == 1 {
                    _4.0 = &_4.1
                } else if tmp2 == 0 {
                    return;
                } else {
                    break;
                }
            }
        }
    }
}

It looks like the cast of val as i128 is nonsensical. Since val is a boolean value, one would expect it to be either 1 or 0, and not -1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions