@@ -323,6 +323,21 @@ static uptr GetGlobalSizeFromDescriptor(uptr ptr) {
323
323
324
324
void ReportStats () {}
325
325
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
+
326
341
template <typename PrintTag>
327
342
static void PrintTagInfoAroundAddr (uptr addr, uptr num_rows,
328
343
InternalScopedString &s,
@@ -352,7 +367,7 @@ static void PrintTagsAroundAddr(uptr addr, GetTag get_tag,
352
367
" Memory tags around the buggy address (one tag corresponds to %zd "
353
368
" bytes):\n " ,
354
369
kShadowAlignment );
355
- PrintTagInfoAroundAddr (addr, 17 , s,
370
+ PrintTagInfoAroundAddr (addr, kShadowLines , s,
356
371
[&](InternalScopedString &s, uptr tag_addr) {
357
372
tag_t tag = get_tag (tag_addr);
358
373
s.AppendF (" %02x" , tag);
@@ -362,7 +377,7 @@ static void PrintTagsAroundAddr(uptr addr, GetTag get_tag,
362
377
" Tags for short granules around the buggy address (one tag corresponds "
363
378
" to %zd bytes):\n " ,
364
379
kShadowAlignment );
365
- PrintTagInfoAroundAddr (addr, 3 , s,
380
+ PrintTagInfoAroundAddr (addr, kShortLines , s,
366
381
[&](InternalScopedString &s, uptr tag_addr) {
367
382
tag_t tag = get_tag (tag_addr);
368
383
if (tag >= 1 && tag <= kShadowAlignment ) {
@@ -439,8 +454,8 @@ class BaseReport {
439
454
440
455
struct Shadow {
441
456
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 ] = {};
444
459
};
445
460
446
461
sptr FindMismatchOffset () const ;
@@ -508,18 +523,24 @@ BaseReport::Shadow BaseReport::CopyShadow() const {
508
523
if (!MemIsApp (untagged_addr))
509
524
return result;
510
525
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 &&
519
539
IsAccessibleMemoryRange (granule_addr, kShadowAlignment )) {
520
- result. short_tags [i] =
540
+ tag_copy =
521
541
*reinterpret_cast <tag_t *>(granule_addr + kShadowAlignment - 1 );
522
542
}
543
+ ++short_tags_addr;
523
544
}
524
545
return result;
525
546
}
@@ -532,8 +553,8 @@ tag_t BaseReport::GetTagCopy(uptr addr) const {
532
553
}
533
554
534
555
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 ;
537
558
CHECK_LT (idx, ARRAY_SIZE (shadow.short_tags ));
538
559
return shadow.short_tags [idx];
539
560
}
0 commit comments