5 ms·
> But there could be gaps, especially in cases where Rust semantics mismatch with C in ways that LLVM hasn't exposed yet. Could you elaborate on what potential
by rmdashrfstar 6y ago
> But there could be gaps, especially in cases where Rust semantics mismatch with C in ways that LLVM hasn't exposed yet.
Could you elaborate on what potential mismatches there currently are between the semantics of Rust and C? Where particularly do you think there might be issues/dragons hiding in the semantics of a translation?
- deleted 6y ago[deleted]
- gpm 6y agoInteger overflows (signed overflows defined to wrap or panic in rust, are undefined behavior in C). Float integer conversions (overflows are defined to saturate in rust, are undefined behavior in C). Maybe things like how pointer casts are treated in correct (but unsafe) rust vs C. Or similarly in transmute. Generally it wouldn't surprise me if rust was standardizing a memory model that was subtly different from C. I'm sure the list goes on, but "that sort of thing".
- tedunangst 6y agoPretty sure rust wraps on overflow, not saturates, but it's not hard to get that behavior from most C compilers if desired.
- pornel 6y agofloat to integer saturates in Rust. `99999.0 as u8` gives 255. `(char)99999.0` is UB in C and LLVM. Rust had to add explicit clamping code to float casts, because LLVM compiled nasal demons otherwise: https://github.com/rust-lang/rust/issues/10184 https://github.com/rust-lang/rust/issues/10184 Rust also has different aliasing rules. Stricter than C for references, but more relaxed than C for raw pointers.
- tedunangst 6y agoClamping floats is interesting, but seems pretty niche.
- tedunangst 6y agoWould have been nice to provide notice of your edits.
- gpm 6y agoI'm not sure if I edited at all, if I did edit it was within a minute or two of my original post. Edit: Now that I am coming back and reading this though I am going to make an edit, and like normal for substantive edits I'm going to mark it clearly... Edit2: Or I can't edit, so let's put it here: A better example than any of the above might be infinite loops, `while (true) {}` (or any similar loop without side effects) is undefined behavior in C, it's defined behavior in rust.
- tedunangst 6y agoUnfortunate timing.