Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.h @@ -56,9 +56,11 @@ void Print() const; static bool WillUseFastUnwind(bool request_fast_unwind) { + static_assert(SANITIZER_CAN_FAST_UNWIND || SANITIZER_CAN_SLOW_UNWIND, + "Neither fast nor slow unwinder is supported"); if (!SANITIZER_CAN_FAST_UNWIND) return false; - else if (!SANITIZER_CAN_SLOW_UNWIND) + if (!SANITIZER_CAN_SLOW_UNWIND) return true; return request_fast_unwind; } Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace.cc @@ -70,8 +70,10 @@ void BufferedStackTrace::UnwindFast(uptr pc, uptr bp, uptr stack_top, uptr stack_bottom, u32 max_depth) { - const uptr kPageSize = GetPageSizeCached(); + CHECK_NE(stack_bottom, 0); + CHECK_GT(stack_top, stack_bottom); CHECK_GE(max_depth, 2); + const uptr kPageSize = GetPageSizeCached(); trace_buffer[0] = pc; size = 1; if (stack_top < 4096) return; // Sanity check for stack top. Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_sparc.cc =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_sparc.cc +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_stacktrace_sparc.cc @@ -23,8 +23,10 @@ void BufferedStackTrace::UnwindFast(uptr pc, uptr bp, uptr stack_top, uptr stack_bottom, u32 max_depth) { - const uptr kPageSize = GetPageSizeCached(); + CHECK_NE(stack_bottom, 0); + CHECK_GT(stack_top, stack_bottom); CHECK_GE(max_depth, 2); + const uptr kPageSize = GetPageSizeCached(); trace_buffer[0] = pc; size = 1; if (stack_top < 4096) return; // Sanity check for stack top. Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_markup.cc =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_markup.cc +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_markup.cc @@ -132,9 +132,9 @@ trace_buffer[0] = pc; } -void BufferedStackTrace::UnwindSlow(uptr pc, void *context, - u32 max_depth) { - CHECK_NE(context, nullptr); +void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) { + CHECK(context); + CHECK_GE(max_depth, 2); UNREACHABLE("signal context doesn't exist"); } #endif // SANITIZER_CAN_SLOW_UNWIND Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_linux_libcdep.cc @@ -138,8 +138,8 @@ trace_buffer[0] = pc; } -void BufferedStackTrace::UnwindSlow(uptr pc, void *context, - u32 max_depth) { +void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) { + CHECK(context); CHECK_GE(max_depth, 2); if (!unwind_backtrace_signal_arch) { UnwindSlow(pc, max_depth); Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_win.cc =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_win.cc +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_unwind_win.cc @@ -39,8 +39,9 @@ PopStackFrames(pc_location); } -void BufferedStackTrace::UnwindSlow(uptr pc, void *context, - u32 max_depth) { +void BufferedStackTrace::UnwindSlow(uptr pc, void *context, u32 max_depth) { + CHECK(context); + CHECK_GE(max_depth, 2); CONTEXT ctx = *(CONTEXT *)context; STACKFRAME64 stack_frame; memset(&stack_frame, 0, sizeof(stack_frame));