| //===-- sanitizer_common_libcdep.cc ---------------------------------------===// |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is shared between AddressSanitizer and ThreadSanitizer |
| // run-time libraries. |
| //===----------------------------------------------------------------------===// |
| |
| #include "sanitizer_common.h" |
| #include "sanitizer_flags.h" |
| #include "sanitizer_stacktrace.h" |
| #include "sanitizer_symbolizer.h" |
| |
| namespace __sanitizer { |
| |
| bool PrintsToTty() { |
| MaybeOpenReportFile(); |
| return internal_isatty(report_fd) != 0; |
| } |
| |
| bool PrintsToTtyCached() { |
| // FIXME: Add proper Windows support to AnsiColorDecorator and re-enable color |
| // printing on Windows. |
| if (SANITIZER_WINDOWS) |
| return 0; |
| |
| static int cached = 0; |
| static bool prints_to_tty; |
| if (!cached) { // Not thread-safe. |
| prints_to_tty = PrintsToTty(); |
| cached = 1; |
| } |
| return prints_to_tty; |
| } |
| |
| bool ColorizeReports() { |
| const char *flag = common_flags()->color; |
| return internal_strcmp(flag, "always") == 0 || |
| (internal_strcmp(flag, "auto") == 0 && PrintsToTtyCached()); |
| } |
| |
| static void (*sandboxing_callback)(); |
| void SetSandboxingCallback(void (*f)()) { |
| sandboxing_callback = f; |
| } |
| |
| void ReportErrorSummary(const char *error_type, StackTrace *stack) { |
| if (!common_flags()->print_summary) |
| return; |
| AddressInfo ai; |
| #if !SANITIZER_GO |
| if (stack->size > 0 && Symbolizer::GetOrInit()->CanReturnFileLineInfo()) { |
| // Currently, we include the first stack frame into the report summary. |
| // Maybe sometimes we need to choose another frame (e.g. skip memcpy/etc). |
| uptr pc = StackTrace::GetPreviousInstructionPc(stack->trace[0]); |
| Symbolizer::GetOrInit()->SymbolizePC(pc, &ai, 1); |
| } |
| #endif |
| ReportErrorSummary(error_type, ai.file, ai.line, ai.function); |
| } |
| |
| } // namespace __sanitizer |
| |
| void NOINLINE |
| __sanitizer_sandbox_on_notify(__sanitizer_sandbox_arguments *args) { |
| PrepareForSandboxing(args); |
| if (sandboxing_callback) |
| sandboxing_callback(); |
| } |