Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: This commit sets up the infrastructure to use reified error descriptions, and moves ReportStackOverflow to the new system. After we convert all the errors, we'll be able to simplify ScopedInErrorReport and remove the older debugging mechanism which had some errors partly reified in some way. We'll be able to maintain the external API. ScopedInErrorReport will be able to track one of the reified errors at a time. The purpose of this is so we have its destructor actually print the error and possibly interface with the debugger (will depend on the platform, of course). Reviewers: kcc, samsonov, timurrrr Subscribers: kubabrecka, llvm-commits Differential Revision: https://reviews.llvm.org/D23672 llvm-svn: 279862
- Loading branch information
Showing
4 changed files
with
130 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
//===-- 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
//===-- 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(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; | ||
// We're using a tagged union because it allows us to have a trivially | ||
// copiable type and use the same structures as the public interface. | ||
// | ||
// We can add a wrapper around it to make it "more c++-like", but that would | ||
// add a lot of code and the benefit wouldn't be that big. | ||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters