Re: alias question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 02/18/2011 02:13 PM, Segher Boessenkool wrote:
If I have a char array, and it's always written by the char array,
can
it
be always reliably read by any combination of short/int/long
pointers?

As I understand, the compiler will see byte writes for all types, so
readind shoulg be fine without violating any strict alias rules.
Just
can't write the array by any other type than char[] access.  Right?

No.  You can access anything only as its declared type or character
type;
an array of char thus can be accessed as char only.

Not quite: if you write an int to an array of char, you can read it
back again.  What matters is the effective type.

Of course, but the effective type is equal to the declared type (if
there
is any) of the object,
so that write as int is undefined behaviour already!

No: character types are special.  See Section 6.5 re arrays of
character type and effective types.

6.5/6, first line: The effective typeof an object for an access to its
stored value is the declared type of the object, if any.

No exception for character types here; there is in some other
aspects (like for accesses to allocated storage), but not for this.

"If a value is copied into an object having no declared type using
memcpy or memmove, or is copied as an array of character type, then
the effective type of the modified object for that access and for
subsequent accesses that do not modify the value is the effective type
of the object from which the value is copied, if it has one...

7  An object shall have its stored value accessed only by an
lvalue expression that has one of the following types: 73)

— 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.

73) The intent of this list is to specify those circumstances in which
an object may or may not be aliased."

In other words, a character type aliases all other types.  Without
this, it's not possible to write malloc() in C.

Andrew.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux