Summary: This commit adds symbolize_vs_style=false to every instance of ASAN_OPTIONS in the asan tests and sets ASAN_OPTIONS=symbolize_vs_style=false in lit, for tests which don't set it. This way we don't need to make the tests be able to deal with both symbolize styles. This is the first patch in the series. I will eventually submit for the other sanitizers too. We need this change (or another way to deal with the different outputs) in order to be able to default to symbolize_vs_style=true on some platforms. Adding to this change, I'm also adding "env " before any command line which sets environment variables. That way the test works on other host shells, like we have if the host is running Windows. Reviewers: samsonov, kcc, rnk Subscribers: tberghammer, llvm-commits Differential Revision: http://reviews.llvm.org/D10294 llvm-svn: 239754
48 lines
1.6 KiB
C++
48 lines
1.6 KiB
C++
// Test to make sure basic initialization order errors are caught.
|
|
|
|
// RUN: %clangxx_asan -O0 %s %p/Helpers/initialization-bug-extra2.cc -o %t-INIT-ORDER-EXE
|
|
// RUN: env ASAN_OPTIONS=$ASAN_OPTIONS:check_initialization_order=true not %run %t-INIT-ORDER-EXE 2>&1 | FileCheck %s
|
|
|
|
// Do not test with optimization -- the error may be optimized away.
|
|
|
|
// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=186
|
|
// XFAIL: darwin
|
|
|
|
#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: {{0x.* is located 0 bytes inside of global variable .*(y|z).*}}
|
|
// CHECK: registered at:
|
|
// CHECK: 0x{{.*}} in __asan_register_globals
|
|
}
|
|
|
|
// This initializer begins our initialization order problems.
|
|
static int x = initX();
|
|
|
|
int main() {
|
|
// ASan should have caused an exit before main runs.
|
|
printf("PASS\n");
|
|
// CHECK-NOT: PASS
|
|
return 0;
|
|
}
|