Re: Question on strict aliasing in C.

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

 



Paul Smith <paul@xxxxxxxxxxxxxxxxx> writes:

> On Mon, 2011-07-04 at 19:17 +0200, Georg-Johann Lay wrote:
>> >> double copysign (double x, double y)
>> >> {
>> >>     unsigned short * const px = (unsigned short*)(char*)&x + 3;
>> >>     unsigned short * const py = (unsigned short*)(char*)&y + 3;
>
> I don't get why you have the (char*) cast here?
>
>> >>     *px = *px & ~MASK | *py & MASK;
>> >>     return x;
>> >> }
>> >>
>> >> So I want to reassure me if the code is ok or not.
>> > 
>> > It's not.  Tey're wrong, you're right.
>
> So let me ask: if you change the last line to:
>
> 	return *px;
>
> instead, is it now OK WRT aliasing rules?

No.

Here is the simple way to think about it: the type you use to store the
value must be the type you use the retrieve the value.

There are various exceptions but none of them apply here.  The most
interesting exception is that you can store a value via a char* pointer
and retrieve it using a different type, and you can store a value via
some random type and retrieve it using a char* type.

Ian


[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