@@ -319,77 +319,6 @@ static uptr GetGlobalSizeFromDescriptor(uptr ptr) {
319
319
return 0 ;
320
320
}
321
321
322
- static void ShowHeapOrGlobalCandidate (uptr untagged_addr, tag_t *candidate,
323
- tag_t *left, tag_t *right) {
324
- Decorator d;
325
- uptr mem = ShadowToMem (reinterpret_cast <uptr>(candidate));
326
- HwasanChunkView chunk = FindHeapChunkByAddress (mem);
327
- if (chunk.IsAllocated ()) {
328
- uptr offset;
329
- const char *whence;
330
- if (untagged_addr < chunk.End () && untagged_addr >= chunk.Beg ()) {
331
- offset = untagged_addr - chunk.Beg ();
332
- whence = " inside" ;
333
- } else if (candidate == left) {
334
- offset = untagged_addr - chunk.End ();
335
- whence = " after" ;
336
- } else {
337
- offset = chunk.Beg () - untagged_addr;
338
- whence = " before" ;
339
- }
340
- Printf (" %s" , d.Error ());
341
- Printf (" \n Cause: heap-buffer-overflow\n " );
342
- Printf (" %s" , d.Default ());
343
- Printf (" %s" , d.Location ());
344
- Printf (" %p is located %zd bytes %s a %zd-byte region [%p,%p)\n " ,
345
- untagged_addr, offset, whence, chunk.UsedSize (), chunk.Beg (),
346
- chunk.End ());
347
- Printf (" %s" , d.Allocation ());
348
- Printf (" allocated by thread T%u here:\n " , chunk.GetAllocThreadId ());
349
- Printf (" %s" , d.Default ());
350
- GetStackTraceFromId (chunk.GetAllocStackId ()).Print ();
351
- return ;
352
- }
353
- // Check whether the address points into a loaded library. If so, this is
354
- // most likely a global variable.
355
- const char *module_name;
356
- uptr module_address;
357
- Symbolizer *sym = Symbolizer::GetOrInit ();
358
- if (sym->GetModuleNameAndOffsetForPC (mem, &module_name, &module_address)) {
359
- Printf (" %s" , d.Error ());
360
- Printf (" \n Cause: global-overflow\n " );
361
- Printf (" %s" , d.Default ());
362
- DataInfo info;
363
- Printf (" %s" , d.Location ());
364
- if (sym->SymbolizeData (mem, &info) && info.start ) {
365
- Printf (
366
- " %p is located %zd bytes %s a %zd-byte global variable "
367
- " %s [%p,%p) in %s\n " ,
368
- untagged_addr,
369
- candidate == left ? untagged_addr - (info.start + info.size )
370
- : info.start - untagged_addr,
371
- candidate == left ? " after" : " before" , info.size , info.name ,
372
- info.start , info.start + info.size , module_name);
373
- } else {
374
- uptr size = GetGlobalSizeFromDescriptor (mem);
375
- if (size == 0 )
376
- // We couldn't find the size of the global from the descriptors.
377
- Printf (
378
- " %p is located %s a global variable in "
379
- " \n #0 0x%x (%s+0x%x)\n " ,
380
- untagged_addr, candidate == left ? " after" : " before" , mem,
381
- module_name, module_address);
382
- else
383
- Printf (
384
- " %p is located %s a %zd-byte global variable in "
385
- " \n #0 0x%x (%s+0x%x)\n " ,
386
- untagged_addr, candidate == left ? " after" : " before" , size, mem,
387
- module_name, module_address);
388
- }
389
- Printf (" %s" , d.Default ());
390
- }
391
- }
392
-
393
322
void ReportStats () {}
394
323
395
324
static void PrintTagInfoAroundAddr (tag_t *tag_ptr, uptr num_rows,
@@ -479,6 +408,8 @@ class BaseReport {
479
408
480
409
protected:
481
410
void PrintAddressDescription () const ;
411
+ void PrintHeapOrGlobalCandidate (tag_t *candidate, tag_t *left,
412
+ tag_t *right) const ;
482
413
483
414
ScopedReport scoped_report;
484
415
StackTrace *stack = nullptr ;
@@ -498,6 +429,77 @@ class BaseReport {
498
429
} heap;
499
430
};
500
431
432
+ void BaseReport::PrintHeapOrGlobalCandidate (tag_t *candidate, tag_t *left,
433
+ tag_t *right) const {
434
+ Decorator d;
435
+ uptr mem = ShadowToMem (reinterpret_cast <uptr>(candidate));
436
+ HwasanChunkView chunk = FindHeapChunkByAddress (mem);
437
+ if (chunk.IsAllocated ()) {
438
+ uptr offset;
439
+ const char *whence;
440
+ if (untagged_addr < chunk.End () && untagged_addr >= chunk.Beg ()) {
441
+ offset = untagged_addr - chunk.Beg ();
442
+ whence = " inside" ;
443
+ } else if (candidate == left) {
444
+ offset = untagged_addr - chunk.End ();
445
+ whence = " after" ;
446
+ } else {
447
+ offset = chunk.Beg () - untagged_addr;
448
+ whence = " before" ;
449
+ }
450
+ Printf (" %s" , d.Error ());
451
+ Printf (" \n Cause: heap-buffer-overflow\n " );
452
+ Printf (" %s" , d.Default ());
453
+ Printf (" %s" , d.Location ());
454
+ Printf (" %p is located %zd bytes %s a %zd-byte region [%p,%p)\n " ,
455
+ untagged_addr, offset, whence, chunk.UsedSize (), chunk.Beg (),
456
+ chunk.End ());
457
+ Printf (" %s" , d.Allocation ());
458
+ Printf (" allocated by thread T%u here:\n " , chunk.GetAllocThreadId ());
459
+ Printf (" %s" , d.Default ());
460
+ GetStackTraceFromId (chunk.GetAllocStackId ()).Print ();
461
+ return ;
462
+ }
463
+ // Check whether the address points into a loaded library. If so, this is
464
+ // most likely a global variable.
465
+ const char *module_name;
466
+ uptr module_address;
467
+ Symbolizer *sym = Symbolizer::GetOrInit ();
468
+ if (sym->GetModuleNameAndOffsetForPC (mem, &module_name, &module_address)) {
469
+ Printf (" %s" , d.Error ());
470
+ Printf (" \n Cause: global-overflow\n " );
471
+ Printf (" %s" , d.Default ());
472
+ DataInfo info;
473
+ Printf (" %s" , d.Location ());
474
+ if (sym->SymbolizeData (mem, &info) && info.start ) {
475
+ Printf (
476
+ " %p is located %zd bytes %s a %zd-byte global variable "
477
+ " %s [%p,%p) in %s\n " ,
478
+ untagged_addr,
479
+ candidate == left ? untagged_addr - (info.start + info.size )
480
+ : info.start - untagged_addr,
481
+ candidate == left ? " after" : " before" , info.size , info.name ,
482
+ info.start , info.start + info.size , module_name);
483
+ } else {
484
+ uptr size = GetGlobalSizeFromDescriptor (mem);
485
+ if (size == 0 )
486
+ // We couldn't find the size of the global from the descriptors.
487
+ Printf (
488
+ " %p is located %s a global variable in "
489
+ " \n #0 0x%x (%s+0x%x)\n " ,
490
+ untagged_addr, candidate == left ? " after" : " before" , mem,
491
+ module_name, module_address);
492
+ else
493
+ Printf (
494
+ " %p is located %s a %zd-byte global variable in "
495
+ " \n #0 0x%x (%s+0x%x)\n " ,
496
+ untagged_addr, candidate == left ? " after" : " before" , size, mem,
497
+ module_name, module_address);
498
+ }
499
+ Printf (" %s" , d.Default ());
500
+ }
501
+ }
502
+
501
503
void BaseReport::PrintAddressDescription () const {
502
504
Decorator d;
503
505
int num_descriptions_printed = 0 ;
@@ -565,7 +567,7 @@ void BaseReport::PrintAddressDescription() const {
565
567
566
568
if (!stack_allocations_count && candidate &&
567
569
candidate_distance <= kCloseCandidateDistance ) {
568
- ShowHeapOrGlobalCandidate (untagged_addr, candidate, left, right);
570
+ PrintHeapOrGlobalCandidate ( candidate, left, right);
569
571
num_descriptions_printed++;
570
572
}
571
573
@@ -607,7 +609,7 @@ void BaseReport::PrintAddressDescription() const {
607
609
});
608
610
609
611
if (candidate && num_descriptions_printed == 0 ) {
610
- ShowHeapOrGlobalCandidate (untagged_addr, candidate, left, right);
612
+ PrintHeapOrGlobalCandidate ( candidate, left, right);
611
613
num_descriptions_printed++;
612
614
}
613
615
0 commit comments