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++/66666] ARM compiled code segmentation fault on multiple inheritance


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

--- Comment #3 from Antonio Poggiali <antonio.poggiali at datalogic dot com> ---
I've understand a little better the problem.
The compiler passes to std::list copy constructor a different address respect
to the destination variable. 
This causes size() call to fail (endless loop or segmentation fault).

Here you can find a simpler test-bench:

#include <iostream>

using namespace std;

class TestReference
{
        public:

        // This is a pointer to me
        const TestReference * _me;

        TestReference() {
                _me = this;
        }

        TestReference(const TestReference &obj)
        {
                _me = this;
        }
};

class SmartObject
{
        public:

        SmartObject(){}

        // removing this destructor makes it work
        virtual ~SmartObject(){}
};

class IMyInterface
{
        public:

        IMyInterface(){}

        // removing this destructor have no effect (fails anyway)
        virtual ~IMyInterface(){}

        virtual TestReference getTestReference() = 0;
};

// inheriting SmartObject virtually makes it work (but it is not feasible on
the overall application architecture)
class MyObject : public virtual IMyInterface, public SmartObject
{
        public:

        MyObject() : IMyInterface(), SmartObject() {}

        virtual TestReference getTestReference() {
                return testReference;
        }

        virtual ~MyObject(){
        }

        TestReference testReference;
};

int main()
{
        IMyInterface *ip = new MyObject();

        TestReference TestReference_local;
        std::cout << "object address " << &TestReference_local << std::endl;
        std::cout << "object address in constructor " <<
TestReference_local._me << std::endl;
        if (&TestReference_local != TestReference_local._me)
                std::cout << "warning! addresses are different!" << std::endl;

        TestReference TestReference_clone = ip->getTestReference();
        std::cout << "object address " << &TestReference_clone << std::endl;
        std::cout << "object address in copy constructor " <<
TestReference_clone._me << std::endl;
        if (&TestReference_clone != TestReference_clone._me)
                std::cout << "warning! addresses are different!" << std::endl;

        delete ip;
        return 0;
}

Basically I expect the object address in the copy constructor (this) to be the
same of the object in the calling code, but when the program fails it is not
so!


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