aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2023-09-17 20:18:10 -0700
committerVitaly Buka <vitalybuka@google.com>2023-09-18 17:14:44 -0700
commit0fb6da8babd6d1b941ce0040e96df6d67a5bd681 (patch)
tree5a8041d18ba413ed9acdaded7eee99e3556c31cb
parentcbd475040f8952cfc55b9e13dd5ce6c4f6434cd3 (diff)
downloadllvm-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.cpp80
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).