Re: Strict aliasing violation?

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

 



On Tue, Sep 11, 2012 at 8:00 AM, Jonathan Wakely <jwakely.gcc@xxxxxxxxx> wrote:
> G++ correctly warns about a strict aliasing violation in this code,
> because an object of type char is accessed as type uintptr_t:
>
> char buf[64];
> inline int get(int offset)
> {
>     return *reinterpret_cast<int*>(&buf[offset]);
> }
>
> $ g++-4.7 f.cc -c  -fstrict-aliasing -Wstrict-aliasing
> f.cc: In function 'int get(int)':
> f.cc:4:48: warning: dereferencing type-punned pointer will break
> strict-aliasing rules [-Wstrict-aliasing]
>
> But the following doesn't elicit a warning:
>
> char buf[64];
> inline int get(int offset)
> {
>     char* addr = &buf[offset];
>     return *reinterpret_cast<int*>(addr);
> }
>
> I believe this code is still undefined, for exactly the same reason,
> but I assume the diagnostic machinery isn't smart enough to detect the
> violation of the rules.

Yes.  That is a frontend warning that triggers only on typecasts that
are clearly invalid.  A typecast from char* to int* is not clearly
invalid.

> Can the optimisers still cause this code to
> do unexpected things, even though the diagnostic is absent?

Yes.  You may get a warning at -Wstrict-aliasing=3.

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