Weird seg fault problem

Posted by bluedaemon on Stack Overflow See other posts from Stack Overflow or by bluedaemon
Published on 2010-06-04T21:14:57Z Indexed on 2010/06/05 12:42 UTC
Read the original article Hit count: 130

Filed under:

Greetings,

I'm having a weird seg fault problem. My application dumps a core file at runtime. After digging into it I found it died in this block:

#include <lib1/c.h>  
...  
x::c obj;  
obj.func1();  

I defined class c in a library lib1:

namespace x  
{  
    struct c  
    {  
        c();  
        ~c();  
        void fun1();  
        vector<char *> _data;  
    };  
}  

x::c::c()  
{  
}  

x::c::~c()  
{  
    for ( int i = 0; i < _data.size(); ++i )  
        delete _data[i];  
}  

I could not figure it out for some time till I ran nm on the lib1.so file: there are more function definitions than I defined:

x::c::c()  
x::c::c()  
x::c::~c()  
x::c::~c()  
x::c::func1()  
x::c::func2()  

After searching in code base I found someone else defined a class with same name in same namespace, but in another library lib2 as follows:

namespace x  
{  
    struct c  
    {  
       c();  
       ~c();  
       void func2();  
       vector<string> strs_;  
    };  
}  

x::c::c()
{
}

x::c::~c()
{
}

My application links to lib2, which has dependency on lib1. This interesting behavior brings several questions:

  1. Why would it even work? I would expect a "multiple definitions" error while linking against lib2 (which depends upon lib1) but never had such. The application seems to be doing what's defined in func1 except it dumps a core at runtime.

  2. After attaching debugger, I found my application calls the ctor of class c in lib2, then calls func1 (defined in lib1). When going out of scope it calls dtor of class c in lib2, where the seg fault occurs. Can anybody teach me how this could even occur?

  3. How can I prevent such problems from happening again? Is there any C++ syntax I can use?

Forgot to mention I'm using g++ 4.1 on RHEL4, thank you very much!

© Stack Overflow or respective owner

Related posts about c++