1// RUN: %clangxx -g %s -o %t
2// RUN: %env_tool_opts=decorate_proc_maps=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-%tool_name
3
4// REQUIRES: stable-runtime
5// XFAIL: android && asan
6
7#include <errno.h>
8#include <fcntl.h>
9#include <pthread.h>
10#include <stdio.h>
11#include <sys/stat.h>
12#include <sys/types.h>
13#include <unistd.h>
14
15bool CopyFdToFd(int in_fd, int out_fd) {
16 const size_t kBufSize = 0x10000;
17 static char buf[kBufSize];
18 while (true) {
19 ssize_t got = read(fd: in_fd, buf: buf, nbytes: kBufSize);
20 if (got > 0) {
21 write(fd: out_fd, buf: buf, n: got);
22 } else if (got == 0) {
23 break;
24 } else if (errno != EAGAIN || errno != EWOULDBLOCK || errno != EINTR) {
25 fprintf(stderr, format: "error reading file, errno %d\n", errno);
26 return false;
27 }
28 }
29 return true;
30}
31
32void *ThreadFn(void *arg) {
33 (void)arg;
34 int fd = open(file: "/proc/self/maps", O_RDONLY);
35 bool res = CopyFdToFd(in_fd: fd, out_fd: 2);
36 close(fd: fd);
37 return (void *)!res;
38}
39
40int main(void) {
41 pthread_t t;
42 void *res;
43 pthread_create(newthread: &t, attr: 0, start_routine: ThreadFn, arg: 0);
44 pthread_join(th: t, thread_return: &res);
45 return (int)(size_t)res;
46}
47
48// CHECK-asan: rw-p {{.*}} [low shadow]
49// CHECK-asan: ---p {{.*}} [shadow gap]
50// CHECK-asan: rw-p {{.*}} [high shadow]
51
52// CHECK-hwasan: rw-p {{.*}} [low shadow]
53// CHECK-hwasan: ---p {{.*}} [shadow gap]
54// CHECK-hwasan: rw-p {{.*}} [high shadow]
55
56// CHECK-msan: ---p {{.*}} [invalid]
57// CHECK-msan: rw-p {{.*}} [shadow{{.*}}]
58// CHECK-msan: ---p {{.*}} [origin{{.*}}]
59
60// CHECK-tsan: rw-p {{.*}} [shadow]
61// CHECK-tsan: rw-p {{.*}} [meta shadow]
62
63// Nothing interesting with standalone LSan and UBSan.
64// CHECK-lsan: decorate_proc_maps
65// CHECK-ubsan: decorate_proc_maps
66

source code of compiler-rt/test/sanitizer_common/TestCases/Linux/decorate_proc_maps.cpp