This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: strict aliasing violation
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: Piotr Wyderski <piotr dot wyderski at gmail dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Mon, 25 Jan 2010 14:19:04 +0100
- Subject: Re: strict aliasing violation
- References: <9f8a01cd1001250424p5a4b7247xd14aa7b71534b521@mail.gmail.com>
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;
Richard.
> Best regards
> Piotr Wyderski
>