59 lines · c
1// RUN: %clang_hwasan -mllvm -hwasan-globals=0 -g %s -o %t2// RUN: %env_hwasan_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=A3// RUN: %env_hwasan_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=B4 5// A: rw-p {{.*}}hwasan threads]6// A-NEXT: ---p {{.*}}shadow gap]7// A-NEXT: rw-p {{.*}}low shadow]8// A-NEXT: ---p {{.*}}shadow gap]9// A-NEXT: rw-p {{.*}}high shadow]10 11// B-DAG: rw-p {{.*}}SizeClassAllocator: region info]12// B-DAG: rw-p {{.*}}LargeMmapAllocator]13// B-DAG: rw-p {{.*}}StackStore]14 15#include <errno.h>16#include <fcntl.h>17#include <pthread.h>18#include <stdio.h>19#include <stdlib.h>20#include <sys/stat.h>21#include <sys/types.h>22#include <unistd.h>23 24void CopyFdToFd(int in_fd, int out_fd) {25 const size_t kBufSize = 0x10000;26 static char buf[kBufSize];27 while (1) {28 ssize_t got = read(in_fd, buf, kBufSize);29 if (got > 0) {30 write(out_fd, buf, got);31 } else if (got == 0) {32 break;33 } else if (errno != EAGAIN || errno != EWOULDBLOCK || errno != EINTR) {34 fprintf(stderr, "error reading file, errno %d\n", errno);35 abort();36 }37 }38}39 40void *ThreadFn(void *arg) {41 (void)arg;42 int fd = open("/proc/self/maps", O_RDONLY);43 CopyFdToFd(fd, 2);44 close(fd);45 return NULL;46}47 48int main(void) {49 pthread_t t;50 void * volatile res = malloc(100);51 void * volatile res2 = malloc(1000000);52 pthread_create(&t, 0, ThreadFn, 0);53 pthread_join(t, 0);54 int ret_val = (int)(size_t)res;55 free(res);56 free(res2);57 return ret_val;58}59