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