@@ -207,55 +207,30 @@ void ScopedReportBase::SymbolizeStackElems() {
207207 mop->stack ->suppressable = true ;
208208 }
209209
210- Vector<ReportLocation *> locs_tmp;
211-
212- // Repopulate the locations in the order they were added - take care with
213- // the added locations
214- usize locs_idx = 0 ;
215- for (usize i = 0 ; i < rep_->added_location_addrs .Size (); i++) {
216- AddedLocationAddr *added_loc_addr = &rep_->added_location_addrs [i];
217-
218- for (; locs_idx < added_loc_addr->locs_idx ; locs_idx++) {
219- ReportLocation *loc = rep_->locs [locs_idx];
220- loc->stack = SymbolizeStackId (loc->stack_id );
221- locs_tmp.PushBack (loc);
222- }
223-
224- if (ReportLocation *added_loc = SymbolizeData (added_loc_addr->addr )) {
225- added_loc->suppressable = true ;
226- locs_tmp.PushBack (added_loc);
227- }
228- }
229-
230- // Append any remaining locations
231- for (; locs_idx < rep_->locs .Size (); locs_idx++) {
232- ReportLocation *loc = rep_->locs [locs_idx];
233- loc->stack = SymbolizeStackId (loc->stack_id );
234- locs_tmp.PushBack (loc);
235- }
236-
237- rep_->locs .Reset ();
238- for (usize i = 0 ; i < locs_tmp.Size (); i++) rep_->locs .PushBack (locs_tmp[i]);
239-
240210 // symbolize locations
241211 for (usize i = 0 ; i < rep_->locs .Size (); i++) {
242- ReportLocation *loc = rep_->locs [i];
243- loc->stack = SymbolizeStackId (loc->stack_id );
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 );
244215 }
245216
246- usize offset = 0 ;
217+ // symbolize any added locations
247218 for (usize i = 0 ; i < rep_->added_location_addrs .Size (); i++) {
248- struct AddedLocationAddr *added_loc = &rep_->added_location_addrs [i];
219+ AddedLocationAddr *added_loc = &rep_->added_location_addrs [i];
249220 if (ReportLocation *loc = SymbolizeData (added_loc->addr )) {
250- offset++;
251221 loc->suppressable = true ;
252222 rep_->locs [added_loc->locs_idx ] = loc;
253223 }
254224 }
255225
256- // Check that all locs are populated (no-op in release)
226+ // Filter out any added location placeholders that could not be symbolized
227+ Vector<ReportLocation *> filtered_locs;
257228 for (usize i = 0 ; i < rep_->locs .Size (); i++)
258- CHECK_NE (rep_->locs [i], nullptr );
229+ if (rep_->locs [i] != nullptr )
230+ filtered_locs.PushBack (rep_->locs [i]);
231+ rep_->locs .Resize (filtered_locs.Size ());
232+ for (usize i = 0 ; i < filtered_locs.Size (); i++)
233+ rep_->locs [i] = (filtered_locs[i]);
259234
260235 // symbolize threads
261236 for (usize i = 0 ; i < rep_->threads .Size (); i++) {
@@ -396,6 +371,7 @@ void ScopedReportBase::AddLocation(uptr addr, uptr size) {
396371 }
397372#endif
398373 rep_->added_location_addrs .PushBack ({addr, rep_->locs .Size ()});
374+ rep_->locs .PushBack (nullptr );
399375}
400376
401377#if !SANITIZER_GO
0 commit comments