[msan] Block reports from interceptors during _Unwind_Backtrace
Summary: I'm hitting a big recursive report from: uninit on strlen -> __msan::PrintWarningWithOrigin() -> __msan::GetStackTrace() -> __sanitizer::StackTrace::SlowUnwindStack() -> _Unwind_Backtrace() -> ... libgcc calls -> uninit on strlen() -> ... repeats Reviewers: eugenis Differential Revision: http://llvm-reviews.chandlerc.com/D497 llvm-svn: 176555
This commit is contained in:
parent
c193da57b8
commit
063dfe3244
|
@ -153,8 +153,11 @@ static void GetCurrentStackBounds(uptr *stack_top, uptr *stack_bottom) {
|
|||
|
||||
void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp,
|
||||
bool fast) {
|
||||
if (!fast)
|
||||
if (!fast) {
|
||||
// Block reports from our interceptors during _Unwind_Backtrace.
|
||||
SymbolizerScope sym_scope;
|
||||
return stack->SlowUnwindStack(pc, max_s);
|
||||
}
|
||||
|
||||
uptr stack_top, stack_bottom;
|
||||
GetCurrentStackBounds(&stack_top, &stack_bottom);
|
||||
|
|
|
@ -50,6 +50,11 @@ void EnterSymbolizer();
|
|||
void ExitSymbolizer();
|
||||
bool IsInSymbolizer();
|
||||
|
||||
struct SymbolizerScope {
|
||||
SymbolizerScope() { EnterSymbolizer(); }
|
||||
~SymbolizerScope() { ExitSymbolizer(); }
|
||||
};
|
||||
|
||||
void MsanDie();
|
||||
void PrintWarning(uptr pc, uptr bp);
|
||||
void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin);
|
||||
|
|
|
@ -44,11 +44,6 @@ class Decorator: private __sanitizer::AnsiColorDecorator {
|
|||
const char *End() { return Default(); }
|
||||
};
|
||||
|
||||
struct SymbolizerScope {
|
||||
SymbolizerScope() { EnterSymbolizer(); }
|
||||
~SymbolizerScope() { ExitSymbolizer(); }
|
||||
};
|
||||
|
||||
static void PrintStack(const uptr *trace, uptr size) {
|
||||
SymbolizerScope sym_scope;
|
||||
StackTrace::PrintStack(trace, size, true, flags()->strip_path_prefix, 0);
|
||||
|
|
Loading…
Reference in New Issue