Convert AsanLocateAddress to Get*AddressInformation functions.
llvm-svn: 279046
This commit is contained in:
parent
8b44bbc077
commit
e86f80c45e
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue