aboutsummaryrefslogtreecommitdiff
path: root/test/asan/TestCases/Darwin/odr-lto.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/asan/TestCases/Darwin/odr-lto.cc')
-rw-r--r--test/asan/TestCases/Darwin/odr-lto.cc45
1 files changed, 45 insertions, 0 deletions
diff --git a/test/asan/TestCases/Darwin/odr-lto.cc b/test/asan/TestCases/Darwin/odr-lto.cc
new file mode 100644
index 000000000000..40abec5827d5
--- /dev/null
+++ b/test/asan/TestCases/Darwin/odr-lto.cc
@@ -0,0 +1,45 @@
+// Check that -asan-use-private-alias and use_odr_indicator=1 silence the false
+// positive ODR violation on Darwin with LTO.
+
+// REQUIRES: lto
+
+// RUN: %clangxx_asan -DPART=0 -c %s -o %t-1.o -flto
+// RUN: %clangxx_asan -DPART=1 -c %s -o %t-2.o -flto
+// RUN: %clangxx_asan %t-1.o %t-2.o -o %t -flto
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-ODR
+
+// RUN: %clangxx_asan -DPART=0 -c %s -o %t-1.o -flto -mllvm -asan-use-private-alias
+// RUN: %clangxx_asan -DPART=1 -c %s -o %t-2.o -flto -mllvm -asan-use-private-alias
+// RUN: %clangxx_asan %t-1.o %t-2.o -o %t -flto
+// RUN: %env_asan_opts=use_odr_indicator=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NO-ODR
+
+#include <stdio.h>
+#include <stdlib.h>
+void putstest();
+
+#if PART == 1
+
+static const char *my_global = "test\n\00abc";
+
+int main()
+{
+ fputs(my_global, stderr);
+ putstest();
+ fprintf(stderr, "Done.\n");
+ return 0;
+}
+
+#else // PART == 1
+
+static const char *my_other_global = "test\n\00abc";
+
+void putstest()
+{
+ fputs(my_other_global, stderr);
+}
+
+#endif // PART == 1
+
+// CHECK-ODR: ERROR: AddressSanitizer: odr-violation
+// CHECK-NO-ODR-NOT: ERROR: AddressSanitizer: odr-violation
+// CHECK-NO-ODR: Done.