История изменений
Исправление 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
И никакого сюрприза в этом нет.