Skip to content

Commit 5d76d2e

Browse files
committed
Improve reporting related to bad addresses near device-side memory management calls
Change-Id: I212aec8af2d4656726d30a72bbdb325a591598b4
1 parent 9789fb5 commit 5d76d2e

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

compiler-rt/lib/asan/asan_errors.cpp

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,6 @@ void ErrorNonSelfAMDGPU::PrintStack() {
692692
symbolizer.SymbolizePC(callstack[0] - cb_loc.vma_adjust, source_location);
693693
// release all allocated comgr objects.
694694
symbolizer.Release();
695-
CloseFile((fd_t)cb_loc.fd);
696695
}
697696
#endif
698697
Printf("%s", source_location.data());
@@ -714,18 +713,80 @@ void ErrorNonSelfAMDGPU::PrintThreadsAndAddresses() {
714713
Printf("%s\n", str.data());
715714
}
716715

716+
static uptr ScanForMagicDown(uptr start, uptr lo, uptr magic0, uptr magic1) {
717+
for (uptr p = start; p >= lo; p -= sizeof(uptr)) {
718+
if (((uptr*)p)[0] == magic0 && ((uptr*)p)[1] == magic1)
719+
return p;
720+
}
721+
return 0;
722+
}
723+
724+
static uptr ScanForMagicUp(uptr start, uptr hi, uptr magic0, uptr magic1) {
725+
for (uptr p = start; p < hi; p += sizeof(uptr)) {
726+
if (((uptr*)p)[0] == magic0 && ((uptr*)p)[1] == magic1)
727+
return p;
728+
}
729+
return 0;
730+
}
731+
732+
void ErrorNonSelfAMDGPU::PrintMallocStack() {
733+
// Facts about asan malloc on device
734+
const uptr magic = 0xfedcba1ee1abcdefULL;
735+
const uptr offset = 32;
736+
const uptr min_chunk_size = 96;
737+
const uptr min_alloc_size = 48;
738+
739+
Decorator d;
740+
HeapAddressDescription addr_description;
741+
742+
if (GetHeapAddressInformation(device_address[0], access_size,
743+
&addr_description) &&
744+
addr_description.chunk_access.chunk_size >= min_chunk_size) {
745+
uptr lo = addr_description.chunk_access.chunk_begin;
746+
uptr hi = lo + addr_description.chunk_access.chunk_size - min_alloc_size;
747+
uptr start = RoundDownTo(device_address[0], sizeof(uptr));
748+
749+
uptr plo = ScanForMagicDown(start, lo, magic, lo);
750+
if (plo) {
751+
callstack[0] = ((uptr*)plo)[2];
752+
Printf("%s%p is %u bytes above an address from a %sdevice malloc "
753+
"(or free) call of size %u from%s\n",
754+
d.Location(), device_address[0],
755+
(int)(device_address[0] - (plo+offset)),
756+
d.Allocation(), ((int*)plo)[7], d.Default());
757+
PrintStack();
758+
}
759+
760+
uptr phi = ScanForMagicUp(start, hi, magic, lo);
761+
if (phi) {
762+
callstack[0] = ((uptr*)phi)[2];
763+
Printf("%s%p is %u bytes below an address from a %sdevice malloc "
764+
"(or free) call of size %u from%s\n",
765+
d.Location(), device_address[0],
766+
(int)((phi+offset) - device_address[0]),
767+
768+
d.Allocation(), ((int*)phi)[7], d.Default());
769+
PrintStack();
770+
}
771+
}
772+
}
773+
717774
void ErrorNonSelfAMDGPU::Print() {
718775
Decorator d;
719776
Printf("%s", d.Error());
720777
Report("ERROR: AddressSanitizer: %s on amdgpu device %zu at pc %p\n",
721778
bug_descr, device_id, callstack[0]);
722-
Printf("%s", d.Default());
723779
Printf("%s%s of size %zu in workgroup id (%zu,%zu,%zu)\n", d.Access(),
724780
(is_write ? "WRITE" : "READ"), access_size, wg.idx, wg.idy, wg.idz);
725781
Printf("%s", d.Default());
726782
PrintStack();
727783
Printf("%s", d.Location());
728784
PrintThreadsAndAddresses();
785+
Printf("%s", d.Default());
786+
if (shadow_val == kAsanHeapFreeMagic ||
787+
shadow_val == kAsanHeapLeftRedzoneMagic) {
788+
PrintMallocStack();
789+
}
729790
addr_description.Print(bug_descr, true);
730791
Printf("%s", d.Default());
731792
// print shadow memory region for single address

compiler-rt/lib/asan/asan_errors.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ struct ErrorNonSelfAMDGPU : ErrorGenericBase {
470470
private:
471471
void PrintStack();
472472
void PrintThreadsAndAddresses();
473+
void PrintMallocStack();
473474
};
474475

475476
// clang-format off

0 commit comments

Comments
 (0)