[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,
|
void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp,
|
||||||
bool fast) {
|
bool fast) {
|
||||||
if (!fast)
|
if (!fast) {
|
||||||
|
// Block reports from our interceptors during _Unwind_Backtrace.
|
||||||
|
SymbolizerScope sym_scope;
|
||||||
return stack->SlowUnwindStack(pc, max_s);
|
return stack->SlowUnwindStack(pc, max_s);
|
||||||
|
}
|
||||||
|
|
||||||
uptr stack_top, stack_bottom;
|
uptr stack_top, stack_bottom;
|
||||||
GetCurrentStackBounds(&stack_top, &stack_bottom);
|
GetCurrentStackBounds(&stack_top, &stack_bottom);
|
||||||
|
|
|
@ -50,6 +50,11 @@ void EnterSymbolizer();
|
||||||
void ExitSymbolizer();
|
void ExitSymbolizer();
|
||||||
bool IsInSymbolizer();
|
bool IsInSymbolizer();
|
||||||
|
|
||||||
|
struct SymbolizerScope {
|
||||||
|
SymbolizerScope() { EnterSymbolizer(); }
|
||||||
|
~SymbolizerScope() { ExitSymbolizer(); }
|
||||||
|
};
|
||||||
|
|
||||||
void MsanDie();
|
void MsanDie();
|
||||||
void PrintWarning(uptr pc, uptr bp);
|
void PrintWarning(uptr pc, uptr bp);
|
||||||
void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin);
|
void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin);
|
||||||
|
|
|
@ -44,11 +44,6 @@ class Decorator: private __sanitizer::AnsiColorDecorator {
|
||||||
const char *End() { return Default(); }
|
const char *End() { return Default(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SymbolizerScope {
|
|
||||||
SymbolizerScope() { EnterSymbolizer(); }
|
|
||||||
~SymbolizerScope() { ExitSymbolizer(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
static void PrintStack(const uptr *trace, uptr size) {
|
static void PrintStack(const uptr *trace, uptr size) {
|
||||||
SymbolizerScope sym_scope;
|
SymbolizerScope sym_scope;
|
||||||
StackTrace::PrintStack(trace, size, true, flags()->strip_path_prefix, 0);
|
StackTrace::PrintStack(trace, size, true, flags()->strip_path_prefix, 0);
|
||||||
|
|
Loading…
Reference in New Issue