This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/66666] ARM compiled code segmentation fault on multiple inheritance
- From: "antonio.poggiali at datalogic dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 26 Jun 2015 11:23:02 +0000
- Subject: [Bug c++/66666] ARM compiled code segmentation fault on multiple inheritance
- Auto-submitted: auto-generated
- References: <bug-66666-4 at http dot gcc dot gnu dot org/bugzilla/>
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!