diff options
author | Kostya Serebryany <kcc@google.com> | 2018-10-24 01:35:50 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2018-10-24 01:35:50 +0000 |
commit | 195d80eda7da40d35e8cac68d2e1294a446a33f7 (patch) | |
tree | 171b8388e83e34e047eb2ef3bd39b481785f3ce2 | |
parent | b59176d8317c9083c1cdc8fa9818709824dc838e (diff) | |
download | compiler-rt-195d80eda7da40d35e8cac68d2e1294a446a33f7.tar.gz |
[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.cc | 18 | ||||
-rw-r--r-- | lib/hwasan/hwasan.h | 1 | ||||
-rw-r--r-- | lib/hwasan/hwasan_report.cc | 4 | ||||
-rw-r--r-- | test/hwasan/TestCases/stack-uar.c | 8 |
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 } |