This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: strict aliasing violation
On 01/25/2010 02:42 PM, Erik Trulsson wrote:
> On Mon, Jan 25, 2010 at 02:19:04PM +0100, Richard Guenther wrote:
>> On Mon, Jan 25, 2010 at 1:24 PM, Piotr Wyderski
>> <piotr.wyderski@gmail.com> wrote:
>>> I have a hash function hash(T v) overloaded for all integral
>>> types. I want to provide a variant for float and double, which
>>> should work as follows: take the floating-point value, treat its
>>> binary representation as uint32_t/uint64_t and use the result as a
>>> parameter for an integral hash().
>>>
>>> However, GCC warns me about strict aliasing rules violation, which
>>> is technically correct, but in this case is intended. How do I
>>> perform this conversion ina GCC-friendly way? Even that produces a
>>> warning:
>>>
>>> inline hash_type hash(float v) {
>>>
>>> return hash(*reinterpret_cast<const
>>> std::uint32_t*>(reinterpret_cast<const char*>(&v)));
>>> }
>>>
>>> but I expected char* to be allowed to alias anything.
>>
>> But your access is via std::uint32_t *, not char. Use a
>> union like
>>
>> union { float f; uint32 i; } u = {.f = v};
>> return u.i;
>
> Nope, that is not allowed either.
Of course it is allowed. It's a legitimate gcc extension, and it's
supported by many other compilers too.
Andrew.