diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-09-07 09:24:29 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-09-07 09:24:29 +0000 |
commit | d79635960420cc24f2533a12ee221f51d8a98a81 (patch) | |
tree | 36be82e8de596c2aff90620d7dfa7e30fd9f7e00 | |
parent | ef698124b4d1875bb793a4f1d885a3d2f1f538e1 (diff) | |
download | compiler-rt-d79635960420cc24f2533a12ee221f51d8a98a81.tar.gz |
[ASan] hack initialization-bug test so that it stably passes on both Linux and Mac: make the bug appear independent of the translation unit order
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@163381 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/asan/lit_tests/Helpers/initialization-bug-extra2.cc | 6 | ||||
-rw-r--r-- | lib/asan/lit_tests/initialization-bug.cc | 29 |
2 files changed, 27 insertions, 8 deletions
diff --git a/lib/asan/lit_tests/Helpers/initialization-bug-extra2.cc b/lib/asan/lit_tests/Helpers/initialization-bug-extra2.cc new file mode 100644 index 000000000..a3d8f190e --- /dev/null +++ b/lib/asan/lit_tests/Helpers/initialization-bug-extra2.cc @@ -0,0 +1,6 @@ +// 'z' is dynamically initialized global from different TU. +extern int z; +int __attribute__((noinline)) initY() { + return z + 1; +} +int y = initY(); diff --git a/lib/asan/lit_tests/initialization-bug.cc b/lib/asan/lit_tests/initialization-bug.cc index 872b8bff8..5a9748c5c 100644 --- a/lib/asan/lit_tests/initialization-bug.cc +++ b/lib/asan/lit_tests/initialization-bug.cc @@ -1,33 +1,46 @@ // Test to make sure basic initialization order errors are caught. -// RUN: %clangxx_asan -m64 -O0 %s %p/Helpers/initialization-bug-extra.cc\ +// RUN: %clangxx_asan -m64 -O0 %s %p/Helpers/initialization-bug-extra2.cc\ // RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 \ // RUN: | %symbolize | FileCheck %s -// RUN: %clangxx_asan -m32 -O0 %s %p/Helpers/initialization-bug-extra.cc\ +// RUN: %clangxx_asan -m32 -O0 %s %p/Helpers/initialization-bug-extra2.cc\ // RUN: -mllvm -asan-initialization-order -o %t && %t 2>&1 \ // RUN: | %symbolize | FileCheck %s // Do not test with optimization -- the error may be optimized away. -extern int y; +#include <cstdio> + +// The structure of the test is: +// "x", "y", "z" are dynamically initialized globals. +// Value of "x" depends on "y", value of "y" depends on "z". +// "x" and "z" are defined in this TU, "y" is defined in another one. +// Thus we shoud stably report initialization order fiasco independently of +// the translation unit order. + +int initZ() { + return 5; +} +int z = initZ(); // 'y' is a dynamically initialized global residing in a different TU. This // dynamic initializer will read the value of 'y' before main starts. The // result is undefined behavior, which should be caught by initialization order // checking. +extern int y; int __attribute__((noinline)) initX() { return y + 1; // CHECK: {{AddressSanitizer initialization-order-fiasco}} // CHECK: {{READ of size .* at 0x.* thread T0}} - // CHECK: {{#0 0x.* in .*initX.* .*initialization-bug.cc:19}} - // CHECK: {{0x.* is located 0 bytes inside of global variable .*y.*}} + // CHECK: {{0x.* is located 0 bytes inside of global variable .*(y|z).*}} } - // This initializer begins our initialization order problems. static int x = initX(); -// ASan should have caused an exit before main runs. int main() { - return -1; + // ASan should have caused an exit before main runs. + printf("PASS\n"); + // CHECK-NOT: PASS + return 0; } |