diff options
Diffstat (limited to 'test/asan/TestCases/Darwin/mixing-global-constructors.cc')
-rw-r--r-- | test/asan/TestCases/Darwin/mixing-global-constructors.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/asan/TestCases/Darwin/mixing-global-constructors.cc b/test/asan/TestCases/Darwin/mixing-global-constructors.cc new file mode 100644 index 000000000000..0b0f15cc78d5 --- /dev/null +++ b/test/asan/TestCases/Darwin/mixing-global-constructors.cc @@ -0,0 +1,42 @@ +// 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 |