summaryrefslogtreecommitdiff
path: root/lib/asan
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2017-09-13 18:30:16 +0000
committerVitaly Buka <vitalybuka@google.com>2017-09-13 18:30:16 +0000
commita8682fdf74d3cb93769b7394f2cdffc5cefb8bd8 (patch)
tree7a19f3b14ada21a794a30f8ebbc3cba70971133b /lib/asan
parent2eaff6eec07f4e8ac7698bde99cd91ef01b7a0b1 (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.cc33
-rw-r--r--lib/asan/asan_errors.h38
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");