@@ -439,65 +439,61 @@ void RestoreStack(int tid, const u64 epoch, VarSizeStackTrace *stk,
439
439
ExtractTagFromStack (stk, tag);
440
440
}
441
441
442
- static bool HandleRacyStacks (ThreadState *thr, VarSizeStackTrace traces[2 ],
443
- uptr addr_min, uptr addr_max) {
444
- bool equal_stack = false ;
445
- RacyStacks hash;
446
- bool equal_address = false ;
447
- RacyAddress ra0 = {addr_min, addr_max};
448
- {
449
- ReadLock lock (&ctx->racy_mtx );
450
- if (flags ()->suppress_equal_stacks ) {
451
- hash.hash [0 ] = md5_hash (traces[0 ].trace , traces[0 ].size * sizeof (uptr));
452
- hash.hash [1 ] = md5_hash (traces[1 ].trace , traces[1 ].size * sizeof (uptr));
453
- for (uptr i = 0 ; i < ctx->racy_stacks .Size (); i++) {
454
- if (hash == ctx->racy_stacks [i]) {
455
- VPrintf (2 ,
456
- " ThreadSanitizer: suppressing report as doubled (stack)\n " );
457
- equal_stack = true ;
458
- break ;
459
- }
460
- }
461
- }
462
- if (flags ()->suppress_equal_addresses ) {
463
- for (uptr i = 0 ; i < ctx->racy_addresses .Size (); i++) {
464
- RacyAddress ra2 = ctx->racy_addresses [i];
465
- uptr maxbeg = max (ra0.addr_min , ra2.addr_min );
466
- uptr minend = min (ra0.addr_max , ra2.addr_max );
467
- if (maxbeg < minend) {
468
- VPrintf (2 , " ThreadSanitizer: suppressing report as doubled (addr)\n " );
469
- equal_address = true ;
470
- break ;
471
- }
472
- }
442
+ static bool FindRacyStacks (const RacyStacks &hash) {
443
+ for (uptr i = 0 ; i < ctx->racy_stacks .Size (); i++) {
444
+ if (hash == ctx->racy_stacks [i]) {
445
+ VPrintf (2 , " ThreadSanitizer: suppressing report as doubled (stack)\n " );
446
+ return true ;
473
447
}
474
448
}
475
- if (!equal_stack && !equal_address)
449
+ return false ;
450
+ }
451
+
452
+ static bool HandleRacyStacks (ThreadState *thr, VarSizeStackTrace traces[2 ]) {
453
+ if (!flags ()->suppress_equal_stacks )
476
454
return false ;
477
- if (!equal_stack) {
478
- Lock lock (&ctx-> racy_mtx );
479
- ctx-> racy_stacks . PushBack (hash );
480
- }
481
- if (!equal_address) {
482
- Lock lock (&ctx-> racy_mtx );
483
- ctx-> racy_addresses . PushBack (ra0) ;
455
+ RacyStacks hash;
456
+ hash. hash [ 0 ] = md5_hash (traces[ 0 ]. trace , traces[ 0 ]. size * sizeof (uptr) );
457
+ hash. hash [ 1 ] = md5_hash (traces[ 1 ]. trace , traces[ 1 ]. size * sizeof (uptr) );
458
+ {
459
+ ReadLock lock (&ctx-> racy_mtx );
460
+ if ( FindRacyStacks (hash))
461
+ return true ;
484
462
}
485
- return true ;
463
+ Lock lock (&ctx->racy_mtx );
464
+ if (FindRacyStacks (hash))
465
+ return true ;
466
+ ctx->racy_stacks .PushBack (hash);
467
+ return false ;
486
468
}
487
469
488
- static void AddRacyStacks (ThreadState *thr, VarSizeStackTrace traces[2 ],
489
- uptr addr_min, uptr addr_max) {
490
- Lock lock (&ctx->racy_mtx );
491
- if (flags ()->suppress_equal_stacks ) {
492
- RacyStacks hash;
493
- hash.hash [0 ] = md5_hash (traces[0 ].trace , traces[0 ].size * sizeof (uptr));
494
- hash.hash [1 ] = md5_hash (traces[1 ].trace , traces[1 ].size * sizeof (uptr));
495
- ctx->racy_stacks .PushBack (hash);
470
+ static bool FindRacyAddress (const RacyAddress &ra0) {
471
+ for (uptr i = 0 ; i < ctx->racy_addresses .Size (); i++) {
472
+ RacyAddress ra2 = ctx->racy_addresses [i];
473
+ uptr maxbeg = max (ra0.addr_min , ra2.addr_min );
474
+ uptr minend = min (ra0.addr_max , ra2.addr_max );
475
+ if (maxbeg < minend) {
476
+ VPrintf (2 , " ThreadSanitizer: suppressing report as doubled (addr)\n " );
477
+ return true ;
478
+ }
496
479
}
497
- if (flags ()->suppress_equal_addresses ) {
498
- RacyAddress ra0 = {addr_min, addr_max};
499
- ctx->racy_addresses .PushBack (ra0);
480
+ return false ;
481
+ }
482
+
483
+ static bool HandleRacyAddress (ThreadState *thr, uptr addr_min, uptr addr_max) {
484
+ if (!flags ()->suppress_equal_addresses )
485
+ return false ;
486
+ RacyAddress ra0 = {addr_min, addr_max};
487
+ {
488
+ ReadLock lock (&ctx->racy_mtx );
489
+ if (FindRacyAddress (ra0))
490
+ return true ;
500
491
}
492
+ Lock lock (&ctx->racy_mtx );
493
+ if (FindRacyAddress (ra0))
494
+ return true ;
495
+ ctx->racy_addresses .PushBack (ra0);
496
+ return false ;
501
497
}
502
498
503
499
bool OutputReport (ThreadState *thr, const ScopedReport &srep) {
@@ -618,6 +614,8 @@ void ReportRace(ThreadState *thr) {
618
614
if (IsExpectedReport (addr_min, addr_max - addr_min))
619
615
return ;
620
616
}
617
+ if (HandleRacyAddress (thr, addr_min, addr_max))
618
+ return ;
621
619
622
620
ReportType typ = ReportTypeRace;
623
621
if (thr->is_vptr_access && freed)
@@ -668,7 +666,7 @@ void ReportRace(ThreadState *thr) {
668
666
if (IsFiredSuppression (ctx, typ, traces[1 ]))
669
667
return ;
670
668
671
- if (HandleRacyStacks (thr, traces, addr_min, addr_max ))
669
+ if (HandleRacyStacks (thr, traces))
672
670
return ;
673
671
674
672
// If any of the accesses has a tag, treat this as an "external" race.
@@ -711,7 +709,6 @@ void ReportRace(ThreadState *thr) {
711
709
if (!OutputReport (thr, rep))
712
710
return ;
713
711
714
- AddRacyStacks (thr, traces, addr_min, addr_max);
715
712
}
716
713
717
714
void PrintCurrentStack (ThreadState *thr, uptr pc) {
0 commit comments