Lines Matching +full:data +full:- +full:addr
1 //===-- asan_descriptions.cpp -----------------------------------*- C++ -*-===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
12 //===----------------------------------------------------------------------===//
23 Init(t->tid, t->name);
32 Init(tid, t->name);
40 internal_snprintf(&name[len], sizeof(name) - len, " (%s)", tname);
47 if (context->tid == kMainTid || context->announced) {
50 context->announced = true;
53 if (context->parent_tid == kInvalidTid) {
55 Printf("%s", str.data());
59 AsanThreadIdAndName(context->parent_tid).c_str());
60 Printf("%s", str.data());
61 StackDepotGet(context->stack_id).Print();
63 if (flags()->print_full_thread_history) {
65 GetThreadContextByTidLocked(context->parent_tid);
71 static bool GetShadowKind(uptr addr, ShadowKind *shadow_kind) {
72 CHECK(!AddrIsInMem(addr));
73 if (AddrIsInShadowGap(addr)) {
75 } else if (AddrIsInHighShadow(addr)) {
77 } else if (AddrIsInLowShadow(addr)) {
85 bool DescribeAddressIfShadow(uptr addr) {
87 if (!GetShadowAddressInformation(addr, &descr)) return false;
92 bool GetShadowAddressInformation(uptr addr, ShadowAddressDescription *descr) {
93 if (AddrIsInMem(addr)) return false;
95 if (!GetShadowKind(addr, &shadow_kind)) return false;
96 if (shadow_kind != kShadowKindGap) descr->shadow_byte = *(u8 *)addr;
97 descr->addr = addr;
98 descr->kind = shadow_kind;
104 AsanChunkView chunk, uptr addr,
106 descr->bad_addr = addr;
107 if (chunk.AddrIsAtLeft(addr, access_size, &descr->offset)) {
108 descr->access_type = kAccessTypeLeft;
109 } else if (chunk.AddrIsAtRight(addr, access_size, &descr->offset)) {
110 descr->access_type = kAccessTypeRight;
111 if (descr->offset < 0) {
112 descr->bad_addr -= descr->offset;
113 descr->offset = 0;
115 } else if (chunk.AddrIsInside(addr, access_size, &descr->offset)) {
116 descr->access_type = kAccessTypeInside;
118 descr->access_type = kAccessTypeUnknown;
120 descr->chunk_begin = chunk.Beg();
121 descr->chunk_size = chunk.UsedSize();
122 descr->user_requested_alignment = chunk.UserRequestedAlignment();
123 descr->alloc_type = chunk.GetAllocType();
126 static void PrintHeapChunkAccess(uptr addr, const ChunkAccess &descr) {
148 str.AppendF(" %zu-byte region [%p,%p)\n", descr.chunk_size,
152 Printf("%s", str.data());
155 bool GetHeapAddressInformation(uptr addr, uptr access_size,
157 AsanChunkView chunk = FindHeapChunkByAddress(addr);
161 descr->addr = addr;
162 GetAccessToHeapChunkInformation(&descr->chunk_access, chunk, addr,
165 descr->alloc_tid = chunk.AllocTid();
166 descr->alloc_stack_id = chunk.GetAllocStackId();
167 descr->free_tid = chunk.FreeTid();
168 if (descr->free_tid != kInvalidTid)
169 descr->free_stack_id = chunk.GetFreeStackId();
180 bool DescribeAddressIfHeap(uptr addr, uptr access_size) {
182 if (!GetHeapAddressInformation(addr, access_size, &descr)) {
193 bool GetStackAddressInformation(uptr addr, uptr access_size,
195 AsanThread *t = FindThreadByStackAddress(addr);
198 descr->addr = addr;
199 descr->tid = t->tid();
202 if (!t->GetStackFrameAccessByAddr(addr, &access)) {
203 descr->frame_descr = nullptr;
207 descr->offset = access.offset;
208 descr->access_size = access_size;
209 descr->frame_pc = access.frame_pc;
210 descr->frame_descr = access.frame_descr;
214 // three-doubleword data structure with the first field containing
216 descr->frame_pc = *reinterpret_cast<uptr *>(descr->frame_pc);
218 descr->frame_pc += 16;
223 static void PrintAccessAndVarIntersection(const StackVarDescr &var, uptr addr,
227 uptr addr_end = addr + access_size;
231 if (addr >= var.beg) {
233 pos_descr = "is inside"; // May happen if this is a use-after-return.
234 else if (addr < var_end)
237 next_var_beg - addr_end >= addr - var_end)
242 else if (addr >= prev_var_end && addr - prev_var_end >= var.beg - addr_end)
261 d.Location(), addr, pos_descr, d.Default());
265 Printf("%s", str.data());
268 bool DescribeAddressIfStack(uptr addr, uptr access_size) {
270 if (!GetStackAddressInformation(addr, access_size, &descr)) return false;
276 static void DescribeAddressRelativeToGlobal(uptr addr, uptr access_size,
281 if (addr < g.beg) {
282 str.AppendF("%p is located %zd bytes before", (void *)addr, g.beg - addr);
283 } else if (addr + access_size > g.beg + g.size) {
284 if (addr < g.beg + g.size) addr = g.beg + g.size;
285 str.AppendF("%p is located %zd bytes after", (void *)addr,
286 addr - (g.beg + g.size));
289 str.AppendF("%p is located %zd bytes inside of", (void *)addr,
290 addr - g.beg);
298 Printf("%s", str.data());
301 bool GetGlobalAddressInformation(uptr addr, uptr access_size,
303 descr->addr = addr;
304 int globals_num = GetGlobalsForAddress(addr, descr->globals, descr->reg_sites,
305 ARRAY_SIZE(descr->globals));
306 descr->size = globals_num;
307 descr->access_size = access_size;
311 bool DescribeAddressIfGlobal(uptr addr, uptr access_size,
314 if (!GetGlobalAddressInformation(addr, access_size, &descr)) return false;
321 Printf("Address %p is located in the %s area.\n", (void *)addr,
327 DescribeAddressRelativeToGlobal(addr, access_size, globals[i]);
329 0 == internal_strcmp(bug_type, "initialization-order-fiasco") &&
346 a.beg <= addr &&
347 b.beg <= other.addr &&
348 (addr + access_size) < (a.beg + a.size) &&
349 (other.addr + other.access_size) < (b.beg + b.size))
360 Printf("Address %p is located in stack of thread %s", (void *)addr,
375 // (e.g. use-after-scope, or different thread's stack).
387 // 'addr' is a stack address, so return true even if we can't parse frame
396 uptr prev_var_end = i ? vars[i - 1].beg + vars[i - 1].size : 0;
413 PrintHeapChunkAccess(addr, chunk_access);
439 AddressDescription::AddressDescription(uptr addr, uptr access_size,
441 if (GetShadowAddressInformation(addr, &data.shadow)) {
442 data.kind = kAddressKindShadow;
445 if (GetHeapAddressInformation(addr, access_size, &data.heap)) {
446 data.kind = kAddressKindHeap;
453 isStackMemory = GetStackAddressInformation(addr, access_size, &data.stack);
455 isStackMemory = GetStackAddressInformation(addr, access_size, &data.stack);
458 data.kind = kAddressKindStack;
462 if (GetGlobalAddressInformation(addr, access_size, &data.global)) {
463 data.kind = kAddressKindGlobal;
466 data.kind = kAddressKindWild;
467 data.wild.addr = addr;
468 data.wild.access_size = access_size;
473 (void *)addr, (void *)access_size);
476 void PrintAddressDescription(uptr addr, uptr access_size,
479 if (GetShadowAddressInformation(addr, &shadow_descr)) {
485 if (GetGlobalAddressInformation(addr, access_size, &global_descr)) {
491 if (GetStackAddressInformation(addr, access_size, &stack_descr)) {
497 if (GetHeapAddressInformation(addr, access_size, &heap_descr)) {