Skip to content

Commit de4850c

Browse files
authored
[hwasan] Optimize shadow shapshot size (#67068)
Now we copy only tags we will print. CHECKs in GetTagCopy and GetShortTagCopy ensure that.
1 parent 9b6b2a0 commit de4850c

File tree

1 file changed

+36
-15
lines changed

1 file changed

+36
-15
lines changed

compiler-rt/lib/hwasan/hwasan_report.cpp

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,21 @@ static uptr GetGlobalSizeFromDescriptor(uptr ptr) {
323323

324324
void ReportStats() {}
325325

326+
constexpr uptr kDumpWidth = 16;
327+
constexpr uptr kShadowLines = 17;
328+
constexpr uptr kShadowDumpSize = kShadowLines * kDumpWidth;
329+
330+
constexpr uptr kShortLines = 3;
331+
constexpr uptr kShortDumpSize = kShortLines * kDumpWidth;
332+
constexpr uptr kShortDumpOffset = (kShadowLines - kShortLines) / 2 * kDumpWidth;
333+
334+
static uptr GetPrintTagStart(uptr addr) {
335+
addr = MemToShadow(addr);
336+
addr = RoundDownTo(addr, kDumpWidth);
337+
addr -= kDumpWidth * (kShadowLines / 2);
338+
return addr;
339+
}
340+
326341
template <typename PrintTag>
327342
static void PrintTagInfoAroundAddr(uptr addr, uptr num_rows,
328343
InternalScopedString &s,
@@ -352,7 +367,7 @@ static void PrintTagsAroundAddr(uptr addr, GetTag get_tag,
352367
"Memory tags around the buggy address (one tag corresponds to %zd "
353368
"bytes):\n",
354369
kShadowAlignment);
355-
PrintTagInfoAroundAddr(addr, 17, s,
370+
PrintTagInfoAroundAddr(addr, kShadowLines, s,
356371
[&](InternalScopedString &s, uptr tag_addr) {
357372
tag_t tag = get_tag(tag_addr);
358373
s.AppendF("%02x", tag);
@@ -362,7 +377,7 @@ static void PrintTagsAroundAddr(uptr addr, GetTag get_tag,
362377
"Tags for short granules around the buggy address (one tag corresponds "
363378
"to %zd bytes):\n",
364379
kShadowAlignment);
365-
PrintTagInfoAroundAddr(addr, 3, s,
380+
PrintTagInfoAroundAddr(addr, kShortLines, s,
366381
[&](InternalScopedString &s, uptr tag_addr) {
367382
tag_t tag = get_tag(tag_addr);
368383
if (tag >= 1 && tag <= kShadowAlignment) {
@@ -439,8 +454,8 @@ class BaseReport {
439454

440455
struct Shadow {
441456
uptr addr = 0;
442-
tag_t tags[512] = {};
443-
tag_t short_tags[ARRAY_SIZE(tags)] = {};
457+
tag_t tags[kShadowDumpSize] = {};
458+
tag_t short_tags[kShortDumpSize] = {};
444459
};
445460

446461
sptr FindMismatchOffset() const;
@@ -508,18 +523,24 @@ BaseReport::Shadow BaseReport::CopyShadow() const {
508523
if (!MemIsApp(untagged_addr))
509524
return result;
510525

511-
result.addr = MemToShadow(untagged_addr) - ARRAY_SIZE(result.tags) / 2;
512-
for (uptr i = 0; i < ARRAY_SIZE(result.tags); ++i) {
513-
uptr tag_addr = result.addr + i;
514-
if (!MemIsShadow(tag_addr))
515-
continue;
516-
result.tags[i] = *reinterpret_cast<tag_t *>(tag_addr);
517-
uptr granule_addr = ShadowToMem(tag_addr);
518-
if (1 <= result.tags[i] && result.tags[i] <= kShadowAlignment &&
526+
result.addr = GetPrintTagStart(untagged_addr + mismatch_offset);
527+
uptr tag_addr = result.addr;
528+
for (tag_t &tag_copy : result.tags) {
529+
if (MemIsShadow(tag_addr))
530+
tag_copy = *reinterpret_cast<tag_t *>(tag_addr);
531+
++tag_addr;
532+
}
533+
534+
uptr short_tags_addr = result.addr + kShortDumpOffset;
535+
for (tag_t &tag_copy : result.short_tags) {
536+
tag_t tag = GetTagCopy(short_tags_addr);
537+
uptr granule_addr = ShadowToMem(short_tags_addr);
538+
if (1 <= tag && tag <= kShadowAlignment &&
519539
IsAccessibleMemoryRange(granule_addr, kShadowAlignment)) {
520-
result.short_tags[i] =
540+
tag_copy =
521541
*reinterpret_cast<tag_t *>(granule_addr + kShadowAlignment - 1);
522542
}
543+
++short_tags_addr;
523544
}
524545
return result;
525546
}
@@ -532,8 +553,8 @@ tag_t BaseReport::GetTagCopy(uptr addr) const {
532553
}
533554

534555
tag_t BaseReport::GetShortTagCopy(uptr addr) const {
535-
CHECK_GE(addr, shadow.addr);
536-
uptr idx = addr - shadow.addr;
556+
CHECK_GE(addr, shadow.addr + kShortDumpOffset);
557+
uptr idx = addr - shadow.addr - kShortDumpOffset;
537558
CHECK_LT(idx, ARRAY_SIZE(shadow.short_tags));
538559
return shadow.short_tags[idx];
539560
}

0 commit comments

Comments
 (0)