16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316
26a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// XFAIL: android
3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// XFAIL: mips
46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines//
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 %s -o %t && %run %t
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DPOSITIVE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
7341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
8341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <assert.h>
9341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <stdio.h>
10341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/ptrace.h>
11341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/types.h>
12341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/user.h>
13341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/wait.h>
14341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <unistd.h>
15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <sys/uio.h> // for iovec
16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <elf.h> // for NT_PRSTATUS
17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __aarch64__
18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# include <asm/ptrace.h>
19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if defined(__i386__) || defined(__x86_64__)
22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef user_regs_struct   regs_struct;
23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef user_fpregs_struct fpregs_struct;
24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if defined(__i386__)
25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define REG_IP  eip
26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define REG_IP  rip
28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs)    printf ("%lx\n", (unsigned long) (__regs.REG_IP))
30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs)  printf ("%lx\n", (unsigned long) (__fpregs.cwd))
31799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define __PTRACE_FPREQUEST PTRACE_GETFPREGS
32799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
33799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__aarch64__)
34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct user_pt_regs      regs_struct;
35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct user_fpsimd_state fpregs_struct;
36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs)    printf ("%x\n", (unsigned) (__regs.pc))
37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs)  printf ("%x\n", (unsigned) (__fpregs.fpsr))
38799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define ARCH_IOVEC_FOR_GETREGSET
39799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
40799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__powerpc64__)
41799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct pt_regs regs_struct;
42799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef elf_fpregset_t fpregs_struct;
43799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs)    printf ("%lx\n", (unsigned long) (__regs.nip))
44799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs)  printf ("%lx\n", (elf_greg_t)fpregs[32])
45799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define ARCH_IOVEC_FOR_GETREGSET
46799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
47799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__mips__)
48799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct pt_regs regs_struct;
49799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef elf_fpregset_t fpregs_struct;
50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs)    printf ("%lx\n", (unsigned long) (__regs.cp0_epc))
51799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs)  printf ("%lx\n", (elf_greg_t) (__fpregs[32]))
52799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define __PTRACE_FPREQUEST PTRACE_GETFPREGS
53799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
54799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__arm__)
55799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# include <asm/ptrace.h>
56799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# include <sys/procfs.h>
57799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct pt_regs regs_struct;
58799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef char fpregs_struct[ARM_VFPREGS_SIZE];
59799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs)    printf ("%x\n", (unsigned) (__regs.ARM_pc))
60799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs)  printf ("%x\n", (unsigned) (__fpregs + 32 * 8))
61799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define __PTRACE_FPREQUEST PTRACE_GETVFPREGS
62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#elif defined(__s390__)
64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainartypedef _user_regs_struct   regs_struct;
65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainartypedef _user_fpregs_struct fpregs_struct;
66c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define PRINT_REG_PC(__regs)    printf ("%lx\n", (unsigned long) (__regs.psw.addr))
67c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define PRINT_REG_FP(__fpregs)  printf ("%lx\n", (unsigned long) (__fpregs.fpc))
68c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define ARCH_IOVEC_FOR_GETREGSET
69799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
70799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
71341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
72341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanovint main(void) {
73341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid_t pid;
74341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid = fork();
75341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  if (pid == 0) { // child
76341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_TRACEME, 0, NULL, NULL);
77341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    execl("/bin/true", "true", NULL);
78341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  } else {
79341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
80799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    regs_struct regs;
81799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    regs_struct* volatile pregs = &regs;
82799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef ARCH_IOVEC_FOR_GETREGSET
83799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    struct iovec regset_io;
84799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
85341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    int res;
86799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
87341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#ifdef POSITIVE
88341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ++pregs;
89341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
90799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
91799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef ARCH_IOVEC_FOR_GETREGSET
92799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_REQUEST  PTRACE_GETREGSET
93799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_ARGS     (void*)NT_PRSTATUS, (void*)&regset_io
94799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    regset_io.iov_base = pregs;
95799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    regset_io.iov_len = sizeof(regs_struct);
96799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
97799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_REQUEST  PTRACE_GETREGS
98799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_ARGS     NULL, pregs
99799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
100799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    res = ptrace((enum __ptrace_request)__PTRACE_REQUEST, pid, __PTRACE_ARGS);
101341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    // CHECK: AddressSanitizer: stack-buffer-overflow
102341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    // CHECK: {{.*ptrace.cc:}}[[@LINE-2]]
103341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
104799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    PRINT_REG_PC(regs);
105799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
106799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    fpregs_struct fpregs;
107799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef ARCH_IOVEC_FOR_GETREGSET
108799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_FPREQUEST  PTRACE_GETREGSET
109799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_FPARGS     (void*)NT_PRSTATUS, (void*)&regset_io
110799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    regset_io.iov_base = &fpregs;
111799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    regset_io.iov_len = sizeof(fpregs_struct);
112799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    res = ptrace((enum __ptrace_request)PTRACE_GETREGSET, pid, (void*)NT_FPREGSET,
113799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar                 (void*)&regset_io);
114341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else
115799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_FPARGS     NULL, &fpregs
116341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
117799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    res = ptrace((enum __ptrace_request)__PTRACE_FPREQUEST, pid, __PTRACE_FPARGS);
118341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
119799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    PRINT_REG_FP(fpregs);
120341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
121799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __i386__
122341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_fpxregs_struct fpxregs;
123341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETFPXREGS, pid, NULL, &fpxregs);
124341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
125341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", (unsigned long)fpxregs.mxcsr);
126341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
127341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
128341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_CONT, pid, NULL, NULL);
129341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
130341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  }
131341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  return 0;
132341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov}
133