// RUN: %clang_hwasan -mllvm -hwasan-globals=0 -g %s -o %t // RUN: %env_hwasan_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=A // RUN: %env_hwasan_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=B // A: rw-p {{.*}}hwasan threads] // A-NEXT: ---p {{.*}}shadow gap] // A-NEXT: rw-p {{.*}}low shadow] // A-NEXT: ---p {{.*}}shadow gap] // A-NEXT: rw-p {{.*}}high shadow] // B-DAG: rw-p {{.*}}SizeClassAllocator: region info] // B-DAG: rw-p {{.*}}LargeMmapAllocator] // B-DAG: rw-p {{.*}}StackStore] #include #include #include #include #include #include #include #include void CopyFdToFd(int in_fd, int out_fd) { const size_t kBufSize = 0x10000; static char buf[kBufSize]; while (1) { ssize_t got = read(in_fd, buf, kBufSize); if (got > 0) { write(out_fd, buf, got); } else if (got == 0) { break; } else if (errno != EAGAIN || errno != EWOULDBLOCK || errno != EINTR) { fprintf(stderr, "error reading file, errno %d\n", errno); abort(); } } } void *ThreadFn(void *arg) { (void)arg; int fd = open("/proc/self/maps", O_RDONLY); CopyFdToFd(fd, 2); close(fd); return NULL; } int main(void) { pthread_t t; void * volatile res = malloc(100); void * volatile res2 = malloc(1000000); pthread_create(&t, 0, ThreadFn, 0); pthread_join(t, 0); int ret_val = (int)(size_t)res; free(res); free(res2); return ret_val; }