This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/63412] New: aliasing issue exposed by inlining


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63412

            Bug ID: 63412
           Summary: aliasing issue exposed by inlining
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: doug.gilmore at imgtec dot com

Created attachment 33616
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33616&action=edit
test program

The attached test program fails with 4.7 up to ToT at -O2 on both x86
(I built x86_64 with the -m32 multi-lib variant) and MIPS.

$ g++ -Wall -g -m32 -std=gnu++11 -O2 -fno-exceptions bad_i5.c -static -o la
-save-temps && ./la
Aborted (core dumped)
$ g++ -Wall -g -m32 -std=gnu++11 -O0 -fno-exceptions bad_i5.c -static -o la
-save-temps && ./la
$ 
Note that simplifying one of the expressions makes the program work:
$ g++ -Wall -g -DNO_VOL -m32 -std=gnu++11 -O2 -fno-exceptions bad_i5.c -static
-o la -save-temps && ./la
$ 

The generated code has the store below the implicit
load in the compare:

    cmpl    %ebx, 4(%esp,%edx,4)
    movl    %eax, 4(%esp)
    jne    .L5

which is incorrect.  It should be:

    movl    %eax, 4(%esp)
    cmpl    %ebx, 4(%esp,%edx,4)
    jne    .L5

We have an internal debate on what the issue is.

Some are of the opinion that casting is breaking alias rules and
thus the behavior of the program is undefined.

Thus something along the lines the following changes are needed.

$ diff bad_i5{,_mod}.c
48c48
<     return reference_->AsMirrorPtr();
---
>     return static_cast<T*>(reference_->AsMirrorPtr());
50c50
<   ObjectReference<T>* reference_;
---
>   ObjectReference<Object>* reference_;
52,53c52,53
<     : reference_(reinterpret_cast<ObjectReference<T>*>(reference))
<     { }
---
>     : reference_((reference))
>   { }
$ g++ -g -m32 -std=gnu++11 -O2 -fno-exceptions bad_i5_mod.c -static -o la
-save-temps && ./la
$

If there is a strict aliasing issue, shouldn't -Wall be warning about
it?

My take is that the casting is not a concern here since the returns
(and entries) from the inlined routines effectively sequences the
problematic store to be above the problematic load, and thus should
be considered a bug in GCC.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]