diff options
author | Kuba Brecka <kuba.brecka@gmail.com> | 2016-06-27 15:32:18 +0000 |
---|---|---|
committer | Kuba Brecka <kuba.brecka@gmail.com> | 2016-06-27 15:32:18 +0000 |
commit | 7d98ad91a1ea76809de8ae3c5833af980902219e (patch) | |
tree | 4780da72ed056017a718e8e7e21cf710d8da5bd3 /lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc | |
parent | 28f8c79bb4ff22e3eb60df80b9b51cba3e6872a5 (diff) |
[sanitizer] Stop unwinding the stack when a close-to-zero PC is found
On OS X, we often get stack trace in a report that ends with a 0x0 frame. To get rid of it, let's trim the stack trace when we find a close-to-zero value, which is obviously not a valid PC.
Differential Revision: http://reviews.llvm.org/D14656
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@273886 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc b/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc index f38886acd..c9dfb8a0e 100644 --- a/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc @@ -108,6 +108,8 @@ _Unwind_Reason_Code Unwind_Trace(struct _Unwind_Context *ctx, void *param) { UnwindTraceArg *arg = (UnwindTraceArg*)param; CHECK_LT(arg->stack->size, arg->max_depth); uptr pc = Unwind_GetIP(ctx); + const uptr kPageSize = GetPageSizeCached(); + if (pc < kPageSize) return UNWIND_STOP; arg->stack->trace_buffer[arg->stack->size++] = pc; if (arg->stack->size == arg->max_depth) return UNWIND_STOP; return UNWIND_CONTINUE; |