[msan] don't check shadow inside interceptors if we are inside symbolizer; add weak...
authorKostya Serebryany <kcc@google.com>
Wed, 13 Feb 2013 07:19:47 +0000 (07:19 +0000)
committerKostya Serebryany <kcc@google.com>
Wed, 13 Feb 2013 07:19:47 +0000 (07:19 +0000)
llvm-svn: 175040

compiler-rt/lib/msan/msan.cc
compiler-rt/lib/msan/msan.h
compiler-rt/lib/msan/msan_interceptors.cc
compiler-rt/lib/msan/msan_interface_internal.h
compiler-rt/lib/msan/msan_report.cc

index 27ff269..8a01da3 100644 (file)
@@ -58,6 +58,8 @@ static THREADLOCAL struct {
   uptr stack_top, stack_bottom;
 } __msan_stack_bounds;
 
+static THREADLOCAL bool is_in_symbolizer;
+
 extern "C" const int __msan_track_origins;
 int __msan_get_track_origins() {
   return __msan_track_origins;
@@ -81,6 +83,10 @@ static bool IsRunningUnderDr() {
   return result;
 }
 
+void EnterSymbolizer() { is_in_symbolizer = true; }
+void ExitSymbolizer()  { is_in_symbolizer = false; }
+bool IsInSymbolizer() { return is_in_symbolizer; }
+
 static Flags msan_flags;
 
 Flags *flags() {
@@ -126,6 +132,9 @@ static void InitializeFlags(Flags *f, const char *options) {
   f->verbosity = 0;
   f->strip_path_prefix = "";
 
+  // Override from user-specified string.
+  if (__msan_default_options)
+    ParseFlagsFromString(f, __msan_default_options());
   ParseFlagsFromString(f, options);
 }
 
@@ -417,3 +426,11 @@ u32 __msan_get_origin(void *a) {
 u32 __msan_get_umr_origin() {
   return __msan_origin_tls;
 }
+
+#if !SANITIZER_SUPPORTS_WEAK_HOOKS
+extern "C" {
+SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
+const char* __msan_default_options() { return ""; }
+}  // extern "C"
+#endif
+
index eafe702..d612bfb 100644 (file)
@@ -46,6 +46,10 @@ void InstallTrapHandler();
 void InstallAtExitHandler();
 void ReplaceOperatorsNewAndDelete();
 
+void EnterSymbolizer();
+void ExitSymbolizer();
+bool IsInSymbolizer();
+
 void MsanDie();
 void PrintWarning(uptr pc, uptr bp);
 void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin);
index 7c8e1c2..7521d0e 100644 (file)
@@ -41,6 +41,7 @@ using namespace __msan;
 #define CHECK_UNPOISONED(x, n) \
   do { \
     sptr offset = __msan_test_shadow(x, n);                 \
+    if (__msan::IsInSymbolizer()) break;                    \
     if (offset >= 0 && flags()->report_umrs) {              \
       GET_CALLER_PC_BP_SP;                                  \
       (void)sp;                                             \
index b7328ea..905c5b7 100644 (file)
@@ -85,6 +85,9 @@ void __msan_set_exit_code(int exit_code);
 SANITIZER_INTERFACE_ATTRIBUTE
 int __msan_set_poison_in_malloc(int do_poison);
 
+SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
+/* OPTIONAL */ const char* __msan_default_options();
+
 // For testing.
 SANITIZER_INTERFACE_ATTRIBUTE
 void __msan_set_expect_umr(int expect_umr);
index d4a6d30..16b13f6 100644 (file)
@@ -44,6 +44,16 @@ 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);
+}
+
 static void DescribeOrigin(u32 origin) {
   Decorator d;
   if (flags()->verbosity)
@@ -64,7 +74,7 @@ static void DescribeOrigin(u32 origin) {
     const uptr *trace = StackDepotGet(origin, &size);
     Printf("  %sUninitialized value was created by a heap allocation%s\n",
            d.Origin(), d.End());
-    StackTrace::PrintStack(trace, size, true, flags()->strip_path_prefix, 0);
+    PrintStack(trace, size);
   }
 }
 
@@ -72,7 +82,10 @@ static void ReportSummary(const char *error_type, StackTrace *stack) {
   if (!stack->size || !IsSymbolizerAvailable()) return;
   AddressInfo ai;
   uptr pc = StackTrace::GetPreviousInstructionPc(stack->trace[0]);
-  SymbolizeCode(pc, &ai, 1);
+  {
+    SymbolizerScope sym_scope;
+    SymbolizeCode(pc, &ai, 1);
+  }
   ReportErrorSummary(error_type,
                      StripPathPrefix(ai.file, flags()->strip_path_prefix),
                      ai.line, ai.function);
@@ -87,8 +100,7 @@ void ReportUMR(StackTrace *stack, u32 origin) {
   Printf("%s", d.Warning());
   Report(" WARNING: Use of uninitialized value\n");
   Printf("%s", d.End());
-  StackTrace::PrintStack(stack->trace, stack->size, true,
-                         flags()->strip_path_prefix, 0);
+  PrintStack(stack->trace, stack->size);
   if (origin) {
     DescribeOrigin(origin);
   }
@@ -99,8 +111,7 @@ void ReportExpectedUMRNotFound(StackTrace *stack) {
   GenericScopedLock<StaticSpinMutex> lock(&report_mu);
 
   Printf(" WARNING: Expected use of uninitialized value not found\n");
-  StackTrace::PrintStack(stack->trace, stack->size, true,
-                         flags()->strip_path_prefix, 0);
+  PrintStack(stack->trace, stack->size);
 }
 
 void ReportAtExitStatistics() {