1673dc3d4SNico Weber // Main executable is uninstrumented, but linked to ASan runtime.
2673dc3d4SNico Weber // Regression test for https://code.google.com/p/address-sanitizer/issues/detail?id=357.
3673dc3d4SNico Weber 
4673dc3d4SNico Weber // RUN: %clangxx -g -O0 %s -c -o %t.o
5673dc3d4SNico Weber // RUN: %clangxx_asan -g -O0 %t.o -o %t
6673dc3d4SNico Weber // RUN: %run %t 2>&1 | FileCheck %s
7673dc3d4SNico Weber 
8673dc3d4SNico Weber #include <stdio.h>
9673dc3d4SNico Weber #include <stdlib.h>
10673dc3d4SNico Weber #include <string.h>
11673dc3d4SNico Weber 
12673dc3d4SNico Weber #include "sanitizer/asan_interface.h"
13*b316c302SEmily Shi #if __has_feature(ptrauth_calls)
14*b316c302SEmily Shi #  include <ptrauth.h>
15*b316c302SEmily Shi #endif
16673dc3d4SNico Weber 
test_shadow(char * p,size_t size)17673dc3d4SNico Weber void test_shadow(char *p, size_t size) {
18673dc3d4SNico Weber   fprintf(stderr, "p = %p\n", p);
19673dc3d4SNico Weber   char *q = (char *)__asan_region_is_poisoned(p, size);
20673dc3d4SNico Weber   fprintf(stderr, "=%zd=\n", q ? q - p : -1);
21673dc3d4SNico Weber }
22673dc3d4SNico Weber 
main(int argc,char * argv[])23673dc3d4SNico Weber int main(int argc, char *argv[]) {
24673dc3d4SNico Weber   char *p = (char *)malloc(10000);
25673dc3d4SNico Weber   test_shadow(p, 100);
26673dc3d4SNico Weber   free(p);
27673dc3d4SNico Weber   // CHECK: =-1=
28673dc3d4SNico Weber 
29*b316c302SEmily Shi   char *mainptr;
30*b316c302SEmily Shi #if __has_feature(ptrauth_calls)
31*b316c302SEmily Shi   mainptr = (char *)ptrauth_strip((void *)&main, ptrauth_key_return_address);
32*b316c302SEmily Shi #else
33*b316c302SEmily Shi   mainptr = (char *)&main;
34*b316c302SEmily Shi #endif
35*b316c302SEmily Shi   test_shadow(mainptr, 1);
36673dc3d4SNico Weber   // CHECK: =-1=
37673dc3d4SNico Weber 
38673dc3d4SNico Weber   test_shadow((char *)&p, 1);
39673dc3d4SNico Weber   // CHECK: =-1=
40673dc3d4SNico Weber 
41673dc3d4SNico Weber   return 0;
42673dc3d4SNico Weber }
43