Backport mem_release testcase from 0.3.1.

Also backports cdbf51 generator bugfix.
This commit is contained in:
Petteri Aimonen
2014-12-26 17:08:17 +02:00
parent 45fc9f3ef6
commit 83157e3362
14 changed files with 200 additions and 54 deletions

View File

@@ -8,6 +8,7 @@ env.NanopbProto("unittestproto")
# Protocol definitions for basic_buffer/stream tests
env.NanopbProto("person")
#--------------------------------------------
# Binaries of the pb_decode.c and pb_encode.c
# These are built using more strict warning flags.
strict = env.Clone()
@@ -15,3 +16,31 @@ strict.Append(CFLAGS = strict['CORECFLAGS'])
strict.Object("pb_decode.o", "$NANOPB/pb_decode.c")
strict.Object("pb_encode.o", "$NANOPB/pb_encode.c")
#-----------------------------------------------
# Binaries of pb_decode etc. with malloc support
# Uses malloc_wrappers.c to count allocations.
malloc_env = env.Clone()
malloc_env.Append(CPPDEFINES = {'PB_ENABLE_MALLOC': 1,
'PB_SYSTEM_HEADER': '\\"malloc_wrappers_syshdr.h\\"'})
malloc_env.Append(CPPPATH = ["$COMMON"])
if 'SYSHDR' in malloc_env:
malloc_env.Append(CPPDEFINES = {'PB_OLD_SYSHDR': malloc_env['SYSHDR']})
# Disable libmudflap, because it will confuse valgrind
# and other memory leak detection tools.
if '-fmudflap' in env["CCFLAGS"]:
malloc_env["CCFLAGS"].remove("-fmudflap")
malloc_env["LINKFLAGS"].remove("-fmudflap")
malloc_env["LIBS"].remove("mudflap")
malloc_strict = malloc_env.Clone()
malloc_strict.Append(CFLAGS = malloc_strict['CORECFLAGS'])
malloc_strict.Object("pb_decode_with_malloc.o", "$NANOPB/pb_decode.c")
malloc_strict.Object("pb_encode_with_malloc.o", "$NANOPB/pb_encode.c")
mw = env.Object("malloc_wrappers.o", "malloc_wrappers.c")
Depends(mw, ["malloc_wrappers_syshdr.h"])
Export("malloc_env")

View File

@@ -0,0 +1,54 @@
#include "malloc_wrappers.h"
#include <stdint.h>
#include <assert.h>
#include <string.h>
static size_t alloc_count = 0;
/* Allocate memory and place check values before and after. */
void* malloc_with_check(size_t size)
{
size_t size32 = (size + 3) / 4 + 3;
uint32_t *buf = malloc(size32 * sizeof(uint32_t));
buf[0] = size32;
buf[1] = 0xDEADBEEF;
buf[size32 - 1] = 0xBADBAD;
return buf + 2;
}
/* Free memory allocated with malloc_with_check() and do the checks. */
void free_with_check(void *mem)
{
uint32_t *buf = (uint32_t*)mem - 2;
assert(buf[1] == 0xDEADBEEF);
assert(buf[buf[0] - 1] == 0xBADBAD);
free(buf);
}
/* Track memory usage */
void* counting_realloc(void *ptr, size_t size)
{
/* Don't allocate crazy amounts of RAM when fuzzing */
if (size > 1000000)
return NULL;
if (!ptr && size)
alloc_count++;
return realloc(ptr, size);
}
void counting_free(void *ptr)
{
if (ptr)
{
assert(alloc_count > 0);
alloc_count--;
free(ptr);
}
}
size_t get_alloc_count()
{
return alloc_count;
}

View File

@@ -0,0 +1,7 @@
#include <stdlib.h>
void* malloc_with_check(size_t size);
void free_with_check(void *mem);
void* counting_realloc(void *ptr, size_t size);
void counting_free(void *ptr);
size_t get_alloc_count();

View File

@@ -0,0 +1,15 @@
/* This is just a wrapper in order to get our own malloc wrappers into nanopb core. */
#define pb_realloc(ptr,size) counting_realloc(ptr,size)
#define pb_free(ptr) counting_free(ptr)
#ifdef PB_OLD_SYSHDR
#include PB_OLD_SYSHDR
#else
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#endif
#include <malloc_wrappers.h>