1 // RUN: %clangxx_asan -std=c++11 -O0 %s -o %t
2 // RUN: %run %t 2>&1 | FileCheck %s
3 // RUN: %env_asan_opts=debug=1,verbosity=2 %run %t 2>&1 | FileCheck %s
4 
5 // Test ASan initialization
6 
7 #include <assert.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 
12 extern "C" const char *__asan_default_options() {
13   return "test_only_emulate_no_memorymap=1";
14 }
15 
16 void parent(int argc, char **argv) {
17   fprintf(stderr, "hello\n");
18   // CHECK: hello
19   close(0);
20   close(1);
21   dup2(2, 3);
22   close(2);
23   char *const newargv[] = {argv[0], (char *)"x", nullptr};
24   execv(argv[0], newargv);
25   perror("execve");
26   exit(1);
27 }
28 
29 void child() {
30   assert(dup(3) == 0);
31   assert(dup(3) == 1);
32   assert(dup(3) == 2);
33   fprintf(stderr, "world\n");
34   // CHECK: world
35 }
36 
37 int main(int argc, char **argv) {
38   if (argc == 1) {
39     parent(argc, argv);
40   } else {
41     child();
42   }
43 }
44