diff options
| author | Vitaly Buka <vitalybuka@google.com> | 2023-09-17 20:18:10 -0700 |
|---|---|---|
| committer | Vitaly Buka <vitalybuka@google.com> | 2023-09-18 17:14:44 -0700 |
| commit | 0fb6da8babd6d1b941ce0040e96df6d67a5bd681 (patch) | |
| tree | 5a8041d18ba413ed9acdaded7eee99e3556c31cb | |
| parent | cbd475040f8952cfc55b9e13dd5ce6c4f6434cd3 (diff) | |
| download | llvm-0fb6da8babd6d1b941ce0040e96df6d67a5bd681.zip llvm-0fb6da8babd6d1b941ce0040e96df6d67a5bd681.tar.gz llvm-0fb6da8babd6d1b941ce0040e96df6d67a5bd681.tar.bz2 | |
[NFC][hwasan] Create *Report classes (#66682)
This prepare the code for rework to collect all nececcecary data before
symbolization. Symbolization as any untrivial computations may affect
hwasan metadata.
| -rw-r--r-- | compiler-rt/lib/hwasan/hwasan_report.cpp | 80 |
1 files changed, 74 insertions, 6 deletions
diff --git a/compiler-rt/lib/hwasan/hwasan_report.cpp b/compiler-rt/lib/hwasan/hwasan_report.cpp index 45eff07..436eb37 100644 --- a/compiler-rt/lib/hwasan/hwasan_report.cpp +++ b/compiler-rt/lib/hwasan/hwasan_report.cpp @@ -569,9 +569,20 @@ uptr GetTopPc(StackTrace *stack) { : 0; } -void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) { - ScopedReport R(flags()->halt_on_error); +namespace { +class InvalidFreeReport { + public: + InvalidFreeReport(StackTrace *stack, uptr tagged_addr) + : stack(stack), tagged_addr(tagged_addr) {} + ~InvalidFreeReport(); + private: + StackTrace *stack; + uptr tagged_addr; +}; + +InvalidFreeReport::~InvalidFreeReport() { + ScopedReport R(flags()->halt_on_error); uptr untagged_addr = UntagAddr(tagged_addr); tag_t ptr_tag = GetTagFromPointer(tagged_addr); tag_t *tag_ptr = nullptr; @@ -610,9 +621,31 @@ void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) { MaybePrintAndroidHelpUrl(); ReportErrorSummary(bug_type, stack); } +} // namespace -void ReportTailOverwritten(StackTrace *stack, uptr tagged_addr, uptr orig_size, - const u8 *expected) { +void ReportInvalidFree(StackTrace *stack, uptr tagged_addr) { + InvalidFreeReport R(stack, tagged_addr); +} + +namespace { +class TailOverwrittenReport { + public: + explicit TailOverwrittenReport(StackTrace *stack, uptr tagged_addr, + uptr orig_size, const u8 *expected) + : stack(stack), + tagged_addr(tagged_addr), + orig_size(orig_size), + expected(expected) {} + ~TailOverwrittenReport(); + + private: + StackTrace *stack; + uptr tagged_addr; + uptr orig_size; + const u8 *expected; +}; + +TailOverwrittenReport::~TailOverwrittenReport() { uptr tail_size = kShadowAlignment - (orig_size % kShadowAlignment); u8 actual_expected[kShadowAlignment]; internal_memcpy(actual_expected, expected, tail_size); @@ -682,9 +715,37 @@ void ReportTailOverwritten(StackTrace *stack, uptr tagged_addr, uptr orig_size, MaybePrintAndroidHelpUrl(); ReportErrorSummary(bug_type, stack); } +} // namespace -void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, - bool is_store, bool fatal, uptr *registers_frame) { +void ReportTailOverwritten(StackTrace *stack, uptr tagged_addr, uptr orig_size, + const u8 *expected) { + TailOverwrittenReport R(stack, tagged_addr, orig_size, expected); +} + +namespace { +class TagMismatchReport { + public: + explicit TagMismatchReport(StackTrace *stack, uptr tagged_addr, + uptr access_size, bool is_store, bool fatal, + uptr *registers_frame) + : stack(stack), + tagged_addr(tagged_addr), + access_size(access_size), + is_store(is_store), + fatal(fatal), + registers_frame(registers_frame) {} + ~TagMismatchReport(); + + private: + StackTrace *stack; + uptr tagged_addr; + uptr access_size; + bool is_store; + bool fatal; + uptr *registers_frame; +}; + +TagMismatchReport::~TagMismatchReport() { ScopedReport R(fatal); SavedStackAllocations current_stack_allocations( GetCurrentThread()->stack_allocations()); @@ -753,6 +814,13 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, MaybePrintAndroidHelpUrl(); ReportErrorSummary(bug_type, stack); } +} // namespace + +void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, + bool is_store, bool fatal, uptr *registers_frame) { + TagMismatchReport R(stack, tagged_addr, access_size, is_store, fatal, + registers_frame); +} // See the frame breakdown defined in __hwasan_tag_mismatch (from // hwasan_tag_mismatch_{aarch64,riscv64}.S). |
