[Bug c++/30080] New: incorrect code generation, possibly related to casting/aliasing

irving at cs dot stanford dot edu gcc-bugzilla@gcc.gnu.org
Tue Dec 5 23:41:00 GMT 2006


The attached code generates a segmentation fault when compiled and run with
-O3.  The error disappears if I inline any of the functions, remove any of the
unused class members, change the argument to min to be const int instead of
const int&, etc, comment out any of the lines which do nothing, etc. 
-fno-strict-aliasing also makes it go away.  It's still a little long, but I
can't seem to reduce it any further.

================ BEGIN COMPILE COMMAND =====================
ring:bug% /usr/local/compilers/gcc-4.1.1-x86_64-x86_64/bin/g++ -v -save-temps
-o bug -O3 -Wall bug.cpp
Using built-in specs.
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-4.1.1/configure
--prefix=/usr/local/compilers/gcc-4.1.1-x86_64-x86_64 --enable-languages=c,c++
Thread model: posix
gcc version 4.1.1

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/libexec/gcc/x86_64-unknown-linux-gnu/4.1.1/cc1plus
-E -quiet -v -D_GNU_SOURCE bug.cpp -mtune=k8 -Wall -O3 -fpch-preprocess -o
bug.ii
ignoring nonexistent directory
"/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/../../../../x86_64-unknown-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/../../../../include/c++/4.1.1

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/../../../../include/c++/4.1.1/x86_64-unknown-linux-gnu

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/../../../../include/c++/4.1.1/backward
 /usr/local/include
 /usr/local/compilers/gcc-4.1.1-x86_64-x86_64/include

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/include
 /usr/include
End of search list.

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/libexec/gcc/x86_64-unknown-linux-gnu/4.1.1/cc1plus
-fpreprocessed bug.ii -quiet -dumpbase bug.cpp -mtune=k8 -auxbase bug -O3 -Wall
-version -o bug.s
GNU C++ version 4.1.1 (x86_64-unknown-linux-gnu)
        compiled by GNU C version 4.1.1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 9d1c719cee21891cbbb928e6cdd7db48
 as -V -Qy -o bug.o bug.s
GNU assembler version 2.17.50.0.3-6 (x86_64-redhat-linux) using BFD version
2.17.50.0.3-6 20060715

/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/libexec/gcc/x86_64-unknown-linux-gnu/4.1.1/collect2
--eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bug
/usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o
/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/crtbegin.o
-L/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1
-L/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/../../../../lib64
-L/lib/../lib64 -L/usr/lib/../lib64 bug.o -lstdc++ -lm -lgcc_s -lgcc -lc
-lgcc_s -lgcc
/usr/local/compilers/gcc-4.1.1-x86_64-x86_64/lib/gcc/x86_64-unknown-linux-gnu/4.1.1/crtend.o
/usr/lib/../lib64/crtn.o
ring:bug% ./bug
Segmentation fault
================ END COMPILE COMMAND =====================

================ BEGIN bug.cpp =====================
struct VECTOR
{
    int x,y,z;

    VECTOR()
        :x(0),y(0),z(0)
    {}
};

struct ARRAY
{
    int m;
    bool* p;

    ARRAY()
    {
        m=0;
        p=new bool;
        *p=false;
    }

    ~ARRAY(){}
};

struct ARRAY_VECTOR
{
    int m;
    VECTOR* p;

    ARRAY_VECTOR()
    {
        m=0;
        p=new VECTOR;
        *p=VECTOR();
    }

    ~ARRAY_VECTOR(){}
};

int blah;

struct C{};

struct INDIRECT:public C
{
    ARRAY& array;

    INDIRECT(ARRAY& array)
        :array(array)
    {}

    ~INDIRECT(){}
};

bool get(const INDIRECT& array)
{
    return *array.array.p;
}

int count(const C& self)
{
    return get(static_cast<const INDIRECT&>(self));
}   

INDIRECT subset(ARRAY& array,const VECTOR* indices)
{
    return array;
}   

int& get(VECTOR& v)
{
    return v.x;
}   

void remove(const VECTOR& v)
{
    VECTOR r;get(r)=v.x;
}

int min(const int& a,const int& b)
{
    if(b < a) return b;
    return a;
}

void resize(ARRAY_VECTOR& array)
{
    VECTOR* p_new=new VECTOR;
    const VECTOR initialization_value=VECTOR();
    int unused=min(0,0);unused=0;
    *p_new=*array.p;
    array.m=0;
    array.p=0;
    array.p=p_new;
}

struct MESH
{
    ARRAY* node_on_boundary;
    ARRAY a;
};

struct STRAIN
{
    MESH& mesh;

    STRAIN(MESH& mesh)
        :mesh(mesh)
    {}
};

struct FVM
{
    ARRAY_VECTOR boundary_to_element;
    ARRAY a,b,c;

    FVM(STRAIN& strain);
};

FVM::FVM(STRAIN& strain)
{
    VECTOR e;
    blah=count(subset(*strain.mesh.node_on_boundary,&e));
    resize(boundary_to_element);
    VECTOR element;
    remove(element);
}

int main()
{
    MESH mesh;
    STRAIN strain(mesh);
    ARRAY node_on_boundary;
    strain.mesh.node_on_boundary=&node_on_boundary;
    new FVM(strain);
    return 0;
}
================ END bug.cpp =====================


-- 
           Summary: incorrect code generation, possibly related to
                    casting/aliasing
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: irving at cs dot stanford dot edu
 GCC build triplet: x86_64-unknown-linux-gnu
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: x86_64-unknown-linux-gnu


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



More information about the Gcc-bugs mailing list