| // A global constructor from a non-instrumented part calls a function |
| // in an instrumented part. |
| // Regression test for https://code.google.com/p/address-sanitizer/issues/detail?id=363. |
| |
| // RUN: %clangxx -DINSTRUMENTED_PART=0 -c %s -o %t-uninst.o |
| // RUN: %clangxx_asan -DINSTRUMENTED_PART=1 -c %s -o %t-inst.o |
| // RUN: %clangxx_asan %t-uninst.o %t-inst.o -o %t |
| |
| // RUN: %run %t 2>&1 | FileCheck %s |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| void func(char *ptr); |
| |
| #if INSTRUMENTED_PART == 1 |
| |
| void func(char *ptr) { |
| *ptr = 'X'; |
| } |
| |
| #else // INSTRUMENTED_PART == 1 |
| |
| struct C1 { |
| C1() { |
| printf("Hello "); |
| char buffer[10] = "world"; |
| func(buffer); |
| printf("%s\n", buffer); |
| } |
| }; |
| |
| C1 *obj = new C1(); |
| |
| int main(int argc, const char *argv[]) { |
| return 0; |
| } |
| |
| #endif // INSTRUMENTED_PART == 1 |
| |
| // CHECK: Hello Xorld |