|
|
|
|
|
by pascal_cuoq
2250 days ago
|
|
I have heard this reaction to this article a lot, but sorry, there is nothing in the C standard that says that objects should not overlap, except a rule that only apply to “lvalue = lvalue;” assignments and is not relevant here. Plus on a some 32-bit ISA, a long long and a double only need to be aligned to 32-bit boundaries, so I note that in the made-up C rules that you are referring to, “basic type” is not very well defined. > I believe this behavior is actually specified in the standard, actually, > in the same section that defines the aliasing rules. The strict aliasing rules are here:
https://port70.net/~nsz/c/c11/n1570.html#6.5p7 Go ahead and point to the rule that says that “basic types” cannot overlap with themselves. |
|
Edit: this is the text I was remembering, from 6.5.16.1 ("Simple Assignment"): "If the value being stored in an object is read from another object that overlaps in any way the storage of the first object, then the overlap shall be exact and the two objects shall have qualified or unqualified versions of a compatible type; otherwise, the behavior is undefined.".
That pretty much matches exactly what I was saying: compilers are free to assume that basic types don't overlap, because if they do then any generated code will be undefined behavior anyway.