diff --git a/compiler-rt/lib/asan/lit_tests/Helpers/initialization-blacklist-extra.cc b/compiler-rt/lib/asan/lit_tests/Helpers/initialization-blacklist-extra.cc new file mode 100644 index 000000000000..09aed2112d5e --- /dev/null +++ b/compiler-rt/lib/asan/lit_tests/Helpers/initialization-blacklist-extra.cc @@ -0,0 +1,15 @@ +int zero_init() { return 0; } +int badGlobal = zero_init(); +int readBadGlobal() { return badGlobal; } + +namespace badNamespace { +class BadClass { + public: + BadClass() { value = 0; } + int value; +}; +// Global object with non-trivial constructor. +BadClass bad_object; +} // namespace badNamespace + +int accessBadObject() { return badNamespace::bad_object.value; } diff --git a/compiler-rt/lib/asan/lit_tests/Helpers/initialization-blacklist.txt b/compiler-rt/lib/asan/lit_tests/Helpers/initialization-blacklist.txt new file mode 100644 index 000000000000..c5f6610937f0 --- /dev/null +++ b/compiler-rt/lib/asan/lit_tests/Helpers/initialization-blacklist.txt @@ -0,0 +1,2 @@ +global-init:*badGlobal* +global-init-type:*badNamespace::BadClass* diff --git a/compiler-rt/lib/asan/lit_tests/initialization-blacklist.cc b/compiler-rt/lib/asan/lit_tests/initialization-blacklist.cc new file mode 100644 index 000000000000..a505779ac925 --- /dev/null +++ b/compiler-rt/lib/asan/lit_tests/initialization-blacklist.cc @@ -0,0 +1,32 @@ +// Test for blacklist functionality of initialization-order checker. + +// RUN: %clangxx_asan -m64 -O0 %s %p/Helpers/initialization-blacklist-extra.cc\ +// RUN: -mllvm -asan-blacklist=%p/Helpers/initialization-blacklist.txt \ +// RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 +// RUN: %clangxx_asan -m64 -O1 %s %p/Helpers/initialization-blacklist-extra.cc\ +// RUN: -mllvm -asan-blacklist=%p/Helpers/initialization-blacklist.txt \ +// RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 +// RUN: %clangxx_asan -m64 -O2 %s %p/Helpers/initialization-blacklist-extra.cc\ +// RUN: -mllvm -asan-blacklist=%p/Helpers/initialization-blacklist.txt \ +// RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 +// RUN: %clangxx_asan -m32 -O0 %s %p/Helpers/initialization-blacklist-extra.cc\ +// RUN: -mllvm -asan-blacklist=%p/Helpers/initialization-blacklist.txt \ +// RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 +// RUN: %clangxx_asan -m32 -O1 %s %p/Helpers/initialization-blacklist-extra.cc\ +// RUN: -mllvm -asan-blacklist=%p/Helpers/initialization-blacklist.txt \ +// RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 +// RUN: %clangxx_asan -m32 -O2 %s %p/Helpers/initialization-blacklist-extra.cc\ +// RUN: -mllvm -asan-blacklist=%p/Helpers/initialization-blacklist.txt \ +// RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 + +// Function is defined in another TU. +int readBadGlobal(); +int x = readBadGlobal(); // init-order bug. + +// Function is defined in another TU. +int accessBadObject(); +int y = accessBadObject(); // init-order bug. + +int main(int argc, char **argv) { + return argc + x + y - 1; +}