forked from OSchip/llvm-project
Revert "Start reifying error descriptions. Second try: Try to appease Visual Studio."
This reverts r279931. Will try it with the same Visual Studio version before committing again. llvm-svn: 279932
This commit is contained in:
parent
b477ce015d
commit
c0d14ecea3
|
@ -5,7 +5,6 @@ set(ASAN_SOURCES
|
||||||
asan_activation.cc
|
asan_activation.cc
|
||||||
asan_debugging.cc
|
asan_debugging.cc
|
||||||
asan_descriptions.cc
|
asan_descriptions.cc
|
||||||
asan_errors.cc
|
|
||||||
asan_fake_stack.cc
|
asan_fake_stack.cc
|
||||||
asan_flags.cc
|
asan_flags.cc
|
||||||
asan_globals.cc
|
asan_globals.cc
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
//===-- asan_errors.cc ------------------------------------------*- C++ -*-===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// This file is a part of AddressSanitizer, an address sanity checker.
|
|
||||||
//
|
|
||||||
// ASan implementation for error structures.
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#include "asan_errors.h"
|
|
||||||
#include "asan_stack.h"
|
|
||||||
|
|
||||||
namespace __asan {
|
|
||||||
|
|
||||||
void ErrorStackOverflow::Print() {
|
|
||||||
Decorator d;
|
|
||||||
Printf("%s", d.Warning());
|
|
||||||
Report(
|
|
||||||
"ERROR: AddressSanitizer: stack-overflow on address %p"
|
|
||||||
" (pc %p bp %p sp %p T%d)\n",
|
|
||||||
(void *)addr, (void *)pc, (void *)bp, (void *)sp, tid);
|
|
||||||
Printf("%s", d.EndWarning());
|
|
||||||
scariness.Print();
|
|
||||||
BufferedStackTrace stack;
|
|
||||||
GetStackTraceWithPcBpAndContext(&stack, kStackTraceMax, pc, bp, context,
|
|
||||||
common_flags()->fast_unwind_on_fatal);
|
|
||||||
stack.Print();
|
|
||||||
ReportErrorSummary("stack-overflow", &stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace __asan
|
|
|
@ -1,74 +0,0 @@
|
||||||
//===-- asan_errors.h -------------------------------------------*- C++ -*-===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// This file is a part of AddressSanitizer, an address sanity checker.
|
|
||||||
//
|
|
||||||
// ASan-private header for error structures.
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
#ifndef ASAN_ERRORS_H
|
|
||||||
#define ASAN_ERRORS_H
|
|
||||||
|
|
||||||
#include "asan_descriptions.h"
|
|
||||||
#include "asan_scariness_score.h"
|
|
||||||
|
|
||||||
namespace __asan {
|
|
||||||
|
|
||||||
struct ErrorBase {
|
|
||||||
ScarinessScore scariness;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ErrorStackOverflow : ErrorBase {
|
|
||||||
u32 tid;
|
|
||||||
uptr addr, pc, bp, sp;
|
|
||||||
// ErrorStackOverflow never owns the context.
|
|
||||||
void *context;
|
|
||||||
ErrorStackOverflow() = default;
|
|
||||||
ErrorStackOverflow(const SignalContext &sig, u32 tid_)
|
|
||||||
: tid(tid_),
|
|
||||||
addr(sig.addr),
|
|
||||||
pc(sig.pc),
|
|
||||||
bp(sig.bp),
|
|
||||||
sp(sig.sp),
|
|
||||||
context(sig.context) {
|
|
||||||
scariness.Scare(10, "stack-overflow");
|
|
||||||
}
|
|
||||||
void Print();
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ErrorKind {
|
|
||||||
kErrorKindInvalid = 0,
|
|
||||||
kErrorKindStackOverflow,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ErrorDescription {
|
|
||||||
ErrorKind kind;
|
|
||||||
union {
|
|
||||||
ErrorStackOverflow stack_overflow;
|
|
||||||
};
|
|
||||||
ErrorDescription() { internal_memset(this, 0, sizeof(*this)); }
|
|
||||||
ErrorDescription(const ErrorStackOverflow &e) // NOLINT
|
|
||||||
: kind(kErrorKindStackOverflow),
|
|
||||||
stack_overflow(e) {}
|
|
||||||
|
|
||||||
bool IsValid() { return kind != kErrorKindInvalid; }
|
|
||||||
void Print() {
|
|
||||||
switch (kind) {
|
|
||||||
case kErrorKindStackOverflow:
|
|
||||||
stack_overflow.Print();
|
|
||||||
return;
|
|
||||||
case kErrorKindInvalid:
|
|
||||||
CHECK(0);
|
|
||||||
}
|
|
||||||
CHECK(0);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace __asan
|
|
||||||
|
|
||||||
#endif // ASAN_ERRORS_H
|
|
|
@ -12,7 +12,6 @@
|
||||||
// This file contains error reporting code.
|
// This file contains error reporting code.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "asan_errors.h"
|
|
||||||
#include "asan_flags.h"
|
#include "asan_flags.h"
|
||||||
#include "asan_descriptions.h"
|
#include "asan_descriptions.h"
|
||||||
#include "asan_internal.h"
|
#include "asan_internal.h"
|
||||||
|
@ -268,8 +267,6 @@ class ScopedInErrorReport {
|
||||||
}
|
}
|
||||||
|
|
||||||
~ScopedInErrorReport() {
|
~ScopedInErrorReport() {
|
||||||
if (current_error_.IsValid()) current_error_.Print();
|
|
||||||
|
|
||||||
// Make sure the current thread is announced.
|
// Make sure the current thread is announced.
|
||||||
DescribeThread(GetCurrentThread());
|
DescribeThread(GetCurrentThread());
|
||||||
// We may want to grab this lock again when printing stats.
|
// We may want to grab this lock again when printing stats.
|
||||||
|
@ -304,12 +301,6 @@ class ScopedInErrorReport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReportError(const ErrorDescription &description) {
|
|
||||||
// Can only report one error per ScopedInErrorReport.
|
|
||||||
CHECK(current_error_.kind == kErrorKindInvalid);
|
|
||||||
current_error_ = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void StartReporting(ReportData *report) {
|
void StartReporting(ReportData *report) {
|
||||||
if (report) report_data = *report;
|
if (report) report_data = *report;
|
||||||
|
@ -328,20 +319,26 @@ class ScopedInErrorReport {
|
||||||
|
|
||||||
static StaticSpinMutex lock_;
|
static StaticSpinMutex lock_;
|
||||||
static u32 reporting_thread_tid_;
|
static u32 reporting_thread_tid_;
|
||||||
// Error currently being reported. This enables the destructor to interact
|
|
||||||
// with the debugger and point it to an error description.
|
|
||||||
static ErrorDescription current_error_;
|
|
||||||
bool halt_on_error_;
|
bool halt_on_error_;
|
||||||
};
|
};
|
||||||
|
|
||||||
StaticSpinMutex ScopedInErrorReport::lock_;
|
StaticSpinMutex ScopedInErrorReport::lock_;
|
||||||
u32 ScopedInErrorReport::reporting_thread_tid_ = kInvalidTid;
|
u32 ScopedInErrorReport::reporting_thread_tid_ = kInvalidTid;
|
||||||
ErrorDescription ScopedInErrorReport::current_error_;
|
|
||||||
|
|
||||||
void ReportStackOverflow(const SignalContext &sig) {
|
void ReportStackOverflow(const SignalContext &sig) {
|
||||||
ScopedInErrorReport in_report(/*report*/ nullptr, /*fatal*/ true);
|
ScopedInErrorReport in_report(/*report*/ nullptr, /*fatal*/ true);
|
||||||
ErrorStackOverflow error{sig, GetCurrentTidOrInvalid()};
|
Decorator d;
|
||||||
in_report.ReportError(error);
|
Printf("%s", d.Warning());
|
||||||
|
Report(
|
||||||
|
"ERROR: AddressSanitizer: stack-overflow on address %p"
|
||||||
|
" (pc %p bp %p sp %p T%d)\n",
|
||||||
|
(void *)sig.addr, (void *)sig.pc, (void *)sig.bp, (void *)sig.sp,
|
||||||
|
GetCurrentTidOrInvalid());
|
||||||
|
Printf("%s", d.EndWarning());
|
||||||
|
ScarinessScore::PrintSimple(10, "stack-overflow");
|
||||||
|
GET_STACK_TRACE_SIGNAL(sig);
|
||||||
|
stack.Print();
|
||||||
|
ReportErrorSummary("stack-overflow", &stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReportDeadlySignal(const char *description, const SignalContext &sig) {
|
void ReportDeadlySignal(const char *description, const SignalContext &sig) {
|
||||||
|
|
Loading…
Reference in New Issue