summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2012-08-28 13:49:49 +0000
committerKostya Serebryany <kcc@google.com>2012-08-28 13:49:49 +0000
commitcc347222d55967fdb775429a8a0a3a5d795b8b50 (patch)
tree0377b71864da176f2a50c940bd88b0ec72940112 /lib
parent2b939c3abc8b7713ef28000bd768ca6d77445f45 (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.cc6
-rw-r--r--lib/asan/asan_report.cc20
-rw-r--r--lib/asan/asan_stack.cc39
-rw-r--r--lib/asan/asan_stack.h14
-rw-r--r--lib/asan/asan_thread.h2
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_; }