diff options
author | Kostya Serebryany <kcc@google.com> | 2012-08-28 13:49:49 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2012-08-28 13:49:49 +0000 |
commit | cc347222d55967fdb775429a8a0a3a5d795b8b50 (patch) | |
tree | 0377b71864da176f2a50c940bd88b0ec72940112 /lib | |
parent | 2b939c3abc8b7713ef28000bd768ca6d77445f45 (diff) |
[asan] even more refactoring to move StackTrace to sanitizer_common
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@162754 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/asan/asan_allocator.cc | 6 | ||||
-rw-r--r-- | lib/asan/asan_report.cc | 20 | ||||
-rw-r--r-- | lib/asan/asan_stack.cc | 39 | ||||
-rw-r--r-- | lib/asan/asan_stack.h | 14 | ||||
-rw-r--r-- | lib/asan/asan_thread.h | 2 |
5 files changed, 45 insertions, 36 deletions
diff --git a/lib/asan/asan_allocator.cc b/lib/asan/asan_allocator.cc index 125db2116..e64085dc6 100644 --- a/lib/asan/asan_allocator.cc +++ b/lib/asan/asan_allocator.cc @@ -605,17 +605,17 @@ void DescribeHeapAddress(uptr addr, uptr access_size) { StackTrace free_stack; StackTrace::UncompressStack(&free_stack, m->compressed_free_stack(), m->compressed_free_stack_size()); - free_stack.PrintStack(); + PrintStack(&free_stack); Printf("previously allocated by thread T%d here:\n", alloc_thread->tid()); - alloc_stack.PrintStack(); + PrintStack(&alloc_stack); t->summary()->Announce(); free_thread->Announce(); alloc_thread->Announce(); } else { Printf("allocated by thread T%d here:\n", alloc_thread->tid()); - alloc_stack.PrintStack(); + PrintStack(&alloc_stack); t->summary()->Announce(); alloc_thread->Announce(); } diff --git a/lib/asan/asan_report.cc b/lib/asan/asan_report.cc index 0c653d541..71ca4003b 100644 --- a/lib/asan/asan_report.cc +++ b/lib/asan/asan_report.cc @@ -258,13 +258,13 @@ void ReportSIGSEGV(uptr pc, uptr sp, uptr bp, uptr addr) { asanThreadRegistry().GetCurrentTidOrInvalid()); Printf("AddressSanitizer can not provide additional info.\n"); GET_STACK_TRACE_WITH_PC_AND_BP(kStackTraceMax, pc, bp); - stack.PrintStack(); + PrintStack(&stack); } void ReportDoubleFree(uptr addr, StackTrace *stack) { ScopedInErrorReport in_report; Report("ERROR: AddressSanitizer attempting double-free on %p:\n", addr); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -272,7 +272,7 @@ void ReportFreeNotMalloced(uptr addr, StackTrace *stack) { ScopedInErrorReport in_report; Report("ERROR: AddressSanitizer attempting free on address " "which was not malloc()-ed: %p\n", addr); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -281,7 +281,7 @@ void ReportMallocUsableSizeNotOwned(uptr addr, StackTrace *stack) { Report("ERROR: AddressSanitizer attempting to call " "malloc_usable_size() for pointer which is " "not owned: %p\n", addr); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -290,7 +290,7 @@ void ReportAsanGetAllocatedSizeNotOwned(uptr addr, StackTrace *stack) { Report("ERROR: AddressSanitizer attempting to call " "__asan_get_allocated_size() for pointer which is " "not owned: %p\n", addr); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -301,7 +301,7 @@ void ReportStringFunctionMemoryRangesOverlap( Report("ERROR: AddressSanitizer %s-param-overlap: " "memory ranges [%p,%p) and [%p, %p) overlap\n", \ function, offset1, offset1 + length1, offset2, offset2 + length2); - stack->PrintStack(); + PrintStack(stack); DescribeAddress((uptr)offset1, length1); DescribeAddress((uptr)offset2, length2); } @@ -315,7 +315,7 @@ void WarnMacFreeUnallocated( "AddressSanitizer is ignoring this error on Mac OS now.\n", addr); PrintZoneForPointer(addr, zone_ptr, zone_name); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -326,7 +326,7 @@ void ReportMacMzReallocUnknown( "This is an unrecoverable problem, exiting now.\n", addr); PrintZoneForPointer(addr, zone_ptr, zone_name); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -337,7 +337,7 @@ void ReportMacCfReallocUnknown( "This is an unrecoverable problem, exiting now.\n", addr); PrintZoneForPointer(addr, zone_ptr, zone_name); - stack->PrintStack(); + PrintStack(stack); DescribeHeapAddress(addr, 1); } @@ -401,7 +401,7 @@ void __asan_report_error(uptr pc, uptr bp, uptr sp, access_size, (void*)addr, curr_tid); GET_STACK_TRACE_WITH_PC_AND_BP(kStackTraceMax, pc, bp); - stack.PrintStack(); + PrintStack(&stack); DescribeAddress(addr, access_size); diff --git a/lib/asan/asan_stack.cc b/lib/asan/asan_stack.cc index 618fc32d5..d8611333a 100644 --- a/lib/asan/asan_stack.cc +++ b/lib/asan/asan_stack.cc @@ -20,10 +20,10 @@ namespace __asan { static __asan_symbolize_callback symbolize_callback; -static const char *StripPathPrefix(const char *filepath) { - const char *path_prefix = flags()->strip_path_prefix; - if (filepath == internal_strstr(filepath, path_prefix)) - return filepath + internal_strlen(path_prefix); +static const char *StripPathPrefix(const char *filepath, + const char *strip_file_prefix) { + if (filepath == internal_strstr(filepath, strip_file_prefix)) + return filepath + internal_strlen(strip_file_prefix); return filepath; } @@ -39,7 +39,9 @@ static uptr patch_pc(uptr pc) { return pc - 1; } -void StackTrace::PrintStack(uptr *addr, uptr size) { +void StackTrace::PrintStack(uptr *addr, uptr size, + bool symbolize, const char *strip_file_prefix, + SymbolizeCallback symbolize_callback ) { MemoryMappingLayout proc_maps; uptr frame_num = 0; for (uptr i = 0; i < size && addr[i]; i++) { @@ -50,15 +52,14 @@ void StackTrace::PrintStack(uptr *addr, uptr size) { // We can't know anything about the string returned by external // symbolizer, but if it starts with filename, try to strip path prefix // from it. - Printf(" #%zu 0x%zx %s\n", frame_num, pc, StripPathPrefix(buff)); + Printf(" #%zu 0x%zx %s\n", frame_num, pc, + StripPathPrefix(buff, strip_file_prefix)); frame_num++; continue; } AddressInfo addr_frames[64]; - uptr addr_frames_num = 0; - if (flags()->symbolize) { - addr_frames_num = SymbolizeCode(pc, addr_frames, ARRAY_SIZE(addr_frames)); - } + uptr addr_frames_num = + symbolize ? SymbolizeCode(pc, addr_frames, ARRAY_SIZE(addr_frames)) : 0; if (addr_frames_num > 0) { for (uptr j = 0; j < addr_frames_num; j++) { AddressInfo &info = addr_frames[j]; @@ -67,11 +68,11 @@ void StackTrace::PrintStack(uptr *addr, uptr size) { Printf(" in %s", info.function); } if (info.file) { - Printf(" %s:%d:%d", StripPathPrefix(info.file), info.line, - info.column); + Printf(" %s:%d:%d", StripPathPrefix(info.file, strip_file_prefix), + info.line, info.column); } else if (info.module) { - Printf(" (%s+0x%zx)", StripPathPrefix(info.module), - info.module_offset); + Printf(" (%s+0x%zx)", StripPathPrefix(info.module, strip_file_prefix), + info.module_offset); } Printf("\n"); info.Clear(); @@ -82,8 +83,8 @@ void StackTrace::PrintStack(uptr *addr, uptr size) { char filename[4096]; if (proc_maps.GetObjectNameAndOffset(pc, &offset, filename, sizeof(filename))) { - Printf(" #%zu 0x%zx (%s+0x%zx)\n", - frame_num, pc, StripPathPrefix(filename), offset); + Printf(" #%zu 0x%zx (%s+0x%zx)\n", frame_num, pc, + StripPathPrefix(filename, strip_file_prefix), offset); } else { Printf(" #%zu 0x%zx\n", frame_num, pc); } @@ -222,6 +223,12 @@ void StackTrace::UncompressStack(StackTrace *stack, #endif // __WORDSIZE } +void PrintStack(StackTrace *stack) { + stack->PrintStack(stack->trace, stack->size, flags()->symbolize, + flags()->strip_path_prefix, symbolize_callback); +} + + } // namespace __asan // ------------------ Interface -------------- {{{1 diff --git a/lib/asan/asan_stack.h b/lib/asan/asan_stack.h index 0d483b9a1..2c7250317 100644 --- a/lib/asan/asan_stack.h +++ b/lib/asan/asan_stack.h @@ -21,13 +21,14 @@ namespace __asan { static const uptr kStackTraceMax = 64; struct StackTrace { + typedef bool (*SymbolizeCallback)(const void *pc, char *out_buffer, + int out_size); uptr size; uptr max_size; uptr trace[kStackTraceMax]; - static void PrintStack(uptr *addr, uptr size); - void PrintStack() { - PrintStack(this->trace, this->size); - } + static void PrintStack(uptr *addr, uptr size, + bool symbolize, const char *strip_file_prefix, + SymbolizeCallback symbolize_callback); void CopyTo(uptr *dst, uptr dst_size) { for (uptr i = 0; i < size && i < dst_size; i++) dst[i] = trace[i]; @@ -53,7 +54,8 @@ struct StackTrace { u32 *compressed, uptr size); }; -void GetStackTrace(StackTrace *trace, uptr max_s, uptr pc, uptr bp); +void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp); +void PrintStack(StackTrace *stack); @@ -100,7 +102,7 @@ void GetStackTrace(StackTrace *trace, uptr max_s, uptr pc, uptr bp); #define PRINT_CURRENT_STACK() \ { \ GET_STACK_TRACE_HERE(kStackTraceMax); \ - stack.PrintStack(); \ + PrintStack(&stack); \ } #endif // ASAN_STACK_H diff --git a/lib/asan/asan_thread.h b/lib/asan/asan_thread.h index 7b9cac989..47585a3fc 100644 --- a/lib/asan/asan_thread.h +++ b/lib/asan/asan_thread.h @@ -45,7 +45,7 @@ class AsanThreadSummary { if (!announced_) { announced_ = true; Printf("Thread T%d created by T%d here:\n", tid_, parent_tid_); - stack_.PrintStack(); + PrintStack(&stack_); } } u32 tid() { return tid_; } |