| ▲ | flohofwoe 3 hours ago | ||||||||||||||||||||||||||||
> The examples are unequivocally UB. Full stop. Tbh, already the first example (unaligned pointer access) is bogus and the C standard should be fixed (in the end the list of UB in the C standard is entirely "made up" and should be adapted to modern hardware, a lot of UB was important 30 years ago to allow optimizations on ancient CPUs, but a lot of those hardware restrictions are long gone). In the end it's the CPU and not the compiler which decides whether an unaligned access is a problem or not. On most modern CPUs unaligned load/stores are no problem at all (not even a performance penalty unless you straddle a cache line). There's no point in restricting the entire C standard because of the behaviour of a few esoteric CPUs that are stuck in the past. PS: we also need to stop with the "what if there is a CPU that..." discussions. The C standard should follow the current hardware, and not care about 40 year old CPUs or theoretical future CPU architectures. If esoteric CPUs need to be supported, compilers can do that with non-standard extensions. | |||||||||||||||||||||||||||||
| ▲ | account42 2 hours ago | parent | next [-] | ||||||||||||||||||||||||||||
Not having unaligned access in the language allows the compiler to assume that, for basic types where the aligment is at least the size, if two addresses are different then they don't alias and writes to one can't change the result of reads from the other. That's a very useful assumption to be able to make for optimization - much more useful than yolocasting pointers in a way that could get you unaligned ones. | |||||||||||||||||||||||||||||
| ▲ | leni536 2 hours ago | parent | prev | next [-] | ||||||||||||||||||||||||||||
Undefined means that the ISO C doesn't define the behavior. An implementation is free to do so. | |||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||
| ▲ | stevenhuang 3 hours ago | parent | prev | next [-] | ||||||||||||||||||||||||||||
I agree. I meant to elaborate more on how to think of UB. For most C software on x86_64, UB is "fine" with very strong bunny ears. But it is preferable for one to, shall we say, write UB intentionally rather than accidentally and unknowingly. Having an awareness of all the minefields lends for more respect for the dangers of C code, it makes one question literally everything, and that would hopefully result in more correct code, more often. On that note, on some RISC-V cores unaligned access can turn a single load into hundreds of instructions. I think the problem is just that C is under specified for what we expect a language to provide in the modern age. It is still a great language, but the edges are sharp. | |||||||||||||||||||||||||||||
| ▲ | IshKebab 3 hours ago | parent | prev [-] | ||||||||||||||||||||||||||||
There are still modern CPUs that don't support misaligned access. It would be insane for C to mandate that misaligned accesses are supported. However I do agree that just saying "the behaviour is undefined" is an unhelpful cop-out. They could easily say something like "non-atomic misaligned accesses either succeed or trap" or something like that. > In the end it's the CPU and not the compiler which decides whether an unaligned access is a problem or not. Not just the CPU - memory decides as well. MMIO devices often don't support misaligned accesses. | |||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||