...
7. An object shall have its stored value accessed only by an lvalue expression that has one of
the following types: (78)
- a type compatible with the effective type of the object,
- a qualified version of a type compatible with the effective type of the object,
- a type that is the signed or unsigned type corresponding to the effective type of the
object,- a type that is the signed or unsigned type corresponding to a qualified version of the
effective type of the object,- an aggregate or union type that includes one of the aforementioned types among its
members (including, recursively, a member of a subaggregate or contained union), or- a character type.
/(78) The intent of this list is to specify those circumstances in which an object may or may not be aliased./
These rules say that a program is invalid if you try to access a variable through a pointer of an incompatible type. This is happening in the following example, where a short is accessed through a pointer to an integer (the code assumes 16-bit shorts and 32-bit integers).
...