Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAC OS X malloc issue pointer being freed was not allocated #21

Closed
dk547 opened this issue Dec 30, 2015 · 10 comments
Closed

MAC OS X malloc issue pointer being freed was not allocated #21

dk547 opened this issue Dec 30, 2015 · 10 comments
Assignees

Comments

@dk547
Copy link

dk547 commented Dec 30, 2015

Here is the test code:

#include <jvar/jvar.h>

int main(int argc, char** argv)
{
    jvar::Variant inputData;
    std::string message = "[\"{\\\"msg\\\":\\\"connect\\\",\\\"session\\\":\\\"pjwLzc25gD\\\",\\\"version\\\":\\\"1\\\",\\\"support\\\":[\\\"1\\\",\\\"pre2\\\",\\\"pre1\\\"]}\"]";

    if (inputData.parseJson(message.c_str()))
    {
        for (int i=0; i<inputData.length(); i++)
        {
            jvar::Variant packet;
            packet.parseJson(inputData[i].toString().c_str());
            printf("input = %s\n", inputData.toString().c_str());
            printf("msg = %s\n", packet["msg"].toString().c_str());
        }
    }

    printf("success\n");
}

I get following error when I try to run it:

$ ./a.out
input = ["{"msg":"connect","session":"pjwLzc25gD","version":"1","support":["1","pre2","pre1"]}"]
msg = conn�O�
a.out(15642,0x7fff7be5f300) malloc: *** error for object 0x7fdd18c04dcc: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

@YasserAsmi
Copy link
Owner

I don't have a Mac dev setup yet. I am not able to reproduce this behavior on Linux. I get the following by running the above code.

input = ["{"msg":"connect","session":"pjwLzc25gD","version":"1","support":["1","pre2","pre1"]}"]
msg = connect
success

I ran the code via valgrind. I get the following suggesting there wasn't a malloc issue.

==20701== HEAP SUMMARY:
==20701== in use at exit: 0 bytes in 0 blocks
==20701== total heap usage: 29 allocs, 29 frees, 2,172 bytes allocated
==20701==
==20701== All heap blocks were freed -- no leaks are possible
==20701==
==20701== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==20701== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

I am trying to get a Mac setup.

@YasserAsmi YasserAsmi self-assigned this Dec 30, 2015
@YasserAsmi
Copy link
Owner

I got a Mac. Can you tell me about your compiler setup do I can replicate it?

@dk547
Copy link
Author

dk547 commented Dec 31, 2015

g++-5 (Homebrew gcc 5.2.0) 5.2.0

CXX_FLAGS=-m32 (jvar built 32bit also)

@YasserAsmi
Copy link
Owner

I got my dev environment setup and making sure jvar works on macs.

I install brew and gcc... But it didn't install gcc version you mentioned.
~/src/jvar/bin> gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.2.0
Thread model: posix

I fixed a few compile issue... One in particular was an error where it failed to find ~string()... I wonder if that is related. I ended up replacing it with ~basic_string() even though ~string should work.

After that your test code above runs perfectly with no issues. There are also zero issues shown in valgrind.

I don't know if you ran into the string issue or not.

@dk547
Copy link
Author

dk547 commented Jan 2, 2016

clang is not gcc actually

@dk547
Copy link
Author

dk547 commented Jan 2, 2016

Here is my valgrind report, maybe it will help:

==73509== Memcheck, a memory error detector
==73509== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==73509== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==73509== Command: /Users/bespalov/Downloads/a.out
==73509==
input = ["{"msg":"connect","session":"pjwLzc25gD","version":"1","support":["1","pre2","pre1"]}"]
==73509== Invalid read of size 1
==73509==    at 0x1006A2056: _platform_memmove$VARIANT$Unknown (in /usr/lib/system/libsystem_platform.dylib)
==73509==    by 0x100007908: jvar::Variant::toString[abi:cxx11]() const (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000FEE: main (in /Users/bespalov/Downloads/a.out)
==73509==  Address 0x100ad52cc is 44 bytes inside a block of size 128 free'd
==73509==    at 0x1000258B8: realloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x100003D3A: jvar::Buffer::reAlloc(unsigned long) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000042FE: jvar::BArray::insert(int, void const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000099F7: jvar::Variant::addProperty(char const*, jvar::Variant const&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100010EA7: jvar::JsonParser::parseMembers(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011186: jvar::JsonParser::parseObject(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011284: jvar::JsonParser::JsonParser(jvar::Variant&, char const*, unsigned int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000050C3: jvar::Variant::parseJson(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000F78: main (in /Users/bespalov/Downloads/a.out)
==73509==  Block was alloc'd at
==73509==    at 0x100024E4B: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x100003D3A: jvar::Buffer::reAlloc(unsigned long) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100004833: jvar::BArray::ensureAlloc(int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100009028: jvar::Variant::createObject(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x10001117B: jvar::JsonParser::parseObject(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011284: jvar::JsonParser::JsonParser(jvar::Variant&, char const*, unsigned int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000050C3: jvar::Variant::parseJson(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000F78: main (in /Users/bespalov/Downloads/a.out)
==73509==
==73509== Invalid read of size 1
==73509==    at 0x1006A2064: _platform_memmove$VARIANT$Unknown (in /usr/lib/system/libsystem_platform.dylib)
==73509==    by 0x100007908: jvar::Variant::toString[abi:cxx11]() const (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000FEE: main (in /Users/bespalov/Downloads/a.out)
==73509==  Address 0x100ad52cd is 45 bytes inside a block of size 128 free'd
==73509==    at 0x1000258B8: realloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x100003D3A: jvar::Buffer::reAlloc(unsigned long) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000042FE: jvar::BArray::insert(int, void const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000099F7: jvar::Variant::addProperty(char const*, jvar::Variant const&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100010EA7: jvar::JsonParser::parseMembers(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011186: jvar::JsonParser::parseObject(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011284: jvar::JsonParser::JsonParser(jvar::Variant&, char const*, unsigned int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000050C3: jvar::Variant::parseJson(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000F78: main (in /Users/bespalov/Downloads/a.out)
==73509==  Block was alloc'd at
==73509==    at 0x100024E4B: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x100003D3A: jvar::Buffer::reAlloc(unsigned long) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100004833: jvar::BArray::ensureAlloc(int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100009028: jvar::Variant::createObject(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x10001117B: jvar::JsonParser::parseObject(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011284: jvar::JsonParser::JsonParser(jvar::Variant&, char const*, unsigned int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000050C3: jvar::Variant::parseJson(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000F78: main (in /Users/bespalov/Downloads/a.out)
==73509==
msg = connect
==73509== Invalid free() / delete / delete[] / realloc()
==73509==    at 0x10002528F: free (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x1000084A7: jvar::Variant::deleteData() (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100008534: jvar::Variant::deleteData() (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100001029: main (in /Users/bespalov/Downloads/a.out)
==73509==  Address 0x100ad52cc is 44 bytes inside a block of size 128 free'd
==73509==    at 0x1000258B8: realloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x100003D3A: jvar::Buffer::reAlloc(unsigned long) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000042FE: jvar::BArray::insert(int, void const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000099F7: jvar::Variant::addProperty(char const*, jvar::Variant const&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100010EA7: jvar::JsonParser::parseMembers(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011186: jvar::JsonParser::parseObject(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011284: jvar::JsonParser::JsonParser(jvar::Variant&, char const*, unsigned int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000050C3: jvar::Variant::parseJson(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000F78: main (in /Users/bespalov/Downloads/a.out)
==73509==  Block was alloc'd at
==73509==    at 0x100024E4B: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==73509==    by 0x100003D3A: jvar::Buffer::reAlloc(unsigned long) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100004833: jvar::BArray::ensureAlloc(int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100009028: jvar::Variant::createObject(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x10001117B: jvar::JsonParser::parseObject(jvar::Variant&) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100011284: jvar::JsonParser::JsonParser(jvar::Variant&, char const*, unsigned int) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x1000050C3: jvar::Variant::parseJson(char const*) (in /Users/bespalov/Downloads/a.out)
==73509==    by 0x100000F78: main (in /Users/bespalov/Downloads/a.out)
==73509==
success
==73509==
==73509== HEAP SUMMARY:
==73509==     in use at exit: 111,680 bytes in 437 blocks
==73509==   total heap usage: 521 allocs, 86 frees, 119,749 bytes allocated
==73509==
==73509== LEAK SUMMARY:
==73509==    definitely lost: 0 bytes in 0 blocks
==73509==    indirectly lost: 0 bytes in 0 blocks
==73509==      possibly lost: 0 bytes in 0 blocks
==73509==    still reachable: 72,704 bytes in 1 blocks
==73509==         suppressed: 38,976 bytes in 436 blocks
==73509== Reachable blocks (those to which a pointer was found) are not shown.
==73509== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==73509==
==73509== For counts of detected and suppressed errors, rerun with: -v
==73509== ERROR SUMMARY: 9 errors from 3 contexts (suppressed: 18 from 18)

@YasserAsmi
Copy link
Owner

Yeah I realized that. I did install GCC from Brew but for some reason it is aliasing to CLANG.

Once I figure out how to use proper version of GCC, I will fix this issue.

BTW: Here is some discussion about the CLANG bug regarding ~string() vs GCC


From: dk547 notifications@github.com
Sent: Friday, January 1, 2016 6:57 PM
To: YasserAsmi/jvar
Cc: Yasser Asmi
Subject: Re: [jvar] MAC OS X malloc issue pointer being freed was not allocated (#21)

clang is not gcc actually

Reply to this email directly or view it on GitHubhttps://github.com//issues/21#issuecomment-168359762.

@YasserAsmi
Copy link
Owner

OK. Here is the latest status on Mac:

  1. Works when compiled with Clang
  2. Works when compiled with GCC-4.8
  3. Doesn't work with GCC-5--results in the error you reported

@YasserAsmi
Copy link
Owner

Got to the bottom of the issue. And it is not good news.
https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

This is breaking because of a change in the ABI in GCC 5.x. The new default ABI for libstd++ is C++11/14... which is not compatible with the older ABI.

I regret the decision to depend on std::string now and this reaffirm my feeling toward STL in general.

CONCLUSION: JVAR is currently not compatible with GCC 5 due to the change in ABI. I will continue investigating how it can be fixed--but I don't know the ETA for a fix. But in the mean time, if you need to use this library please use GCC-4.8 or Clang.

@YasserAsmi
Copy link
Owner

This has been fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants