vendredi 1 janvier 2016

munmap_chunk(): invalid pointer when using function templates

My program seems to crash with a munmap_chunk(): invalid pointer error. Which means that somewhere must be an invalid destruction, an invalid use of free or something of that kind. But I can't figure out where and why. The simplified code that still gives this error is the following (don't worry about all the templates and stuff, it makes all sense in the context of my program and without them I wasn't able to reproduce this error. I'm just interested in why this fails):

#include <iostream>
#include <string>
#include <string.h>

class db
{
public:
    template<typename T>
        struct Input { typedef T type; };

    template<typename T>
        void setValue(typename Input<T>::type newValue)
    {
        setValue(Input<T>(), newValue);
    }
private:
    void* data;
    std::string setValue(Input<std::string>, typename Input<std::string>::type newValue)
    {
        data = (void*) new char[newValue.size()+1];
        strcpy((char*)data, newValue.c_str());
        std::cout << "string: \"" << (char*)data << "\"\n";
    }
};

int main()
{
    db dbObj;
    std::string str = "Hello world";
    dbObj.setValue<std::string>(str);
    std::cout << "This is the end!\n";
    return 0;
}

That gives the following output on the terminal:

string: "Hello world"
*** Error in `/castor/Code/CodeBlocks/testCpp2/bin/Debug/testCpp2': munmap_chunk(): invalid pointer: 0x00007ffd229f8490 ***
======= Backtrace: =========
/usr/lib/libc.so.6(+0x72055)[0x7f39395ee055]
/usr/lib/libc.so.6(+0x779a6)[0x7f39395f39a6]
/castor/Code/CodeBlocks/testCpp2/bin/Debug/testCpp2[0x400e34]
/castor/Code/CodeBlocks/testCpp2/bin/Debug/testCpp2[0x400c82]
/usr/lib/libc.so.6(__libc_start_main+0xf0)[0x7f393959c610]
/castor/Code/CodeBlocks/testCpp2/bin/Debug/testCpp2[0x400b59]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:22 35002296                           /castor/Code/CodeBlocks/testCpp2/bin/Debug/testCpp2
00601000-00602000 rw-p 00001000 08:22 35002296                           /castor/Code/CodeBlocks/testCpp2/bin/Debug/testCpp2
00903000-00935000 rw-p 00000000 00:00 0                                  [heap]
7f393957c000-7f3939717000 r-xp 00000000 08:31 5246076                    /usr/lib/libc-2.22.so
7f3939717000-7f3939916000 ---p 0019b000 08:31 5246076                    /usr/lib/libc-2.22.so
7f3939916000-7f393991a000 r--p 0019a000 08:31 5246076                    /usr/lib/libc-2.22.so
7f393991a000-7f393991c000 rw-p 0019e000 08:31 5246076                    /usr/lib/libc-2.22.so
7f393991c000-7f3939920000 rw-p 00000000 00:00 0 
7f3939920000-7f3939936000 r-xp 00000000 08:31 5246391                    /usr/lib/libgcc_s.so.1
7f3939936000-7f3939b35000 ---p 00016000 08:31 5246391                    /usr/lib/libgcc_s.so.1
7f3939b35000-7f3939b36000 rw-p 00015000 08:31 5246391                    /usr/lib/libgcc_s.so.1
7f3939b36000-7f3939c33000 r-xp 00000000 08:31 5246131                    /usr/lib/libm-2.22.so
7f3939c33000-7f3939e32000 ---p 000fd000 08:31 5246131                    /usr/lib/libm-2.22.so
7f3939e32000-7f3939e33000 r--p 000fc000 08:31 5246131                    /usr/lib/libm-2.22.so
7f3939e33000-7f3939e34000 rw-p 000fd000 08:31 5246131                    /usr/lib/libm-2.22.so
7f3939e34000-7f3939fa6000 r-xp 00000000 08:31 5246435                    /usr/lib/libstdc++.so.6.0.21
7f3939fa6000-7f393a1a6000 ---p 00172000 08:31 5246435                    /usr/lib/libstdc++.so.6.0.21
7f393a1a6000-7f393a1b0000 r--p 00172000 08:31 5246435                    /usr/lib/libstdc++.so.6.0.21
7f393a1b0000-7f393a1b2000 rw-p 0017c000 08:31 5246435                    /usr/lib/libstdc++.so.6.0.21
7f393a1b2000-7f393a1b6000 rw-p 00000000 00:00 0 
7f393a1b6000-7f393a1d8000 r-xp 00000000 08:31 5246074                    /usr/lib/ld-2.22.so
7f393a396000-7f393a39c000 rw-p 00000000 00:00 0 
7f393a3d5000-7f393a3d7000 rw-p 00000000 00:00 0 
7f393a3d7000-7f393a3d8000 r--p 00021000 08:31 5246074                    /usr/lib/ld-2.22.so
7f393a3d8000-7f393a3d9000 rw-p 00022000 08:31 5246074                    /usr/lib/ld-2.22.so
7f393a3d9000-7f393a3da000 rw-p 00000000 00:00 0 
7ffd229d8000-7ffd229f9000 rw-p 00000000 00:00 0                          [stack]
7ffd229fb000-7ffd229fd000 r--p 00000000 00:00 0                          [vvar]
7ffd229fd000-7ffd229ff000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

By doing some debugging I found out that the error must happen at the end of function std::string setValue(Input<std::string>, typename Input<std::string>::type). However in this function there's nothing freed or destructed. It just allocates space and copies the c-string content of newValue (which is of type std::string) to data. data isn't destructed at the end of the function because it's a pointer, right? I also tried to watch the adresses of the variables dbObj, str and the content of the pointer data. However neither of them are equal to the one in the error messages (0x00007ffd229f8490). Where and why occurs that error?

Aucun commentaire:

Enregistrer un commentaire