aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2018-10-24 01:35:50 +0000
committerKostya Serebryany <kcc@google.com>2018-10-24 01:35:50 +0000
commit195d80eda7da40d35e8cac68d2e1294a446a33f7 (patch)
tree171b8388e83e34e047eb2ef3bd39b481785f3ce2
parentb59176d8317c9083c1cdc8fa9818709824dc838e (diff)
[hwasan] when printing a stack-related bugs, also print stack frame descriptions provided by the compiler
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@345110 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/hwasan/hwasan.cc18
-rw-r--r--lib/hwasan/hwasan.h1
-rw-r--r--lib/hwasan/hwasan_report.cc4
-rw-r--r--test/hwasan/TestCases/stack-uar.c8
4 files changed, 26 insertions, 5 deletions
diff --git a/lib/hwasan/hwasan.cc b/lib/hwasan/hwasan.cc
index 518cd11ff..7febaf760 100644
--- a/lib/hwasan/hwasan.cc
+++ b/lib/hwasan/hwasan.cc
@@ -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
diff --git a/lib/hwasan/hwasan.h b/lib/hwasan/hwasan.h
index a3da09e88..2fbc87cfe 100644
--- a/lib/hwasan/hwasan.h
+++ b/lib/hwasan/hwasan.h
@@ -93,6 +93,7 @@ void InstallTrapHandler();
void InstallAtExitHandler();
const char *GetStackOriginDescr(u32 id, uptr *pc);
+const char *GetStackFrameDescr(uptr pc);
void EnterSymbolizer();
void ExitSymbolizer();
diff --git a/lib/hwasan/hwasan_report.cc b/lib/hwasan/hwasan_report.cc
index e70a9807a..57bd8278e 100644
--- a/lib/hwasan/hwasan_report.cc
+++ b/lib/hwasan/hwasan_report.cc
@@ -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();
diff --git a/test/hwasan/TestCases/stack-uar.c b/test/hwasan/TestCases/stack-uar.c
index 8af56a971..c62627c5d 100644
--- a/test/hwasan/TestCases/stack-uar.c
+++ b/test/hwasan/TestCases/stack-uar.c
@@ -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
}