[hwasan] when printing a stack-related bugs, also print stack frame descriptions...
authorKostya Serebryany <kcc@google.com>
Wed, 24 Oct 2018 01:35:50 +0000 (01:35 +0000)
committerKostya Serebryany <kcc@google.com>
Wed, 24 Oct 2018 01:35:50 +0000 (01:35 +0000)
llvm-svn: 345110

compiler-rt/lib/hwasan/hwasan.cc
compiler-rt/lib/hwasan/hwasan.h
compiler-rt/lib/hwasan/hwasan_report.cc
compiler-rt/test/hwasan/TestCases/stack-uar.c

index 518cd11..7febaf7 100644 (file)
@@ -225,15 +225,29 @@ struct FrameDescription {
   const char *Descr;
 };
 
+struct FrameDescriptionArray {
+  FrameDescription *beg, *end;
+};
+
+static InternalMmapVectorNoCtor<FrameDescriptionArray> AllFrames;
+
 void InitFrameDescriptors(uptr b, uptr e) {
   FrameDescription *beg = reinterpret_cast<FrameDescription *>(b);
   FrameDescription *end = reinterpret_cast<FrameDescription *>(e);
   // Must have at least one entry, which we can use for a linked list.
   CHECK_GE(end - beg, 1U);
-  if (Verbosity()) {
+  AllFrames.push_back({beg, end});
+  if (Verbosity())
     for (FrameDescription *frame_descr = beg; frame_descr < end; frame_descr++)
       Printf("Frame: %p %s\n", frame_descr->PC, frame_descr->Descr);
-  }
+}
+
+const char *GetStackFrameDescr(uptr pc) {
+  for (uptr i = 0, n = AllFrames.size(); i < n; i++)
+    for (auto p = AllFrames[i].beg; p < AllFrames[i].end; p++)
+      if (p->PC == pc)
+        return p->Descr;
+  return nullptr;
 }
 
 } // namespace __hwasan
index a3da09e..2fbc87c 100644 (file)
@@ -93,6 +93,7 @@ void InstallTrapHandler();
 void InstallAtExitHandler();
 
 const char *GetStackOriginDescr(u32 id, uptr *pc);
+const char *GetStackFrameDescr(uptr pc);
 
 void EnterSymbolizer();
 void ExitSymbolizer();
index e70a980..57bd827 100644 (file)
@@ -204,11 +204,13 @@ void PrintAddressDescription(
         uptr pc_mask = (1ULL << 48) - 1;
         uptr pc = record & pc_mask;
         if (SymbolizedStack *frame = Symbolizer::GetOrInit()->SymbolizePC(pc)) {
-          frame_desc.append("  sp: 0x%zx pc: %p ", sp, pc);
+          frame_desc.append(" sp: 0x%zx pc: %p ", sp, pc);
           RenderFrame(&frame_desc, "in %f %s:%l\n", 0, frame->info,
                       common_flags()->symbolize_vs_style,
                       common_flags()->strip_path_prefix);
           frame->ClearAll();
+          if (auto Descr = GetStackFrameDescr(pc))
+            frame_desc.append("  %s\n", Descr);
         }
         Printf("%s", frame_desc.data());
         frame_desc.clear();
index 8af56a9..c62627c 100644 (file)
@@ -9,8 +9,8 @@ void USE(void *x) { // pretend_to_do_something(void *x)
 
 __attribute__((noinline))
 char *buggy() {
-  char z[0x1000];
-  char *volatile p = z;
+  char zzz[0x1000];
+  char *volatile p = zzz;
   return p;
 }
 
@@ -29,9 +29,13 @@ int main() {
   // CHECK: is located in stack of thread
   // CHECK: Previosly allocated frames:
   // CHECK: Unrelated3
+  // CHECK: 16 CCC
   // CHECK: Unrelated2
+  // CHECK: 12 BB
   // CHECK: Unrelated1
+  // CHECK: 8 A
   // CHECK: buggy
+  // CHECK: 4096 zzz
 
   // CHECK: SUMMARY: HWAddressSanitizer: tag-mismatch {{.*}} in main
 }