15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: android
35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines//
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 %s -o %t && %run %t
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DPOSITIVE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: arm-linux-gnueabi
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>
15341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
16341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanovint main(void) {
17341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid_t pid;
18341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid = fork();
19341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  if (pid == 0) { // child
20341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_TRACEME, 0, NULL, NULL);
21341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    execl("/bin/true", "true", NULL);
22341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  } else {
23341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
24341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_regs_struct regs;
25341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    int res;
26341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_regs_struct * volatile pregs = &regs;
27341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#ifdef POSITIVE
28341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ++pregs;
29341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
30341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETREGS, pid, NULL, pregs);
31341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    // CHECK: AddressSanitizer: stack-buffer-overflow
32341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    // CHECK: {{.*ptrace.cc:}}[[@LINE-2]]
33341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
34341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if __WORDSIZE == 64
35341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%zx\n", regs.rip);
36341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else
37341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", regs.eip);
38341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
39341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
40341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_fpregs_struct fpregs;
41341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETFPREGS, pid, NULL, &fpregs);
42341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
43341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", (unsigned long)fpregs.cwd);
44341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
45341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if __WORDSIZE == 32
46341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_fpxregs_struct fpxregs;
47341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETFPXREGS, pid, NULL, &fpxregs);
48341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
49341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", (unsigned long)fpxregs.mxcsr);
50341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
51341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
52341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_CONT, pid, NULL, NULL);
53341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
54341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  }
55341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  return 0;
56341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov}
57