From e0eb4d4fa7422f90bc8943dd660ae8173e5fce95 Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Sun, 11 Mar 2018 13:52:08 +0100 Subject: [PATCH] add malloc test --- lib/ecoli_assert.c | 2 ++ lib/ecoli_malloc.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++ lib/ecoli_malloc.h | 6 ++++-- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/lib/ecoli_assert.c b/lib/ecoli_assert.c index c2850e1..a36d6f6 100644 --- a/lib/ecoli_assert.c +++ b/lib/ecoli_assert.c @@ -16,9 +16,11 @@ void __ec_assert_print(bool expr, const char *expr_str, const char *format, ...) if (expr) return; + /* LCOV_EXCL_START */ va_start(ap, format); fprintf(stderr, "assertion failed: '%s' is false\n", expr_str); vfprintf(stderr, format, ap); va_end(ap); abort(); + /* LCOV_EXCL_END */ } diff --git a/lib/ecoli_malloc.c b/lib/ecoli_malloc.c index 21de1aa..eb3c73d 100644 --- a/lib/ecoli_malloc.c +++ b/lib/ecoli_malloc.c @@ -3,12 +3,15 @@ */ #include +#include #include #include #include #include +EC_LOG_TYPE_REGISTER(malloc); + static int init_done = 0; struct ec_malloc_handler ec_malloc_handler; @@ -120,3 +123,52 @@ static struct ec_init ec_malloc_init = { }; EC_INIT_REGISTER(ec_malloc_init); + +/* LCOV_EXCL_START */ +static int ec_malloc_testcase(void) +{ + int ret, testres = 0; + char *ptr, *ptr2; + + ret = ec_malloc_register(NULL, NULL, NULL); + testres |= EC_TEST_CHECK(ret == -1, + "should not be able to register NULL malloc handlers"); + ret = ec_malloc_register(__ec_malloc, __ec_free, __ec_realloc); + testres |= EC_TEST_CHECK(ret == -1, + "should not be able to register after init"); + + /* registration is tested in the test main.c */ + + ptr = ec_malloc(10); + if (ptr == NULL) + return -1; + memset(ptr, 0, 10); + ptr2 = ec_realloc(ptr, 20); + EC_TEST_CHECK(ptr2 != NULL, "cannot realloc ptr\n"); + if (ptr2 == NULL) + ec_free(ptr); + else + ec_free(ptr2); + ptr = NULL; + ptr2 = NULL; + + ptr = ec_malloc_func(10); + if (ptr == NULL) + return -1; + memset(ptr, 0, 10); + ec_free_func(ptr); + ptr = NULL; + + ptr = ec_calloc(2, (size_t)-1); + EC_TEST_CHECK(ptr == NULL, "bad overflow check in ec_calloc\n"); + + return testres; +} +/* LCOV_EXCL_STOP */ + +static struct ec_test ec_malloc_test = { + .name = "malloc", + .test = ec_malloc_testcase, +}; + +EC_TEST_REGISTER(ec_malloc_test); diff --git a/lib/ecoli_malloc.h b/lib/ecoli_malloc.h index 7ac0f20..e80c3d9 100644 --- a/lib/ecoli_malloc.h +++ b/lib/ecoli_malloc.h @@ -121,7 +121,8 @@ extern struct ec_malloc_handler ec_malloc_handler; /** * Ecoli malloc function. * - * On use this function when the macro ec_malloc() cannot be used. + * Use this function when the macro ec_malloc() cannot be used, + * for instance when it is passed as a callback pointer. */ void *ec_malloc_func(size_t size); @@ -145,7 +146,8 @@ void *ec_malloc_func(size_t size); /** * Ecoli free function. * - * On use this function when the macro ec_free() cannot be used. + * Use this function when the macro ec_free() cannot be used, + * for instance when it is passed as a callback pointer. */ void ec_free_func(void *ptr); -- 2.20.1