Here is the warning after my patch:
1.cpp: In function 'int foo(int, int, int)':
1.cpp:29:70: warning: dereferencing type-punned pointer will break
strict-aliasing rules [-Wstrict-aliasing]
return hash2(static_cast<const unsigned short*>(change1), len / 2);
^
1.cpp:29:70: warning: during inlining function int hash2(const short unsigned
int*, int) into function int foo(int, int, int) [-Wstrict-aliasing]
It is clear what is going on.
On Tue, Aug 19, 2014 at 04:49:57PM +0800, lin zuojian wrote:
> Hi Richard,
> > Generally I don't think we want to expand the use of the IMHO broken
> > strict_aliasing_warning code.
> If you have read my test code, you must understand it is the
> programmer who responsible for this undefined behavior, instead of
> the compiler. Like PR 60546 concluded.
>
> And I doubt if limiting the compiler behavior is a good choice.
>
> > We should be able to do better after some constant/forward propagation,
> > scanning for MEM_REFs operating on decls and accessing those with
> > an alias set that is not a subset of the set of the decl. Like simply
> > warn as part of the tree-ssa-forwprop.c sweep (maybe only for those
> > MEM_REFs we simplified to avoid duplicates, but then also watch
> > for CCP doing the same).
> That's a more generalize solution. But it have a defection: at that
> point, the compiler have no idea who generates these code. That make
> it difficult to debug.
> ---
> Lin Zuojian
>