diff --git a/compiler-rt/lib/tysan/tysan.cpp b/compiler-rt/lib/tysan/tysan.cpp index 39d78e7c95e0cdb..9c87b4782671a00 100644 --- a/compiler-rt/lib/tysan/tysan.cpp +++ b/compiler-rt/lib/tysan/tysan.cpp @@ -197,10 +197,14 @@ static void reportError(void *Addr, int Size, tysan_type_descriptor *TD, Printf("\n"); if (pc) { + uptr top = 0; + uptr bottom = 0; + if (flags().print_stacktrace) + GetThreadStackTopAndBottom(false, &top, &bottom); bool request_fast = StackTrace::WillUseFastUnwind(true); BufferedStackTrace ST; - ST.Unwind(kStackTraceMax, pc, bp, 0, 0, 0, request_fast); + ST.Unwind(kStackTraceMax, pc, bp, 0, top, bottom, request_fast); ST.Print(); } else { Printf("\n"); diff --git a/compiler-rt/lib/tysan/tysan_flags.inc b/compiler-rt/lib/tysan/tysan_flags.inc index 98b6591f844ef06..be65c8e828794a6 100644 --- a/compiler-rt/lib/tysan/tysan_flags.inc +++ b/compiler-rt/lib/tysan/tysan_flags.inc @@ -15,3 +15,6 @@ // TYSAN_FLAG(Type, Name, DefaultValue, Description) // See COMMON_FLAG in sanitizer_flags.inc for more details. + +TYSAN_FLAG(bool, print_stacktrace, false, + "Include full stacktrace into an error report") diff --git a/compiler-rt/test/tysan/print_stacktrace.c b/compiler-rt/test/tysan/print_stacktrace.c new file mode 100644 index 000000000000000..3ffb6063377d9fb --- /dev/null +++ b/compiler-rt/test/tysan/print_stacktrace.c @@ -0,0 +1,22 @@ +// RUN: %clang_tysan -O0 %s -o %t && %run %t >%t.out 2>&1 +// RUN: FileCheck --check-prefixes=CHECK,CHECK-SHORT %s < %t.out + +// RUN: %env_tysan_opts=print_stacktrace=1 %run %t >%t.out 2>&1 +// RUN: FileCheck --check-prefixes=CHECK,CHECK-LONG %s < %t.out + +float *P; +void zero_array() { + int i; + for (i = 0; i < 1; ++i) + P[i] = 0.0f; + // CHECK: ERROR: TypeSanitizer: type-aliasing-violation + // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type p1 float + // CHECK: {{#0 0x.* in zero_array .*print_stacktrace.c:}}[[@LINE-3]] + // CHECK-SHORT-NOT: {{#1 0x.* in main .*print_stacktrace.c}} + // CHECK-LONG-NEXT: {{#1 0x.* in main .*print_stacktrace.c}} +} + +int main() { + P = (float *)&P; + zero_array(); +}