[Bug tree-optimization/30252] New: [4.2/4.3 regression] miscompilation of sigc++-2.0 based code with -fstrict-aliasing

belyshev at depni dot sinp dot msu dot ru gcc-bugzilla@gcc.gnu.org
Mon Dec 18 15:56:00 GMT 2006


gcc miscompiles this testcase (reduced from rtorrent) since r111639, compile
with -O1 -fstrict-aliasing:

#include <sigc++/bind.h>
#include <sigc++/slot.h>

static long dummy;

struct A
{
  static void *foo (void *p) { return p; }
  typedef sigc::slot <void *> C;
  C bar();
};

A::C A::bar ()
{
  return sigc::bind (sigc::ptr_fun (&A::foo), &dummy);
}

int main (void)
{
  A a;
  if (a.bar ()() != &dummy)
    abort ();
  return 0;
}


The program will crash in operator() because we store garbage instead of
function pointer inside A::bar():

--- O1  2006-12-18 18:44:34.000000000 +0300
+++ O1-fstrict-aliasing 2006-12-18 18:44:41.000000000 +0300
@@ -248,8 +248,8 @@
        movq    sigc::internal::typed_slot_rep<sigc::bind_functor<-1,
sigc::pointer_functor1<void*, void*>, long*, sigc::nil, sigc::nil, sigc::nil,
sigc::nil, sigc::nil, sigc::nil> >::dup(void*), 24(%rbx)
        movq    $0, 32(%rbx)
        movq    $0, 40(%rbx)
+       movq    %rbx, 64(%rbx)
        movq    $dummy, 72(%rbx)
-       movq    A::foo(void*), 64(%rbx)
        movq    %rbx, (%rsp)
        leaq    48(%rbx), %rsi
        movq    %rsp, %rdi

I will attach preprocessed and somewhat reduced testcase in a moment.

Caused by this patch:

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog       (revision 111638)
+++ gcc/ChangeLog       (revision 111639)
@@ -1,3 +1,8 @@
+2006-03-02  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-alias.c (find_used_portions): Consider taking
+       the address as making the variable not write-only.
+
 2006-03-02  Nick Clifton  <nickc@redhat.com>

        * config.gcc (default_use_cxa_atexit): Extend the description of
Index: gcc/tree-ssa-alias.c
===================================================================
--- gcc/tree-ssa-alias.c        (revision 111638)
+++ gcc/tree-ssa-alias.c        (revision 111639)
@@ -3071,6 +3071,8 @@ find_used_portions (tree *tp, int *walk_
            up->minused = 0;
            up->maxused = TREE_INT_CST_LOW (DECL_SIZE (var));
            up->implicit_uses = true;
+           if (!lhs_p)
+             up->write_only = false;

            up_insert (uid, up);
            *walk_subtrees = 0;


-- 
           Summary: [4.2/4.3 regression] miscompilation of sigc++-2.0 based
                    code with -fstrict-aliasing
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: belyshev at depni dot sinp dot msu dot ru


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30252



More information about the Gcc-bugs mailing list