b64.c icon indicating copy to clipboard operation
b64.c copied to clipboard

tests failing when run via valgrind(1)

Open stephenmathieson opened this issue 10 years ago • 10 comments

stephenmathieson at UTA in ~/repos/github.com/littlstar/b64.c on master
$ valgrind ./test
==1936== Memcheck, a memory error detector
==1936== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==1936== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==1936== Command: ./test
==1936== 
==1936== Invalid write of size 1
==1936==    at 0x400E13: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==1936==    by 0x400815: main (in ~/repos/github.com/littlstar/b64.c/test)
==1936==  Address 0x51f1128 is 0 bytes after a block of size 8 alloc'd
==1936==    at 0x4C2B7B2: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1936==    by 0x400DED: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==1936==    by 0x400815: main (in ~/repos/github.com/littlstar/b64.c/test)
==1936== 
==1936== Invalid write of size 1
==1936==    at 0x400E4D: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==1936==    by 0x400815: main (in ~/repos/github.com/littlstar/b64.c/test)
==1936==  Address 0x51f11ca is 0 bytes after a block of size 10 alloc'd
==1936==    at 0x4C2B7B2: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1936==    by 0x400E3D: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==1936==    by 0x400815: main (in ~/repos/github.com/littlstar/b64.c/test)
==1936== 
==1936== Conditional jump or move depends on uninitialised value(s)
==1936==    at 0x400826: main (in ~/repos/github.com/littlstar/b64.c/test)
==1936== 
==1936== Conditional jump or move depends on uninitialised value(s)
==1936==    at 0x400839: main (in ~/repos/github.com/littlstar/b64.c/test)
==1936== 
test: test.c:28: main: Assertion `0 == strcmp("YnJhZGxleQ==", (char *) b64_encode((const unsigned char *) "bradley", strlen((char *) (const unsigned char *) "bradley")))' failed.
==1936== 
==1936== HEAP SUMMARY:
==1936==     in use at exit: 13 bytes in 1 blocks
==1936==   total heap usage: 11 allocs, 10 frees, 643 bytes allocated
==1936== 
==1936== LEAK SUMMARY:
==1936==    definitely lost: 13 bytes in 1 blocks
==1936==    indirectly lost: 0 bytes in 0 blocks
==1936==      possibly lost: 0 bytes in 0 blocks
==1936==    still reachable: 0 bytes in 0 blocks
==1936==         suppressed: 0 bytes in 0 blocks
==1936== Rerun with --leak-check=full to see details of leaked memory
==1936== 
==1936== For counts of detected and suppressed errors, rerun with: -v
==1936== Use --track-origins=yes to see where uninitialised values come from
==1936== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 2 from 2)
Aborted
stephenmathieson at UTA in ~/repos/github.com/littlstar/b64.c on master
$ 

stephenmathieson avatar Feb 25 '15 21:02 stephenmathieson

wtf

jwerle avatar Feb 25 '15 21:02 jwerle

yeah, not only that, but it looks like the realloc()s are bad :/

stephenmathieson avatar Feb 25 '15 21:02 stephenmathieson

yeah.. this needs to be refactored this is bad

this would probably solve it:

tmp = (char *) realloc(enc, size + 4);
if (NULL != tmp) {
  enc = tmp;
}

jwerle avatar Feb 25 '15 21:02 jwerle

lemme check

stephenmathieson avatar Feb 25 '15 21:02 stephenmathieson

nope, still broken:

$ valgrind --leak-check=full ./test
==2060== Memcheck, a memory error detector
==2060== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==2060== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==2060== Command: ./test
==2060== 
==2060== Invalid write of size 1
==2060==    at 0x400A9E: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==2060==    by 0x400847: main (in ~/repos/github.com/littlstar/b64.c/test)
==2060==  Address 0x51f1128 is 0 bytes after a block of size 8 alloc'd
==2060==    at 0x4C2B7B2: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2060==    by 0x400A78: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==2060==    by 0x400847: main (in ~/repos/github.com/littlstar/b64.c/test)
==2060== 
==2060== Invalid write of size 1
==2060==    at 0x400AD8: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==2060==    by 0x400847: main (in ~/repos/github.com/littlstar/b64.c/test)
==2060==  Address 0x51f11ca is 0 bytes after a block of size 10 alloc'd
==2060==    at 0x4C2B7B2: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2060==    by 0x400AC8: b64_encode (in ~/repos/github.com/littlstar/b64.c/test)
==2060==    by 0x400847: main (in ~/repos/github.com/littlstar/b64.c/test)
==2060== 
==2060== Conditional jump or move depends on uninitialised value(s)
==2060==    at 0x4C2CBF4: __GI_strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2060==    by 0x40085E: main (in ~/repos/github.com/littlstar/b64.c/test)
==2060== 
==2060== Conditional jump or move depends on uninitialised value(s)
==2060==    at 0x400861: main (in ~/repos/github.com/littlstar/b64.c/test)
==2060== 
[...]

stephenmathieson avatar Feb 25 '15 21:02 stephenmathieson

hmm...! did you fix all `realloc() calls ?

jwerle avatar Feb 25 '15 21:02 jwerle

also getting this issue on OS X so +1

brendanashworth avatar Mar 01 '15 02:03 brendanashworth

we should probably refactor to not rely on realloc and just compute the length of the encoded/decoded arrays beforehand so we just malloc once.

if a refactor is cool with you, i'll try to get something put together once i get some time together

stephenmathieson avatar Mar 01 '15 15:03 stephenmathieson

@stephenmathieson yeah absolutely

jwerle avatar Mar 01 '15 17:03 jwerle

Here found some leaks b64.c (https://github.com/littlstar/b64.c/commit/c58610f57badf248d2a0a04788867cb65a28057b)

[encode.c:41]: (error) Common realloc mistake: 'enc' nulled but not freed upon failure
[encode.c:66]: (error) Common realloc mistake: 'enc' nulled but not freed upon failure
[encode.c:73]: (error) Common realloc mistake: 'enc' nulled but not freed upon failure
[encode.c:79]: (error) Common realloc mistake: 'enc' nulled but not freed upon failure
[decode.c:61]: (error) Common realloc mistake: 'dec' nulled but not freed upon failure
[decode.c:95]: (error) Common realloc mistake: 'dec' nulled but not freed upon failure
[decode.c:102]: (error) Common realloc mistake: 'dec' nulled but not freed upon failure
  • https://github.com/littlstar/b64.c/blob/c58610f/encode.c#L41
  • https://github.com/littlstar/b64.c/blob/c58610f/encode.c#L66
  • https://github.com/littlstar/b64.c/blob/c58610f/encode.c#L73
  • https://github.com/littlstar/b64.c/blob/c58610f/encode.c#L79
  • https://github.com/littlstar/b64.c/blob/c58610f/decode.c#L61
  • https://github.com/littlstar/b64.c/blob/c58610f/decode.c#L95
  • https://github.com/littlstar/b64.c/blob/c58610f/decode.c#L102

denji avatar Aug 18 '15 08:08 denji