diff options
author | Peter Elliott <pelliott@ualberta.ca> | 2022-05-04 23:21:45 -0600 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-05-20 22:18:54 +0200 |
commit | 420f78ca8be9b497eeb8e63303969f7bb85cf245 (patch) | |
tree | 89de3983a945f8de6423af7f4a99973c759aecba /Tests | |
parent | 4e0adb638dfe51916cbb708eb4cf6c4dee4e39d9 (diff) | |
download | serenity-420f78ca8be9b497eeb8e63303969f7bb85cf245.zip |
Tests: Add tests for posix_memalign(3) and aligned_alloc(3)
Diffstat (limited to 'Tests')
-rw-r--r-- | Tests/LibC/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Tests/LibC/TestMemalign.cpp | 103 |
2 files changed, 104 insertions, 0 deletions
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 <pelliott@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibTest/TestCase.h> + +#include <LibC/mallocdefs.h> +#include <stdlib.h> + +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<uintptr_t>(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 +} |