//===-- Utils to test conformance of mem functions ------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LIBC_TEST_SRC_STRING_MEMORY_UTILS_MEMORY_CHECK_UTILS_H #define LIBC_TEST_SRC_STRING_MEMORY_UTILS_MEMORY_CHECK_UTILS_H #include "src/__support/CPP/span.h" #include "src/__support/libc_assert.h" // LIBC_ASSERT #include "src/__support/macros/config.h" #include "src/__support/macros/sanitizer.h" #include "src/string/memory_utils/utils.h" #include <stddef.h> // size_t #include <stdint.h> // uintxx_t #include <stdlib.h> // malloc/free namespace LIBC_NAMESPACE_DECL { // Simple structure to allocate a buffer of a particular size. // When ASAN is present it also poisons the whole memory. // This is a utility class to be used by Buffer below, do not use directly. struct PoisonedBuffer { … }; // Simple structure to allocate a buffer (aligned or not) of a particular size. // It is backed by a wider buffer that is marked poisoned when ASAN is present. // The requested region is unpoisoned, this allows catching out of bounds // accesses. enum class Aligned : bool { … }; struct Buffer : private PoisonedBuffer { … }; inline char GetRandomChar() { … } // Randomize the content of the buffer. inline void Randomize(cpp::span<char> buffer) { … } // Copy one span to another. inline void ReferenceCopy(cpp::span<char> dst, const cpp::span<char> src) { … } inline bool IsEqual(const cpp::span<char> a, const cpp::span<char> b) { … } // Checks that FnImpl implements the memcpy semantic. template <auto FnImpl> inline bool CheckMemcpy(cpp::span<char> dst, cpp::span<char> src, size_t size) { … } // Checks that FnImpl implements the memset semantic. template <auto FnImpl> inline bool CheckMemset(cpp::span<char> dst, uint8_t value, size_t size) { … } // Checks that FnImpl implements the bcmp semantic. template <auto FnImpl> inline bool CheckBcmp(cpp::span<char> span1, cpp::span<char> span2, size_t size) { … } // Checks that FnImpl implements the memcmp semantic. template <auto FnImpl> inline bool CheckMemcmp(cpp::span<char> span1, cpp::span<char> span2, size_t size) { … } inline uint16_t Checksum(cpp::span<char> dst) { … } template <auto FnImpl> inline bool CheckMemmove(cpp::span<char> dst, cpp::span<char> src) { … } // Checks that FnImpl implements the memmove semantic. // - Buffer size should be greater than 2 * size + 1. // - Overlap refers to the number of bytes in common between the two buffers: // - Negative means buffers are disjoint // - zero mean they overlap exactly // - Caller is responsible for randomizing the buffer. template <auto FnImpl> inline bool CheckMemmove(cpp::span<char> buffer, size_t size, int overlap) { … } } // namespace LIBC_NAMESPACE_DECL #endif // LIBC_TEST_SRC_STRING_MEMORY_UTILS_MEMORY_CHECK_UTILS_H