forked from OSchip/llvm-project
[asan] Fix comparison in BufferedStackTrace::LocatePcInTrace
Summary: Debug builds can have larger distance between stack trace and PC on that stack. If we assume that PC is always correct we can snap it to the nearest trace. Reviewers: eugenis Subscribers: llvm-commits, kubabrecka Differential Revision: https://reviews.llvm.org/D28342 llvm-svn: 291173
This commit is contained in:
parent
83963995c6
commit
006aaaf59c
|
@ -106,10 +106,6 @@ void BufferedStackTrace::FastUnwindStack(uptr pc, uptr bp, uptr stack_top,
|
|||
}
|
||||
}
|
||||
|
||||
static bool MatchPc(uptr cur_pc, uptr trace_pc, uptr threshold) {
|
||||
return cur_pc - trace_pc <= threshold || trace_pc - cur_pc <= threshold;
|
||||
}
|
||||
|
||||
void BufferedStackTrace::PopStackFrames(uptr count) {
|
||||
CHECK_LT(count, size);
|
||||
size -= count;
|
||||
|
@ -118,15 +114,14 @@ void BufferedStackTrace::PopStackFrames(uptr count) {
|
|||
}
|
||||
}
|
||||
|
||||
static uptr Distance(uptr a, uptr b) { return a < b ? b - a : a - b; }
|
||||
|
||||
uptr BufferedStackTrace::LocatePcInTrace(uptr pc) {
|
||||
// Use threshold to find PC in stack trace, as PC we want to unwind from may
|
||||
// slightly differ from return address in the actual unwinded stack trace.
|
||||
const int kPcThreshold = 350;
|
||||
for (uptr i = 0; i < size; ++i) {
|
||||
if (MatchPc(pc, trace[i], kPcThreshold))
|
||||
return i;
|
||||
uptr best = 0;
|
||||
for (uptr i = 1; i < size; ++i) {
|
||||
if (Distance(trace[i], pc) < Distance(trace[best], pc)) best = i;
|
||||
}
|
||||
return 0;
|
||||
return best;
|
||||
}
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
|
Loading…
Reference in New Issue