From 752d9adb5c2978e7e21c39a19d7297dc88f24e5c Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 19 May 2022 11:10:00 +0100 Subject: [PATCH] Fixed final sanitizer issues --- include/etl/memory.h | 18 +++++++ test/runtests.sh | 2 - test/test_memory.cpp | 30 ++++++----- test/test_pool_external_buffer.cpp | 60 ++++++++++++++++------ test/test_variant_pool_external_buffer.cpp | 22 +++++--- test/test_vector_external_buffer.cpp | 21 ++++++++ 6 files changed, 117 insertions(+), 36 deletions(-) diff --git a/include/etl/memory.h b/include/etl/memory.h index 5fad6b41..ffa5236d 100644 --- a/include/etl/memory.h +++ b/include/etl/memory.h @@ -1550,6 +1550,24 @@ namespace etl return (p != ETL_NULLPTR); } +#if ETL_USING_CPP11 && ETL_USING_STL + //********************************* + unique_ptr& operator =(std::nullptr_t) ETL_NOEXCEPT + { + reset(nullptr); + + return *this; + } +#else + //********************************* + unique_ptr& operator =(void*) ETL_NOEXCEPT + { + reset(NULL); + + return *this; + } +#endif + #if ETL_USING_CPP11 //********************************* unique_ptr& operator =(unique_ptr&& p_) ETL_NOEXCEPT diff --git a/test/runtests.sh b/test/runtests.sh index a1b19a49..18504ddb 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -6,8 +6,6 @@ cd build-make || exit 1 echo "ETL Tests" > log.txt -export ASAN_OPTIONS=alloc_dealloc_mismatch=0,detect_leaks=0 - #****************************************************************************** # GCC #****************************************************************************** diff --git a/test/test_memory.cpp b/test/test_memory.cpp index 9ab7e522..77255b35 100644 --- a/test/test_memory.cpp +++ b/test/test_memory.cpp @@ -39,9 +39,9 @@ SOFTWARE. #include #include #include - #include + namespace { typedef std::string non_trivial_t; @@ -879,10 +879,13 @@ namespace //************************************************************************* TEST(test_unique_ptr_release) { - etl::unique_ptr up(new int); + auto buffer = new int; + etl::unique_ptr up(buffer); CHECK(up.release() != nullptr); CHECK(!bool(up)); + + delete buffer; } //************************************************************************* @@ -958,7 +961,7 @@ namespace //************************************************************************* TEST(test_unique_ptr_from_array_pointer_construction) { - etl::unique_ptr up(new int[4]); + etl::unique_ptr up(new int[4]); std::iota(&up[0], &up[4], 0); CHECK(up.get() != nullptr); @@ -972,9 +975,9 @@ namespace //************************************************************************* TEST(test_unique_ptr_move_array_construction) { - etl::unique_ptr up1(new int[4]); + etl::unique_ptr up1(new int[4]); std::iota(&up1[0], &up1[4], 0); - etl::unique_ptr up2(std::move(up1)); + etl::unique_ptr up2(std::move(up1)); CHECK(up1.get() == nullptr); CHECK(!bool(up1)); @@ -989,17 +992,20 @@ namespace //************************************************************************* TEST(test_unique_ptr_array_release) { - etl::unique_ptr up(new int[4]); + auto buffer = new int[4]; + etl::unique_ptr up(buffer); std::iota(&up[0], &up[4], 0); CHECK(up.release() != nullptr); CHECK(!bool(up)); + + delete[] buffer; } //************************************************************************* TEST(test_unique_ptr_array_reset) { - etl::unique_ptr up(new int[4]); + etl::unique_ptr up(new int[4]); std::iota(&up[0], &up[4], 0); int* p = new int[4]; @@ -1019,10 +1025,10 @@ namespace //************************************************************************* TEST(test_unique_ptr_array_swap) { - etl::unique_ptr up1(new int[4]); + etl::unique_ptr up1(new int[4]); std::iota(&up1[0], &up1[4], 0); - etl::unique_ptr up2(new int[4]); + etl::unique_ptr up2(new int[4]); std::iota(&up2[0], &up2[4], 4); up1.swap(up2); @@ -1041,7 +1047,7 @@ namespace //************************************************************************* TEST(test_unique_ptr_array_from_nullptr_assignment) { - etl::unique_ptr up(new int[4]); + etl::unique_ptr up(new int[4]); up = nullptr; @@ -1052,10 +1058,10 @@ namespace //************************************************************************* TEST(test_unique_ptr_array_move_assignment) { - etl::unique_ptr up1(new int[4]); + etl::unique_ptr up1(new int[4]); std::iota(&up1[0], &up1[4], 0); - etl::unique_ptr up2(new int[4]); + etl::unique_ptr up2(new int[4]); std::iota(&up2[0], &up2[4], 4); up1 = std::move(up2); diff --git a/test/test_pool_external_buffer.cpp b/test/test_pool_external_buffer.cpp index c2298c29..0088eafd 100644 --- a/test/test_pool_external_buffer.cpp +++ b/test/test_pool_external_buffer.cpp @@ -166,7 +166,7 @@ namespace TEST(test_allocate) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); Test_Data* p1 = nullptr; @@ -187,13 +187,15 @@ namespace CHECK(p3 != p4); CHECK_THROW(pool.allocate(), etl::pool_no_allocation); + + delete[] buffer; } //************************************************************************* TEST(test_release) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); Test_Data* p1 = pool.allocate(); @@ -211,13 +213,15 @@ namespace Test_Data not_in_pool; CHECK_THROW(pool.release(¬_in_pool), etl::pool_object_not_in_pool); + + delete[] buffer; } //************************************************************************* TEST(test_allocate_release) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); Test_Data* p1 = pool.allocate(); @@ -264,13 +268,15 @@ namespace CHECK(p7 != p6); CHECK(pool.full()); + + delete[] buffer; } //************************************************************************* TEST(test_available) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); CHECK_EQUAL(4U, pool.available()); @@ -288,23 +294,27 @@ namespace p = pool.allocate(); CHECK_EQUAL(0U, pool.available()); + + delete[] buffer; } //************************************************************************* TEST(test_max_size) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); CHECK(pool.max_size() == 4U); + + delete[] buffer; } //************************************************************************* TEST(test_size) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); CHECK_EQUAL(0U, pool.size()); @@ -322,13 +332,15 @@ namespace p = pool.allocate(); CHECK_EQUAL(4U, pool.size()); + + delete[] buffer; } //************************************************************************* TEST(test_empty_full) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); CHECK(pool.empty()); @@ -351,13 +363,15 @@ namespace p = pool.allocate(); CHECK(!pool.empty()); CHECK(pool.full()); + + delete[] buffer; } //************************************************************************* TEST(test_is_in_pool) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); Test_Data not_in_pool; @@ -366,6 +380,8 @@ namespace CHECK(pool.is_in_pool(p1)); CHECK(!pool.is_in_pool(¬_in_pool)); + + delete[] buffer; } //************************************************************************* @@ -378,12 +394,14 @@ namespace }; const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); etl::ipool& ip = pool; CHECK_THROW(ip.allocate(), etl::pool_element_size); + + delete[] buffer; } //************************************************************************* @@ -391,19 +409,19 @@ namespace { const size_t SIZE = 4; - auto* buffer0 = new etl::pool_ext::element[SIZE]; + auto buffer0 = new etl::pool_ext::element[SIZE]; etl::pool_ext pool0(buffer0, SIZE); - auto* buffer1 = new etl::pool_ext::element[SIZE]; + auto buffer1 = new etl::pool_ext::element[SIZE]; etl::pool_ext pool1(buffer1, SIZE); - auto* buffer2 = new etl::pool_ext::element[SIZE]; + auto buffer2 = new etl::pool_ext::element[SIZE]; etl::pool_ext pool2(buffer2, SIZE); - auto* buffer3 = new etl::pool_ext::element[SIZE]; + auto buffer3 = new etl::pool_ext::element[SIZE]; etl::pool_ext pool3(buffer3, SIZE); - auto* buffer4 = new etl::pool_ext::element[SIZE]; + auto buffer4 = new etl::pool_ext::element[SIZE]; etl::pool_ext pool4(buffer4, SIZE); @@ -454,17 +472,25 @@ namespace CHECK_EQUAL(pool4.max_size(), pool4.available()); CHECK_EQUAL(0U, pool4.size()); + + delete[] buffer0; + delete[] buffer1; + delete[] buffer2; + delete[] buffer3; + delete[] buffer4; } //************************************************************************* TEST(test_allocate_release_non_class) { const size_t SIZE = 4; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext pool(buffer, SIZE); int* i = pool.allocate(); pool.release(i); + + delete[] buffer; } //************************************************************************* @@ -473,7 +499,7 @@ namespace using elem_type = uint8_t[10]; const size_t SIZE = 3; - auto* buffer = new etl::pool_ext::element[SIZE]; + auto buffer = new etl::pool_ext::element[SIZE]; etl::pool_ext memPool(buffer, SIZE); CHECK_EQUAL(3, memPool.available()); @@ -488,6 +514,8 @@ namespace CHECK_EQUAL(3, memPool.available()); CHECK_EQUAL(0, memPool.size()); + + delete[] buffer; } } } diff --git a/test/test_variant_pool_external_buffer.cpp b/test/test_variant_pool_external_buffer.cpp index 740ee356..ecd8e63e 100644 --- a/test/test_variant_pool_external_buffer.cpp +++ b/test/test_variant_pool_external_buffer.cpp @@ -176,7 +176,7 @@ namespace //************************************************************************* TEST(test_sizes) { - auto* buffer = new Factory::element[SIZE]; + auto buffer = new Factory::element[SIZE]; Factory variant_pool(buffer, SIZE); size_t ms = variant_pool.max_size(); @@ -202,12 +202,14 @@ namespace CHECK(variant_pool.full()); CHECK_THROW(variant_pool.create(), etl::pool_no_allocation); + + delete[] buffer; } //************************************************************************* TEST(test_create_release) { - auto* buffer = new Factory::element[SIZE]; + auto buffer = new Factory::element[SIZE]; Factory variant_pool(buffer, SIZE); Base* p; @@ -253,12 +255,14 @@ namespace // Integral int* pi = variant_pool.create(); variant_pool.destroy(pi); + + delete[] buffer; } //************************************************************************* TEST(test_create_release_const) { - auto* buffer = new Factory::element[SIZE]; + auto buffer = new Factory::element[SIZE]; Factory variant_pool(buffer, SIZE); const Derived1& d = *variant_pool.create(); @@ -267,12 +271,13 @@ namespace variant_pool.destroy(&d); CHECK(destructor); + delete[] buffer; } //************************************************************************* TEST(test_create_emplace) { - auto* buffer = new Factory::element[SIZE]; + auto buffer = new Factory::element[SIZE]; Factory variant_pool(buffer, SIZE); Base* p; @@ -297,14 +302,16 @@ namespace pd3 = static_cast(p); CHECK_EQUAL("constructed1234", pd3->s); variant_pool.destroy(p); + + delete[] buffer; } //************************************************************************* TEST(test_did_not_create) { - auto* buffer1 = new Factory::element[SIZE]; + auto buffer1 = new Factory::element[SIZE]; Factory variant_pool1(buffer1, SIZE); - auto* buffer2 = new Factory::element[SIZE]; + auto buffer2 = new Factory::element[SIZE]; Factory variant_pool2(buffer2, SIZE); Base* p; @@ -314,6 +321,9 @@ namespace p = variant_pool2.create(); CHECK_THROW(variant_pool1.destroy(p), etl::pool_object_not_in_pool); + + delete[] buffer1; + delete[] buffer2; } }; } diff --git a/test/test_vector_external_buffer.cpp b/test/test_vector_external_buffer.cpp index d09a7d06..76e2760a 100644 --- a/test/test_vector_external_buffer.cpp +++ b/test/test_vector_external_buffer.cpp @@ -32,6 +32,7 @@ SOFTWARE. #include #include #include +#include #include "etl/vector.h" @@ -409,6 +410,26 @@ namespace CHECK_EQUAL(data.size(), NEW_SIZE); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_uninitialized_resize_after_contruct) + { + int c_buffer[SIZE]; + std::iota(c_buffer, c_buffer + SIZE, 1); + + int compare_buffer[SIZE]; + std::iota(compare_buffer, compare_buffer + SIZE, 1); + + Data data(c_buffer, SIZE); + data.uninitialized_resize(SIZE); + + CHECK_EQUAL(SIZE, data.size()); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(data[i], compare_buffer[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_empty) {