
Summary: Following up on and complementing D44404 and other sanitizer allocators. Currently many allocator specific errors (OOM, for example) are reported as a text message and CHECK(0) termination, no stack, no details, not too helpful nor informative. To improve the situation, detailed and structured common errors were defined and reported under the appropriate conditions. Common tests were generalized a bit to cover a slightly different TSan stack reporting format, extended to verify errno value and returned pointer value check is now explicit to facilitate debugging. Reviewers: dvyukov Subscribers: srhines, kubamracek, delcypher, #sanitizers, llvm-commits Differential Revision: https://reviews.llvm.org/D48087 llvm-svn: 334975
52 lines
1.5 KiB
C++
52 lines
1.5 KiB
C++
//===-- tsan_stack_trace.cc -----------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is a part of ThreadSanitizer (TSan), a race detector.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "tsan_stack_trace.h"
|
|
#include "tsan_rtl.h"
|
|
#include "tsan_mman.h"
|
|
|
|
namespace __tsan {
|
|
|
|
VarSizeStackTrace::VarSizeStackTrace()
|
|
: StackTrace(nullptr, 0), trace_buffer(nullptr) {}
|
|
|
|
VarSizeStackTrace::~VarSizeStackTrace() {
|
|
ResizeBuffer(0);
|
|
}
|
|
|
|
void VarSizeStackTrace::ResizeBuffer(uptr new_size) {
|
|
if (trace_buffer) {
|
|
internal_free(trace_buffer);
|
|
}
|
|
trace_buffer =
|
|
(new_size > 0)
|
|
? (uptr *)internal_alloc(MBlockStackTrace,
|
|
new_size * sizeof(trace_buffer[0]))
|
|
: nullptr;
|
|
trace = trace_buffer;
|
|
size = new_size;
|
|
}
|
|
|
|
void VarSizeStackTrace::Init(const uptr *pcs, uptr cnt, uptr extra_top_pc) {
|
|
ResizeBuffer(cnt + !!extra_top_pc);
|
|
internal_memcpy(trace_buffer, pcs, cnt * sizeof(trace_buffer[0]));
|
|
if (extra_top_pc)
|
|
trace_buffer[cnt] = extra_top_pc;
|
|
}
|
|
|
|
void VarSizeStackTrace::ReverseOrder() {
|
|
for (u32 i = 0; i < (size >> 1); i++)
|
|
Swap(trace_buffer[i], trace_buffer[size - 1 - i]);
|
|
}
|
|
|
|
} // namespace __tsan
|