diff options
author | Vitaly Buka <vitalybuka@google.com> | 2017-09-13 18:30:16 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2017-09-13 18:30:16 +0000 |
commit | a8682fdf74d3cb93769b7394f2cdffc5cefb8bd8 (patch) | |
tree | 7a19f3b14ada21a794a30f8ebbc3cba70971133b /lib/asan | |
parent | 2eaff6eec07f4e8ac7698bde99cd91ef01b7a0b1 (diff) |
[compiler-rt] Use SignalContext in ErrorStackOverflow and ErrorDeadlySignal
Summary: Part of https://github.com/google/sanitizers/issues/637
Reviewers: eugenis, alekseyshl, filcab
Subscribers: kubamracek, llvm-commits, dberris
Differential Revision: https://reviews.llvm.org/D37793
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@313168 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/asan')
-rw-r--r-- | lib/asan/asan_errors.cc | 33 | ||||
-rw-r--r-- | lib/asan/asan_errors.h | 38 |
2 files changed, 28 insertions, 43 deletions
diff --git a/lib/asan/asan_errors.cc b/lib/asan/asan_errors.cc index c9cf8f70b..7625dc9b8 100644 --- a/lib/asan/asan_errors.cc +++ b/lib/asan/asan_errors.cc @@ -27,12 +27,14 @@ void ErrorStackOverflow::Print() { Printf("%s", d.Warning()); Report( "ERROR: AddressSanitizer: %s on address %p" - " (pc %p bp %p sp %p T%d)\n", scariness.GetDescription(), - (void *)addr, (void *)pc, (void *)bp, (void *)sp, tid); + " (pc %p bp %p sp %p T%d)\n", + scariness.GetDescription(), (void *)signal.addr, (void *)signal.pc, + (void *)signal.bp, (void *)signal.sp, tid); Printf("%s", d.Default()); scariness.Print(); BufferedStackTrace stack; - GetStackTraceWithPcBpAndContext(&stack, kStackTraceMax, pc, bp, context, + GetStackTraceWithPcBpAndContext(&stack, kStackTraceMax, signal.pc, signal.bp, + signal.context, common_flags()->fast_unwind_on_fatal); stack.Print(); ReportErrorSummary(scariness.GetDescription(), &stack); @@ -41,30 +43,33 @@ void ErrorStackOverflow::Print() { void ErrorDeadlySignal::Print() { Decorator d; Printf("%s", d.Warning()); - const char *description = __sanitizer::DescribeSignalOrException(signo); + const char *description = signal.Describe(); Report( "ERROR: AddressSanitizer: %s on unknown address %p (pc %p bp %p sp %p " "T%d)\n", - description, (void *)addr, (void *)pc, (void *)bp, (void *)sp, tid); + description, (void *)signal.addr, (void *)signal.pc, (void *)signal.bp, + (void *)signal.sp, tid); Printf("%s", d.Default()); - if (pc < GetPageSizeCached()) Report("Hint: pc points to the zero page.\n"); - if (is_memory_access) { + if (signal.pc < GetPageSizeCached()) + Report("Hint: pc points to the zero page.\n"); + if (signal.is_memory_access) { const char *access_type = - write_flag == SignalContext::WRITE + signal.write_flag == SignalContext::WRITE ? "WRITE" - : (write_flag == SignalContext::READ ? "READ" : "UNKNOWN"); + : (signal.write_flag == SignalContext::READ ? "READ" : "UNKNOWN"); Report("The signal is caused by a %s memory access.\n", access_type); - if (addr < GetPageSizeCached()) + if (signal.addr < GetPageSizeCached()) Report("Hint: address points to the zero page.\n"); } - MaybeReportNonExecRegion(pc); + MaybeReportNonExecRegion(signal.pc); scariness.Print(); BufferedStackTrace stack; - GetStackTraceWithPcBpAndContext(&stack, kStackTraceMax, pc, bp, context, + GetStackTraceWithPcBpAndContext(&stack, kStackTraceMax, signal.pc, signal.bp, + signal.context, common_flags()->fast_unwind_on_fatal); stack.Print(); - MaybeDumpInstructionBytes(pc); - MaybeDumpRegisters(context); + MaybeDumpInstructionBytes(signal.pc); + MaybeDumpRegisters(signal.context); Printf("AddressSanitizer can not provide additional info.\n"); ReportErrorSummary(description, &stack); } diff --git a/lib/asan/asan_errors.h b/lib/asan/asan_errors.h index 55b8360a3..b9944739b 100644 --- a/lib/asan/asan_errors.h +++ b/lib/asan/asan_errors.h @@ -28,19 +28,12 @@ struct ErrorBase { }; struct ErrorStackOverflow : ErrorBase { - uptr addr, pc, bp, sp; - // ErrorStackOverflow never owns the context. - void *context; + SignalContext signal; // VS2013 doesn't implement unrestricted unions, so we need a trivial default // constructor ErrorStackOverflow() = default; ErrorStackOverflow(u32 tid, const SignalContext &sig) - : ErrorBase(tid), - addr(sig.addr), - pc(sig.pc), - bp(sig.bp), - sp(sig.sp), - context(sig.context) { + : ErrorBase(tid), signal(sig) { scariness.Clear(); scariness.Scare(10, "stack-overflow"); } @@ -48,34 +41,21 @@ struct ErrorStackOverflow : ErrorBase { }; struct ErrorDeadlySignal : ErrorBase { - uptr addr, pc, bp, sp; - // ErrorDeadlySignal never owns the context. - void *context; - int signo; - SignalContext::WriteFlag write_flag; - bool is_memory_access; + SignalContext signal; // VS2013 doesn't implement unrestricted unions, so we need a trivial default // constructor ErrorDeadlySignal() = default; ErrorDeadlySignal(u32 tid, const SignalContext &sig) - : ErrorBase(tid), - addr(sig.addr), - pc(sig.pc), - bp(sig.bp), - sp(sig.sp), - context(sig.context), - signo(sig.GetType()), - write_flag(sig.write_flag), - is_memory_access(sig.is_memory_access) { + : ErrorBase(tid), signal(sig) { scariness.Clear(); - if (is_memory_access) { - if (addr < GetPageSizeCached()) { + if (signal.is_memory_access) { + if (signal.addr < GetPageSizeCached()) { scariness.Scare(10, "null-deref"); - } else if (addr == pc) { + } else if (signal.addr == signal.pc) { scariness.Scare(60, "wild-jump"); - } else if (write_flag == SignalContext::WRITE) { + } else if (signal.write_flag == SignalContext::WRITE) { scariness.Scare(30, "wild-addr-write"); - } else if (write_flag == SignalContext::READ) { + } else if (signal.write_flag == SignalContext::READ) { scariness.Scare(20, "wild-addr-read"); } else { scariness.Scare(25, "wild-addr"); |