diff --git a/compiler-rt/test/sanitizer_common/TestCases/allocator_interface.cpp b/compiler-rt/test/sanitizer_common/TestCases/allocator_interface.cpp new file mode 100644 index 000000000000..815a7964d941 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/allocator_interface.cpp @@ -0,0 +1,49 @@ +// RUN: %clangxx %s -o %t && %run %t 1234 +// RUN: %clangxx %s -o %t && %run %t 5678910 + +// No allocator. +// UNSUPPORTED: ubsan + +// FIXME: implementation is incomplete. +// XFAIL: msan, lsan, hwasan, tsan + +#include +#include +#include +#include +#include + +void Test(int size) { + auto allocated_bytes_before = __sanitizer_get_current_allocated_bytes(); + int *p = (int *)malloc(size); + assert(__sanitizer_get_estimated_allocated_size(size) >= size); + assert(__sanitizer_get_ownership(p)); + assert(!__sanitizer_get_ownership(&p)); + assert(__sanitizer_get_allocated_size(p) == size); + assert(__sanitizer_get_allocated_begin(p) == p); + assert(__sanitizer_get_allocated_begin(p + 1) == p); + assert(__sanitizer_get_current_allocated_bytes() >= + size + allocated_bytes_before); + assert(__sanitizer_get_current_allocated_bytes() <= + 2 * size + allocated_bytes_before); + assert(__sanitizer_get_heap_size() >= size); + free(p); + + // These are not implemented. + assert(__sanitizer_get_unmapped_bytes() <= 1); + assert(__sanitizer_get_free_bytes() > 0); + + __sanitizer_purge_allocator(); +} + +int main(int argc, char **argv) { + int size = atoi(argv[1]); + + Test(size); + + // Check the thread local caches work as well. + std::thread t(Test, size); + t.join(); + + return 0; +} \ No newline at end of file