Convert AsanLocateAddress to Get*AddressInformation functions.

llvm-svn: 279046
This commit is contained in:
Filipe Cabecinhas 2016-08-18 10:31:19 +00:00
parent 8b44bbc077
commit e86f80c45e
1 changed files with 41 additions and 41 deletions

View File

@ -21,50 +21,30 @@
#include "asan_report.h" #include "asan_report.h"
#include "asan_thread.h" #include "asan_thread.h"
namespace __asan { namespace {
using namespace __asan;
void GetInfoForStackVar(uptr addr, AddressDescription *descr, AsanThread *t) { void FindInfoForStackVar(uptr addr, const char *frame_descr, uptr offset,
descr->name[0] = 0; AddressDescription *descr) {
descr->region_address = 0;
descr->region_size = 0;
descr->region_kind = "stack";
AsanThread::StackFrameAccess access;
if (!t->GetStackFrameAccessByAddr(addr, &access))
return;
InternalMmapVector<StackVarDescr> vars(16); InternalMmapVector<StackVarDescr> vars(16);
if (!ParseFrameDescription(access.frame_descr, &vars)) { if (!ParseFrameDescription(frame_descr, &vars)) {
return; return;
} }
for (uptr i = 0; i < vars.size(); i++) { for (uptr i = 0; i < vars.size(); i++) {
if (access.offset <= vars[i].beg + vars[i].size) { if (offset <= vars[i].beg + vars[i].size) {
internal_strncat(descr->name, vars[i].name_pos, // We use name_len + 1 because strlcpy will guarantee a \0 at the end, so
Min(descr->name_size, vars[i].name_len)); // if we're limiting the copy due to name_len, we add 1 to ensure we copy
descr->region_address = addr - (access.offset - vars[i].beg); // the whole name and then terminate with '\0'.
internal_strlcpy(descr->name, vars[i].name_pos,
Min(descr->name_size, vars[i].name_len + 1));
descr->region_address = addr - (offset - vars[i].beg);
descr->region_size = vars[i].size; descr->region_size = vars[i].size;
return; return;
} }
} }
} }
void GetInfoForHeapAddress(uptr addr, AddressDescription *descr) {
AsanChunkView chunk = FindHeapChunkByAddress(addr);
descr->name[0] = 0;
descr->region_address = 0;
descr->region_size = 0;
if (!chunk.IsValid()) {
descr->region_kind = "heap-invalid";
return;
}
descr->region_address = chunk.Beg();
descr->region_size = chunk.UsedSize();
descr->region_kind = "heap";
}
void AsanLocateAddress(uptr addr, AddressDescription *descr) { void AsanLocateAddress(uptr addr, AddressDescription *descr) {
ShadowAddressDescription shadow_descr; ShadowAddressDescription shadow_descr;
if (GetShadowAddressInformation(addr, &shadow_descr)) { if (GetShadowAddressInformation(addr, &shadow_descr)) {
@ -80,17 +60,39 @@ void AsanLocateAddress(uptr addr, AddressDescription *descr) {
descr->region_size = g.size; descr->region_size = g.size;
return; return;
} }
StackAddressDescription stack_descr;
asanThreadRegistry().Lock(); asanThreadRegistry().Lock();
AsanThread *thread = FindThreadByStackAddress(addr); if (GetStackAddressInformation(addr, &stack_descr)) {
asanThreadRegistry().Unlock(); asanThreadRegistry().Unlock();
if (thread) { descr->region_kind = "stack";
GetInfoForStackVar(addr, descr, thread); if (!stack_descr.frame_descr) {
descr->name[0] = 0;
descr->region_address = 0;
descr->region_size = 0;
} else {
FindInfoForStackVar(addr, stack_descr.frame_descr, stack_descr.offset,
descr);
}
return; return;
} }
GetInfoForHeapAddress(addr, descr); asanThreadRegistry().Unlock();
descr->name[0] = 0;
HeapAddressDescription heap_descr;
if (GetHeapAddressInformation(addr, 1, &heap_descr)) {
descr->region_address = heap_descr.chunk_access.chunk_begin;
descr->region_size = heap_descr.chunk_access.chunk_size;
descr->region_kind = "heap";
return;
}
descr->region_address = 0;
descr->region_size = 0;
descr->region_kind = "heap-invalid";
} }
static uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id, uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id,
bool alloc_stack) { bool alloc_stack) {
AsanChunkView chunk = FindHeapChunkByAddress(addr); AsanChunkView chunk = FindHeapChunkByAddress(addr);
if (!chunk.IsValid()) return 0; if (!chunk.IsValid()) return 0;
@ -117,9 +119,7 @@ static uptr AsanGetStack(uptr addr, uptr *trace, u32 size, u32 *thread_id,
return 0; return 0;
} }
} // namespace __asan } // namespace
using namespace __asan;
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE
const char *__asan_locate_address(uptr addr, char *name, uptr name_size, const char *__asan_locate_address(uptr addr, char *name, uptr name_size,