|
|
|
|
|
by tekne
22 days ago
|
|
No, that's actually UB. The important bit here is "compiler defined" -- UB means the compiler is allowed to assume it never happens while compiling. Consider, for example, an implementation defined function f() -- which can also diverge/crash horribly, etc. If I write if p {
print("p is true")
} else {
g()
}
if p {
f()
}
Then either we:
- print p is true and execute f
- do nothingThis is true regardless of if f immediately crashes the computer, nasal demons, whatever -- that's implementation defined. UB means f may never happen. And that means the compiler may optimize this to just: g()
Notice the difference here -- the print never happens!, and g always happens.You can see why this is concerning when you write code like if dry_run {
print("would run rm -rf /")
} else {
run("rm -rf /")
}
if dry_run {
// oops: some_debug_string is NULL and will segfault!
print(some_debug_string);
}
|
|