diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-11-13 14:46:58 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-11-13 14:46:58 +0000 |
commit | 1b17f5b79d58c5aff291dde05727ad0b215b81c6 (patch) | |
tree | 5ce639a22a08ff9a1b585e1397c01e106ae2d9e9 /lib/sanitizer_common | |
parent | 348aac42b606dd2d4cec9d68a85bf0144bd7c2f3 (diff) | |
download | compiler-rt-1b17f5b79d58c5aff291dde05727ad0b215b81c6.tar.gz |
[ASan] Do not rely on malloc context in allocator reports.
Invoke a fatal stack trace unwinder when ASan prints allocator-relevant
error reports (double-free, alloc-dealloc-mismatch, invalid-free).
Thus we'll be able to print complete stack trace even if allocation/free
stacks are not stored (malloc_context_size=0).
Based on the patch by Yuri Gribov!
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@194579 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common')
-rw-r--r-- | lib/sanitizer_common/sanitizer_stacktrace.h | 2 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc | 2 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc | 1 |
3 files changed, 5 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_stacktrace.h b/lib/sanitizer_common/sanitizer_stacktrace.h index 408063c18..88f0a03b1 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace.h +++ b/lib/sanitizer_common/sanitizer_stacktrace.h @@ -33,6 +33,7 @@ static const uptr kStackTraceMax = 256; struct StackTrace { typedef bool (*SymbolizeCallback)(const void *pc, char *out_buffer, int out_size); + uptr top_frame_bp; uptr size; uptr trace[kStackTraceMax]; @@ -41,6 +42,7 @@ struct StackTrace { SymbolizeCallback symbolize_callback = 0); void CopyFrom(const uptr *src, uptr src_size) { + top_frame_bp = 0; size = src_size; if (size > kStackTraceMax) size = kStackTraceMax; for (uptr i = 0; i < size; i++) diff --git a/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc b/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc index a8e70c965..58fa18251 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc @@ -21,6 +21,8 @@ void StackTrace::Unwind(uptr max_depth, uptr pc, uptr bp, uptr stack_top, SlowUnwindStack(pc, max_depth); else FastUnwindStack(pc, bp, stack_top, stack_bottom, max_depth); + + top_frame_bp = size ? bp : 0; } } // namespace __sanitizer diff --git a/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc b/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc index 5e6d3fdbd..2b842cd81 100644 --- a/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cc @@ -99,6 +99,7 @@ TEST_F(FastUnwindTest, OneFrameStackTrace) { return; EXPECT_EQ(1U, trace.size); EXPECT_EQ(start_pc, trace.trace[0]); + EXPECT_EQ((uptr)&fake_stack[0], trace.top_frame_bp); } } // namespace __sanitizer |