From ea02e1736e28cf851f5900a2f6a3f0640772a242 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 10 Apr 2019 10:44:34 -0400 Subject: [PATCH] Fixed memory leak Fixed memory leak in test_head_list --- src/util/list.c | 23 +++++--- src/util/list.h | 4 +- tests/util/test_list.cpp | 112 ++++++++++++++++++++++----------------- 3 files changed, 80 insertions(+), 59 deletions(-) diff --git a/src/util/list.c b/src/util/list.c index 3aaa661..47bded9 100644 --- a/src/util/list.c +++ b/src/util/list.c @@ -10,7 +10,14 @@ // +#ifdef _DEBUG +#define _CRTDBG_MAP_ALLOC #include +#include +#else +#include +#endif + #include #include @@ -95,31 +102,33 @@ void for_each_list(list_t *list, listIterator iterator) } } -void head_list(list_t *list, void **element, bool removeFromList) +void *head_list(list_t *list, bool removeFromList) { assert(list->head != NULL); listNode *node = list->head; - *element = (void *)malloc(list->elementSize); - memcpy(*element, node->data, list->elementSize); + void *element = (void *)malloc(list->elementSize); + memcpy(element, node->data, list->elementSize); if(removeFromList) { list->head = node->next; list->logicalLength--; - if (list->freeFn) - list->freeFn(node->data); - free(node->data); free(node); } + return element; } -void tail_list(list_t *list, void *element) +void *tail_list(list_t *list) { assert(list->tail != NULL); + listNode *node = list->tail; + void *element = (void *)malloc(list->elementSize); memcpy(element, node->data, list->elementSize); + + return element; } int size_list(list_t *list) diff --git a/src/util/list.h b/src/util/list.h index bb33ea2..311234f 100644 --- a/src/util/list.h +++ b/src/util/list.h @@ -76,12 +76,12 @@ void for_each_list(list_t *list, listIterator iterator); /** @brief Returns the head of the list (optionally removing it at the same time). */ -void head_list(list_t *list, void **element, bool removeFromList); +void *head_list(list_t *list, bool removeFromList); /** @brief Returns the tail of the list. */ -void tail_list(list_t *list, void *element); +void *tail_list(list_t *list); #if defined(__cplusplus) diff --git a/tests/util/test_list.cpp b/tests/util/test_list.cpp index b319d9c..f41a2e8 100644 --- a/tests/util/test_list.cpp +++ b/tests/util/test_list.cpp @@ -18,22 +18,31 @@ #include "util/list.h" +boost::test_tools::predicate_result check_string(std::string test, std::string ref) +{ + if (ref.compare(test) == 0) + return true; + else + return false; +} + + bool iterate_int(void *data) { - printf("Found value: %d\n", *(int *)data); - return true; + printf("Found value: %d\n", *(int *)data); + return true; } bool iterate_string(void *data) { - char *string = *(char **)data; - printf("Found string value: %s\n", string); - return true; + char *string = *(char **)data; + printf("Found string value: %s\n", string); + return true; } void free_string(void *data) { - free(*(char **)data); + free(*(char **)data); } BOOST_AUTO_TEST_SUITE(test_list) @@ -41,7 +50,7 @@ BOOST_AUTO_TEST_SUITE(test_list) BOOST_AUTO_TEST_CASE(test_create_delete) { - list_t *list; + list_t *list; list = create_list(sizeof(int), NULL); delete_list(list); @@ -50,68 +59,71 @@ BOOST_AUTO_TEST_CASE(test_create_delete) { BOOST_AUTO_TEST_CASE(test_int_list){ - int i, numbers = 10; - list_t *list = NULL; + int i, numbers = 10; + list_t *list = NULL; - list = create_list(sizeof(int), NULL); + list = create_list(sizeof(int), NULL); for(i = 1; i <= numbers; i++) { append_list(list, &i); } - BOOST_CHECK(size_list(list) == 10); + BOOST_CHECK(size_list(list) == 10); - for_each_list(list, iterate_int); + for_each_list(list, iterate_int); - delete_list(list); + delete_list(list); +} + +struct FixtureStrings{ + FixtureStrings() { + name = NULL; + list = NULL; + + int numNames = 5; + const char *names[] = { "David", "Kevin", "Michael", "Craig", "Jimi" }; + + list = create_list(sizeof(char *), free_string); + + for (int i = 0; i < numNames; i++) { + name = _strdup(names[i]); + append_list(list, &name); + } + } + ~FixtureStrings() { + delete_list(list); + } + char *name; + list_t *list; +}; + +BOOST_FIXTURE_TEST_CASE(test_string_list, FixtureStrings) { + + BOOST_CHECK(size_list(list) == 5); + + for_each_list(list, iterate_string); } -BOOST_AUTO_TEST_CASE(test_string_list) { - int i, numNames = 5; - const char *names[] = { "David", "Kevin", "Michael", "Craig", "Jimi" }; +BOOST_FIXTURE_TEST_CASE(test_head_list, FixtureStrings) { - list_t *list = NULL; + void *temp = head_list(list, true); - list = create_list(sizeof(char *), free_string); + BOOST_CHECK(check_string(*(char **)temp, "David")); + BOOST_CHECK(size_list(list) == 4); - char *name; - for (i = 0; i < numNames; i++) { - name = _strdup(names[i]); - append_list(list, &name); - } - - BOOST_CHECK(size_list(list) == 5); - - for_each_list(list, iterate_string); - - delete_list(list); + free_string(temp); + free(temp); } -BOOST_AUTO_TEST_CASE(test_head_list) { - int i, numNames = 5; - const char *names[] = { "David", "Kevin", "Michael", "Craig", "Jimi" }; +BOOST_FIXTURE_TEST_CASE(test_tail_list, FixtureStrings) { - list_t *list = NULL; + void *temp = tail_list(list); - list = create_list(sizeof(char *), free_string); + BOOST_CHECK(check_string(*(char **)temp, "Jimi")); + BOOST_CHECK(size_list(list) == 5); - char *name; - for (i = 0; i < numNames; i++) { - name = _strdup(names[i]); - append_list(list, &name); - } - BOOST_CHECK(size_list(list) == 5); - - - char *temp = NULL; - head_list(list, &(void *)temp, true); - name = *(char **)temp; - - BOOST_CHECK(size_list(list) == 4); - - free(temp); - delete_list(list); + free(temp); }