11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " sanitizer_common/sanitizer_common.h"
14
+ #include " sanitizer_common/sanitizer_internal_defs.h"
14
15
#include " sanitizer_common/sanitizer_libc.h"
15
16
#include " sanitizer_common/sanitizer_placement_new.h"
16
17
#include " sanitizer_common/sanitizer_stackdepot.h"
@@ -187,10 +188,8 @@ void ScopedReportBase::AddMemoryAccess(uptr addr, uptr external_tag, Shadow s,
187
188
mop->size = size;
188
189
mop->write = !(typ & kAccessRead );
189
190
mop->atomic = typ & kAccessAtomic ;
190
- mop->stack = SymbolizeStack (stack);
191
191
mop->external_tag = external_tag;
192
- if (mop->stack )
193
- mop->stack ->suppressable = true ;
192
+ mop->stack_trace = stack;
194
193
for (uptr i = 0 ; i < mset->Size (); i++) {
195
194
MutexSet::Desc d = mset->Get (i);
196
195
int id = this ->AddMutex (d.addr , d.stack_id );
@@ -199,6 +198,56 @@ void ScopedReportBase::AddMemoryAccess(uptr addr, uptr external_tag, Shadow s,
199
198
}
200
199
}
201
200
201
+ void ScopedReportBase::SymbolizeStackElems () {
202
+ // symbolize memory ops
203
+ for (usize i = 0 , size = rep_->mops .Size (); i < size; i++) {
204
+ ReportMop *mop = rep_->mops [i];
205
+ mop->stack = SymbolizeStack (mop->stack_trace );
206
+ if (mop->stack )
207
+ mop->stack ->suppressable = true ;
208
+ }
209
+
210
+ // symbolize locations
211
+ for (usize i = 0 , size = rep_->locs .Size (); i < size; i++) {
212
+ // added locations have a NULL placeholder - don't dereference them
213
+ if (ReportLocation *loc = rep_->locs [i])
214
+ loc->stack = SymbolizeStackId (loc->stack_id );
215
+ }
216
+
217
+ // symbolize any added locations
218
+ for (usize i = 0 , size = rep_->added_location_addrs .Size (); i < size; i++) {
219
+ AddedLocationAddr *added_loc = &rep_->added_location_addrs [i];
220
+ if (ReportLocation *loc = SymbolizeData (added_loc->addr )) {
221
+ loc->suppressable = true ;
222
+ rep_->locs [added_loc->locs_idx ] = loc;
223
+ }
224
+ }
225
+
226
+ // Filter out any added ___location placeholders that could not be symbolized
227
+ usize j = 0 ;
228
+ for (usize i = 0 , size = rep_->locs .Size (); i < size; i++) {
229
+ if (rep_->locs [i] != nullptr ) {
230
+ rep_->locs [j] = rep_->locs [i];
231
+ j++;
232
+ }
233
+ }
234
+ rep_->locs .Resize (j);
235
+
236
+ // symbolize threads
237
+ for (usize i = 0 , size = rep_->threads .Size (); i < size; i++) {
238
+ ReportThread *rt = rep_->threads [i];
239
+ rt->stack = SymbolizeStackId (rt->stack_id );
240
+ if (rt->stack )
241
+ rt->stack ->suppressable = rt->suppressable ;
242
+ }
243
+
244
+ // symbolize mutexes
245
+ for (usize i = 0 , size = rep_->mutexes .Size (); i < size; i++) {
246
+ ReportMutex *rm = rep_->mutexes [i];
247
+ rm->stack = SymbolizeStackId (rm->stack_id );
248
+ }
249
+ }
250
+
202
251
void ScopedReportBase::AddUniqueTid (Tid unique_tid) {
203
252
rep_->unique_tids .PushBack (unique_tid);
204
253
}
@@ -216,10 +265,8 @@ void ScopedReportBase::AddThread(const ThreadContext *tctx, bool suppressable) {
216
265
rt->name = internal_strdup (tctx->name );
217
266
rt->parent_tid = tctx->parent_tid ;
218
267
rt->thread_type = tctx->thread_type ;
219
- rt->stack = 0 ;
220
- rt->stack = SymbolizeStackId (tctx->creation_stack_id );
221
- if (rt->stack )
222
- rt->stack ->suppressable = suppressable;
268
+ rt->stack_id = tctx->creation_stack_id ;
269
+ rt->suppressable = suppressable;
223
270
}
224
271
225
272
#if !SANITIZER_GO
@@ -270,7 +317,7 @@ int ScopedReportBase::AddMutex(uptr addr, StackID creation_stack_id) {
270
317
rep_->mutexes .PushBack (rm);
271
318
rm->id = rep_->mutexes .Size () - 1 ;
272
319
rm->addr = addr;
273
- rm->stack = SymbolizeStackId ( creation_stack_id) ;
320
+ rm->stack_id = creation_stack_id;
274
321
return rm->id ;
275
322
}
276
323
@@ -288,7 +335,7 @@ void ScopedReportBase::AddLocation(uptr addr, uptr size) {
288
335
loc->fd_closed = closed;
289
336
loc->fd = fd;
290
337
loc->tid = creat_tid;
291
- loc->stack = SymbolizeStackId ( creat_stack) ;
338
+ loc->stack_id = creat_stack;
292
339
rep_->locs .PushBack (loc);
293
340
AddThread (creat_tid);
294
341
return ;
@@ -310,7 +357,7 @@ void ScopedReportBase::AddLocation(uptr addr, uptr size) {
310
357
loc->heap_chunk_size = b->siz ;
311
358
loc->external_tag = b->tag ;
312
359
loc->tid = b->tid ;
313
- loc->stack = SymbolizeStackId ( b->stk ) ;
360
+ loc->stack_id = b->stk ;
314
361
rep_->locs .PushBack (loc);
315
362
AddThread (b->tid );
316
363
return ;
@@ -324,11 +371,8 @@ void ScopedReportBase::AddLocation(uptr addr, uptr size) {
324
371
AddThread (tctx);
325
372
}
326
373
#endif
327
- if (ReportLocation *loc = SymbolizeData (addr)) {
328
- loc->suppressable = true ;
329
- rep_->locs .PushBack (loc);
330
- return ;
331
- }
374
+ rep_->added_location_addrs .PushBack ({addr, rep_->locs .Size ()});
375
+ rep_->locs .PushBack (nullptr );
332
376
}
333
377
334
378
#if !SANITIZER_GO
@@ -628,11 +672,12 @@ static bool HandleRacyStacks(ThreadState *thr, VarSizeStackTrace traces[2]) {
628
672
return false ;
629
673
}
630
674
631
- bool OutputReport (ThreadState *thr, const ScopedReport &srep) {
675
+ bool OutputReport (ThreadState *thr, ScopedReport &srep) {
632
676
// These should have been checked in ShouldReport.
633
677
// It's too late to check them here, we have already taken locks.
634
678
CHECK (flags ()->report_bugs );
635
679
CHECK (!thr->suppress_reports );
680
+ srep.SymbolizeStackElems ();
636
681
atomic_store_relaxed (&ctx->last_symbolize_time_ns , NanoTime ());
637
682
const ReportDesc *rep = srep.GetReport ();
638
683
CHECK_EQ (thr->current_report , nullptr );
0 commit comments