1 // A global constructor from a non-instrumented part calls a function
2 // in an instrumented part.
3 // Regression test for https://code.google.com/p/address-sanitizer/issues/detail?id=363.
4 
5 // RUN: %clangxx      -DINSTRUMENTED_PART=0 -c %s -o %t-uninst.o
6 // RUN: %clangxx_asan -DINSTRUMENTED_PART=1 -c %s -o %t-inst.o
7 // RUN: %clangxx_asan %t-uninst.o %t-inst.o -o %t
8 
9 // RUN: %run %t 2>&1 | FileCheck %s
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 
15 void func(char *ptr);
16 
17 #if INSTRUMENTED_PART == 1
18 
func(char * ptr)19 void func(char *ptr) {
20   *ptr = 'X';
21 }
22 
23 #else // INSTRUMENTED_PART == 1
24 
25 struct C1 {
C1C126   C1() {
27     printf("Hello ");
28     char buffer[10] = "world";
29     func(buffer);
30     printf("%s\n", buffer);
31   }
32 };
33 
34 C1 *obj = new C1();
35 
main(int argc,const char * argv[])36 int main(int argc, const char *argv[]) {
37   return 0;
38 }
39 
40 #endif // INSTRUMENTED_PART == 1
41 
42 // CHECK: Hello Xorld
43