LINUX.ORG.RU

История изменений

Исправление red75prim, (текущая версия) :

Вот, например: https://godbolt.org/z/8br67vzbE

fn test(num: i32) -> bool {
    num < 10
}

fn square(num: i32) -> i32 {
    if test(num) {
        0
    } else {
        // BUG: causes UB in safe code if `test()` returns `false`
        unsafe { std::hint::unreachable_unchecked() }
    }
}

Скомпилируется в

square:
        xor     eax, eax
        ret

И никакого сюрприза в этом нет. UB оно и в расте UB

Исправление red75prim, :

Вот, например: https://godbolt.org/z/8br67vzbE

fn test(num: i32) -> bool {
    num < 10
}

fn square(num: i32) -> i32 {
    if test(num) {
        0
    } else {
        // BUG: cause UB in safe code if `test()` returns `false`
        unsafe { std::hint::unreachable_unchecked() }
    }
}

Скомпилируется в

square:
        xor     eax, eax
        ret

И никакого сюрприза в этом нет. UB оно и в расте UB

Исправление red75prim, :

Вот, например: https://godbolt.org/z/8br67vzbE

fn test(num: i32) -> bool {
    num < 10
}

fn square(num: i32) -> i32 {
    if test(num) {
        0
    } else {
        unsafe { std::hint::unreachable_unchecked() }
    }
}

Скомпилируется в

square:
        xor     eax, eax
        ret

И никакого сюрприза в этом нет. UB оно и в расте UB

Исходная версия red75prim, :

Вот, например: https://godbolt.org/z/8br67vzbE

fn test(num: i32) -> bool {
    num < 10
}

fn square(num: i32) -> i32 {
    if test(num) {
        0
    } else {
        unsafe { std::hint::unreachable_unchecked() }
    }
}

Скомпилируется в

square:
        xor     eax, eax
        ret

И никакого сюрприза в этом нет.