From f9d1aa45d0067735c9db25d173dce807f6a13f2b Mon Sep 17 00:00:00 2001 From: MrLop Date: Mon, 10 Feb 2025 11:25:15 +0800 Subject: [PATCH] [Compier-RT][HWASAN] Fix Print Wrong SP Address When printing memory near sp, the address should be (frame + 256) rather than frame[31] Signed-off-by: MrLop --- compiler-rt/lib/hwasan/hwasan_report.cpp | 25 +++++++++++++----------- compiler-rt/lib/hwasan/hwasan_report.h | 5 +++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/compiler-rt/lib/hwasan/hwasan_report.cpp b/compiler-rt/lib/hwasan/hwasan_report.cpp index 051c68ee2e84..1d2d019ee545 100644 --- a/compiler-rt/lib/hwasan/hwasan_report.cpp +++ b/compiler-rt/lib/hwasan/hwasan_report.cpp @@ -785,7 +785,9 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, if (registers_frame) { ReportRegisters(registers_frame, pc); - ReportMemoryNearRegisters(registers_frame, pc); // OHOS_LOCAL + ReportMemoryNearRegisters(registers_frame, + reinterpret_cast(registers_frame) + 256, + pc); // OHOS_LOCAL } ReportErrorSummary(bug_type, stack); @@ -793,19 +795,18 @@ void ReportTagMismatch(StackTrace *stack, uptr tagged_addr, uptr access_size, // OHOS_LOCAL begin void PrintMemoryAroundAddress(MemoryMappingLayout &proc_maps, int reg_num, - uptr addr, uptr len, bool is_pc) { + uptr addr, uptr len, bool is_sp, bool is_pc) { const sptr kBufSize = 4095; char *filename = (char *)MmapOrDie(kBufSize, __func__); MemoryMappedSegment segment(filename, kBufSize); while (proc_maps.Next(&segment)) { if (segment.start <= addr && addr < segment.end && segment.IsReadable()) { - if (!is_pc) { - if (reg_num < 31) - Printf("x%d(%s):\n", reg_num, segment.filename); - else - Printf("sp(%s):\n", segment.filename); - } else { + if (is_sp) { + Printf("sp(%s):\n", segment.filename); + } else if (is_pc) { Printf("pc(%s):\n", segment.filename); + } else { + Printf("x%d(%s):\n", reg_num, segment.filename); } uptr beg = RoundDownTo(addr - (addr < len ? addr : len), 8); if (segment.start > beg) @@ -822,18 +823,20 @@ void PrintMemoryAroundAddress(MemoryMappingLayout &proc_maps, int reg_num, break; } } + proc_maps.Reset(); } -void ReportMemoryNearRegisters(uptr *frame, uptr pc) { +void ReportMemoryNearRegisters(uptr *frame, uptr sp, uptr pc) { Printf("Memory near registers:\n"); MemoryMappingLayout proc_maps(/*cache_enabled*/ true); for (int i = 0; i <= 31; ++i) { PrintMemoryAroundAddress(proc_maps, i, UntagAddr(frame[i]), flags()->memory_around_register_size); - proc_maps.Reset(); } - PrintMemoryAroundAddress(proc_maps, -1, pc, + PrintMemoryAroundAddress(proc_maps, -1, sp, flags()->memory_around_register_size, true); + PrintMemoryAroundAddress(proc_maps, -1, pc, + flags()->memory_around_register_size, false, true); } // OHOS_LOCAL end diff --git a/compiler-rt/lib/hwasan/hwasan_report.h b/compiler-rt/lib/hwasan/hwasan_report.h index 9ba8a1f6658b..756fea704773 100644 --- a/compiler-rt/lib/hwasan/hwasan_report.h +++ b/compiler-rt/lib/hwasan/hwasan_report.h @@ -29,9 +29,10 @@ void ReportTailOverwritten(StackTrace *stack, uptr addr, uptr orig_size, const u8 *expected); void ReportRegisters(uptr *registers_frame, uptr pc); // OHOS_LOCAL begin -void ReportMemoryNearRegisters(uptr *registers_frame, uptr pc); +void ReportMemoryNearRegisters(uptr *registers_frame, uptr sp, uptr pc); void PrintMemoryAroundAddress(MemoryMappingLayout &proc_maps, int reg_num, - uptr addr, uptr len, bool is_pc = false); + uptr addr, uptr len, bool is_sp = false, + bool is_pc = false); // OHOS_LOCAL end void ReportAtExitStatistics(); -- Gitee