I've seen several assertions that C89 and C++03 define strict aliasing rules. I, however, cannot find that particular bit in the standard. My understanding was that strict aliasing rules were added in C99.
-
1I cited the entirety of C++03 3.10/15, which lists the valid forms of aliasing, [in an answer to another question](http://stackoverflow.com/questions/4807643/container-covariance-in-c/4807726#4807726). – James McNellis Jun 29 '11 at 01:15
3 Answers
This text is present in C89, §3.3 EXPRESSIONS:
An object shall have its stored value accessed only by an lvalue that has one of the following types:
the declared type of the object,
a qualified version of the declared type of the object,
a type that is the signed or unsigned type corresponding to the
declared type of the object,a type that is the signed or unsigned type corresponding to a
qualified version of the declared 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), ora character type.
Violation of a "shall" constraint leads to undefined behaviour, so a set of allowed aliasing rules can be derived from this text.

- 233,326
- 40
- 323
- 462
3.3 in C89, 3.10/15 in C++03.
Both have a footnote, words to the effect of, "the intent of this list is to indicate when an object may or may not be aliased".

- 273,490
- 39
- 460
- 699
The C++03 standard has the following under §3.10 [basic.lval] p15
:
If a program attempts to access the stored value of an object through an lvalue of other than one of the following types the behavior is undefined48):
— the dynamic type of the object,
— a cv-qualified version of the dynamic type of the object,
— a type that is the signed or unsigned type corresponding to the dynamic type of the object,
— a type that is the signed or unsigned type corresponding to a cv-qualified version of the dynamic 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),
— a type that is a (possibly cv-qualified) base class type of the dynamic type of the object,
— a char or unsigned char type.
Footnote:
48) The intent of this list is to specify those circumstances in which an object may or may not be aliased.
This site also lists the sections in the other standards.

- 129,499
- 52
- 291
- 397
-
Checking this because I explicitly picked on your answer in the question. – Billy ONeal Jun 29 '11 at 01:39