[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:
Reid Kleckner 2013-03-06 16:11:58 +00:00
parent c193da57b8
commit 063dfe3244
3 changed files with 9 additions and 6 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);