
#144648 was reverted because it failed the new sanitizer test `munmap_clear_shadow.c` in IOS's CI. That issue could be fixed by disabling the test on some platforms, due to the incompatibility of the test on these platforms. In detail, we should disable the test in FreeBSD, Apple, NetBSD, Solaris, and Haiku, where `ReleaseMemoryPagesToOS` executes `madvise(beg, end, MADV_FREE)`, which tags the relevant pages as 'FREE' and does not release them immediately.
34 lines
1.2 KiB
C++
34 lines
1.2 KiB
C++
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
|
|
|
|
#include "java.h"
|
|
#include <errno.h>
|
|
#include <sys/mman.h>
|
|
|
|
int main() {
|
|
// Test a non-regular kHeapSize
|
|
// Previously __tsan_java_init failed because it encountered non-zero meta
|
|
// shadow for the destination.
|
|
size_t const kPageSize = sysconf(_SC_PAGESIZE);
|
|
int const kSize = kPageSize - 1;
|
|
jptr jheap2 = (jptr)mmap(0, kSize, PROT_READ | PROT_WRITE,
|
|
MAP_ANON | MAP_PRIVATE, -1, 0);
|
|
if (jheap2 == (jptr)MAP_FAILED)
|
|
return printf("mmap failed with %d\n", errno);
|
|
__atomic_store_n((int *)(jheap2 + kSize - 3), 1, __ATOMIC_RELEASE);
|
|
// Due to the previous incorrect meta-end calculation, the following munmap
|
|
// did not clear the tail meta shadow.
|
|
munmap((void *)jheap2, kSize);
|
|
int const kHeapSize2 = kSize + 1;
|
|
jheap2 = (jptr)mmap((void *)jheap2, kHeapSize2, PROT_READ | PROT_WRITE,
|
|
MAP_ANON | MAP_PRIVATE, -1, 0);
|
|
if (jheap2 == (jptr)MAP_FAILED)
|
|
return printf("second mmap failed with %d\n", errno);
|
|
__tsan_java_init(jheap2, kHeapSize2);
|
|
__tsan_java_move(jheap2, jheap2 + kHeapSize2 - 8, 8);
|
|
fprintf(stderr, "DONE\n");
|
|
return __tsan_java_fini();
|
|
}
|
|
|
|
// CHECK-NOT: WARNING: ThreadSanitizer: data race
|
|
// CHECK: DONE
|