From 420f78ca8be9b497eeb8e63303969f7bb85cf245 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Wed, 4 May 2022 23:21:45 -0600 Subject: Tests: Add tests for posix_memalign(3) and aligned_alloc(3) --- Tests/LibC/CMakeLists.txt | 1 + Tests/LibC/TestMemalign.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 Tests/LibC/TestMemalign.cpp (limited to 'Tests') diff --git a/Tests/LibC/CMakeLists.txt b/Tests/LibC/CMakeLists.txt index 4d60aea78a..47b917f5a5 100644 --- a/Tests/LibC/CMakeLists.txt +++ b/Tests/LibC/CMakeLists.txt @@ -10,6 +10,7 @@ set(TEST_SOURCES TestLibCString.cpp TestLibCTime.cpp TestMalloc.cpp + TestMemalign.cpp TestMemmem.cpp TestMkDir.cpp TestQsort.cpp diff --git a/Tests/LibC/TestMemalign.cpp b/Tests/LibC/TestMemalign.cpp new file mode 100644 index 0000000000..61b616958d --- /dev/null +++ b/Tests/LibC/TestMemalign.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2022, Peter Elliott + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +#include +#include + +static constexpr size_t runs = 5000; +static constexpr size_t ptrs_per_run = 20; + +static size_t random_alignment() +{ + return 1 << (rand() % 16); +} + +static size_t random_size() +{ + int r = rand() % num_size_classes; + if (r == num_size_classes - 1) { + return rand() % (1 << 17); + } + + return size_classes[r] + (rand() % (size_classes[r + 1] - size_classes[r])); +} + +static bool is_aligned(void* ptr, size_t align) +{ + return (reinterpret_cast(ptr) & (align - 1)) == 0; +} + +TEST_CASE(posix_memalign_fuzz) +{ + EXPECT_NO_CRASH("posix_memalign should not crash under regular use", [] { + for (size_t i = 0; i < runs; ++i) { + size_t align = random_alignment(); + size_t size = random_size(); + + for (size_t j = 0; j < 2; ++j) { + void* ptrs[ptrs_per_run]; + + for (size_t k = 0; k < ptrs_per_run; ++k) { + EXPECT_EQ(posix_memalign(&(ptrs[k]), align, size), 0); + EXPECT(is_aligned(ptrs[k], align)); + } + for (size_t k = 0; k < ptrs_per_run; ++k) { + free(ptrs[k]); + } + } + } + + return Test::Crash::Failure::DidNotCrash; + }); +} + +TEST_CASE(posix_memalign_not_power2) +{ + char secret_ptr[0]; + void* memptr = secret_ptr; + EXPECT_EQ(posix_memalign(&memptr, 7, 256), EINVAL); + EXPECT_EQ(memptr, secret_ptr); +} + +TEST_CASE(aligned_alloc_fuzz) +{ + EXPECT_NO_CRASH("aligned_alloc should not crash under regular use", [] { + for (size_t i = 0; i < runs; ++i) { + size_t align = random_alignment(); + size_t size = random_size(); + + for (size_t j = 0; j < 2; ++j) { + void* ptrs[ptrs_per_run]; + + for (size_t k = 0; k < ptrs_per_run; ++k) { + ptrs[k] = aligned_alloc(align, size); + EXPECT(ptrs[k]); + EXPECT(is_aligned(ptrs[k], align)); + } + for (size_t k = 0; k < ptrs_per_run; ++k) { + free(ptrs[k]); + } + } + } + + return Test::Crash::Failure::DidNotCrash; + }); +} + +TEST_CASE(aligned_alloc_not_power2) +{ +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wnon-power-of-two-alignment" +#endif + EXPECT_EQ(aligned_alloc(7, 256), nullptr); + EXPECT_EQ(errno, EINVAL); +#ifdef __clang__ +# pragma clang diagnostic pop +#endif +} -- cgit v1.2.3