[llvm-dev] GCC 5 and -Wstrict-aliasing in JSON.h

Kim Gräsman via llvm-dev llvm-dev at lists.llvm.org
Tue Aug 14 03:55:59 PDT 2018


On Tue, Aug 14, 2018 at 11:51 AM Andrew Haley <aph at redhat.com> wrote:
>
> On 08/12/2018 02:19 PM, Kim Gräsman wrote:
> > I still feel a little uncomfortable, because I think Jonathan makes an
> > excellent point -- if GCC thinks there's a strict-aliasing violation
> > (whether the standard agrees or not) and classifies this as undefined
> > behavior, we might invoke the optimizers wrath. The warning is a nice
> > hint that this could happen.
>
> Indeed.  And I'm not convinced that the pointer cast is necessary anyway:
> if the type passed in is a union, why not simply take the union member of
> the appropriate type?

As it turns out, Union is not a union ¯\_(ツ)_/¯. (I thought it was, up
until this point.)

It's a template producing a char array suitably aligned for any number
of mutually exclusive types, much like
https://en.cppreference.com/w/cpp/types/aligned_union.

I can't tell if that makes the waters less dangerous, but there's an
invariant for this code that it only reinterpret_casts out Ts from the
char buffer that it has previously put in there using placement new.
As far as I can tell, that should be safe. The local construct in the
as<T>() member function template, something like 'return
*reinterpret<T *>(buffer);' is generally unsafe. But the calling code
always maintains the type invariant (only invoking as<T> for the right
T), so I'd argue this is fine.

Whether all compilers see through this is another question, and I
trust you that there may be dragons.

Thanks,
- Kim


More information about the llvm-dev mailing list