[compiler-rt] r251577 - Reapply: [asan] On OS X, log reports to syslog and os_trace

Alexey Samsonov via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 4 17:18:46 PST 2015


This was reverted in r252076. While I'm not exactly sure what caused these
issues on Mac buildbot, I've also observed several self-deadlocks caused by
this change.
Essentially, they are caused by AppendToErrorMessageBuffer function, which
now takes a lock, but can be re-entrant:

* AppendToErrorMessageBuffer is called and takes a lock
* AppendToErrorMessageBuffer tries to allocate error message buffer and
calls MmapOrDie()
* MmapOrDie() fails, because memory limit is exceeded, and calls Report()
to report that
* Report calls AppendToErrorMessageBuffer, which attempts to take a lock,
and hangs.

The same will happen if CHECK() call in AppendToErrorMessageBuffer fails.
Sadly, I can't suggest a good solution for that: probably
you just need to try harder to make sure the function will never be called
recursively: use RAW_CHECK instead of CHECK and
call (some variation of) MmapOrDieQuietly(), which will just call
RawWrite()+Die() on failure.

On Wed, Oct 28, 2015 at 4:18 PM, Anna Zaks via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: zaks
> Date: Wed Oct 28 18:18:44 2015
> New Revision: 251577
>
> URL: http://llvm.org/viewvc/llvm-project?rev=251577&view=rev
> Log:
> Reapply: [asan] On OS X, log reports to syslog and os_trace
>
>         When ASan currently detects a bug, by default it will only print
> out the text
>         of the report to stderr. This patch changes this behavior and
> writes the full
>         text of the report to syslog before we terminate the process. It
> also calls
>         os_trace (Activity Tracing available on OS X and iOS) with a
> message saying
>         that the report is available in syslog. This is useful, because
> this message
>         will be shown in the crash log.
>
>         For this to work, the patch makes sure we store the full report
> into
>         error_message_buffer unconditionally, and it also strips out ANSI
> escape
>         sequences from the report (they are used when producing colored
> reports).
>
>         I've initially tried to log to syslog during printing, which is
> done on Android
>         right now. The advantage is that if we crash during error
> reporting or the
>         produced error does not go through ScopedInErrorReport, we would
> still get a
>         (partial) message in the syslog. However, that solution is very
> problematic on
>         OS X. One issue is that the logging routine uses GCD, which may
> spawn a new
>         thread on its behalf. In many cases, the reporting logic locks
> threadRegistry,
>         which leads to deadlocks.
>
>         Reviewed at http://reviews.llvm.org/D13452
>
>         (In addition, add sanitizer_common_libcdep.cc to buildgo.sh to
> avoid
>          build failures on Linux.)
>
> Modified:
>     compiler-rt/trunk/lib/asan/asan_report.cc
>     compiler-rt/trunk/lib/asan/tests/asan_test_main.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc
>     compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
>     compiler-rt/trunk/lib/tsan/go/buildgo.sh
>     compiler-rt/trunk/test/asan/lit.cfg
>     compiler-rt/trunk/test/ubsan/lit.common.cfg
>
> Modified: compiler-rt/trunk/lib/asan/asan_report.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_report.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_report.cc Wed Oct 28 18:18:44 2015
> @@ -31,6 +31,7 @@ static void (*error_report_callback)(con
>  static char *error_message_buffer = nullptr;
>  static uptr error_message_buffer_pos = 0;
>  static uptr error_message_buffer_size = 0;
> +static BlockingMutex error_message_buf_mutex(LINKER_INITIALIZED);
>
>  struct ReportData {
>    uptr pc;
> @@ -46,16 +47,21 @@ static bool report_happened = false;
>  static ReportData report_data = {};
>
>  void AppendToErrorMessageBuffer(const char *buffer) {
> -  if (error_message_buffer) {
> -    uptr length = internal_strlen(buffer);
> -    CHECK_GE(error_message_buffer_size, error_message_buffer_pos);
> -    uptr remaining = error_message_buffer_size - error_message_buffer_pos;
> -    internal_strncpy(error_message_buffer + error_message_buffer_pos,
> -                     buffer, remaining);
> -    error_message_buffer[error_message_buffer_size - 1] = '\0';
> -    // FIXME: reallocate the buffer instead of truncating the message.
> -    error_message_buffer_pos += Min(remaining, length);
> +  BlockingMutexLock l(&error_message_buf_mutex);
> +  if (!error_message_buffer) {
> +    error_message_buffer_size = 1 << 16;
> +    error_message_buffer =
> +      (char*)MmapOrDie(error_message_buffer_size, __func__);
> +    error_message_buffer_pos = 0;
>    }
> +  uptr length = internal_strlen(buffer);
> +  CHECK_GE(error_message_buffer_size, error_message_buffer_pos);
> +  uptr remaining = error_message_buffer_size - error_message_buffer_pos;
> +  internal_strncpy(error_message_buffer + error_message_buffer_pos,
> +                   buffer, remaining);
> +  error_message_buffer[error_message_buffer_size - 1] = '\0';
> +  // FIXME: reallocate the buffer instead of truncating the message.
> +  error_message_buffer_pos += Min(remaining, length);
>  }
>
>  // ---------------------- Decorator ------------------------------ {{{1
> @@ -664,8 +670,13 @@ class ScopedInErrorReport {
>      // Print memory stats.
>      if (flags()->print_stats)
>        __asan_print_accumulated_stats();
> -    if (error_report_callback) {
> -      error_report_callback(error_message_buffer);
> +    {
> +      BlockingMutexLock l(&error_message_buf_mutex);
> +      LogFullErrorReport(error_message_buffer);
> +
> +      if (error_report_callback) {
> +        error_report_callback(error_message_buffer);
> +      }
>      }
>      Report("ABORTING\n");
>      Die();
> @@ -1061,13 +1072,8 @@ void __asan_report_error(uptr pc, uptr b
>  }
>
>  void NOINLINE __asan_set_error_report_callback(void (*callback)(const
> char*)) {
> +  BlockingMutexLock l(&error_message_buf_mutex);
>    error_report_callback = callback;
> -  if (callback) {
> -    error_message_buffer_size = 1 << 16;
> -    error_message_buffer =
> -        (char*)MmapOrDie(error_message_buffer_size, __func__);
> -    error_message_buffer_pos = 0;
> -  }
>  }
>
>  void __asan_describe_address(uptr addr) {
>
> Modified: compiler-rt/trunk/lib/asan/tests/asan_test_main.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/tests/asan_test_main.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/tests/asan_test_main.cc (original)
> +++ compiler-rt/trunk/lib/asan/tests/asan_test_main.cc Wed Oct 28 18:18:44
> 2015
> @@ -19,7 +19,8 @@ extern "C" const char* __asan_default_op
>  #if SANITIZER_MAC
>    // On Darwin, we default to `abort_on_error=1`, which would make tests
> run
>    // much slower. Let's override this and run lit tests with
> 'abort_on_error=0'.
> -  return "symbolize=false:abort_on_error=0";
> +  // Also, make sure we do not overwhelm the syslog while testing.
> +  return "symbolize=false:abort_on_error=0:log_to_syslog=0";
>  #else
>    return "symbolize=false";
>  #endif
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc Wed Oct 28
> 18:18:44 2015
> @@ -295,6 +295,40 @@ void ReportErrorSummary(const char *erro
>  }
>  #endif
>
> +// Removes the ANSI escape sequences from the input string (in-place).
> +void RemoveANSIEscapeSequencesFromString(char *str) {
> +  if (!str)
> +    return;
> +
> +  // We are going to remove the escape sequences in place.
> +  char *s = str;
> +  char *z = str;
> +  while (*s != '\0') {
> +    CHECK_GE(s, z);
> +    // Skip over ANSI escape sequences with pointer 's'.
> +    if (*s == '\033' && *(s + 1) == '[') {
> +      s = internal_strchrnul(s, 'm');
> +      if (*s == '\0') {
> +        break;
> +      }
> +      s++;
> +      continue;
> +    }
> +    // 's' now points at a character we want to keep. Copy over the buffer
> +    // content if the escape sequence has been perviously skipped
> andadvance
> +    // both pointers.
> +    if (s != z)
> +      *z = *s;
> +
> +    // If we have not seen an escape sequence, just advance both pointers.
> +    z++;
> +    s++;
> +  }
> +
> +  // Null terminate the string.
> +  *z = '\0';
> +}
> +
>  void LoadedModule::set(const char *module_name, uptr base_address) {
>    clear();
>    full_name_ = internal_strdup(module_name);
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Wed Oct 28
> 18:18:44 2015
> @@ -162,6 +162,7 @@ void SetLowLevelAllocateCallback(LowLeve
>  // IO
>  void RawWrite(const char *buffer);
>  bool ColorizeReports();
> +void RemoveANSIEscapeSequencesFromString(char *buffer);
>  void Printf(const char *format, ...);
>  void Report(const char *format, ...);
>  void SetPrintfAndReportCallback(void (*callback)(const char *));
> @@ -648,13 +649,27 @@ enum AndroidApiLevel {
>    ANDROID_POST_LOLLIPOP = 23
>  };
>
> +void WriteToSyslog(const char *buffer);
> +
> +#if SANITIZER_MAC
> +void LogFullErrorReport(const char *error_message_buffer);
> +#else
> +INLINE void LogFullErrorReport(const char *error_message_buffer) {}
> +#endif
> +
> +#if SANITIZER_LINUX || SANITIZER_MAC
> +void WriteOneLineToSyslog(const char *s);
> +#else
> +INLINE void WriteOneLineToSyslog(const char *s) {}
> +#endif
> +
>  #if SANITIZER_LINUX
>  // Initialize Android logging. Any writes before this are silently lost.
>  void AndroidLogInit();
> -void WriteToSyslog(const char *buffer);
> +bool ShouldLogAfterPrintf();
>  #else
>  INLINE void AndroidLogInit() {}
> -INLINE void WriteToSyslog(const char *buffer) {}
> +INLINE bool ShouldLogAfterPrintf() { return false; }
>  #endif
>
>  #if SANITIZER_ANDROID
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_libcdep.cc Wed
> Oct 28 18:18:44 2015
> @@ -12,6 +12,7 @@
>
>  //===----------------------------------------------------------------------===//
>
>  #include "sanitizer_common.h"
> +#include "sanitizer_allocator_internal.h"
>  #include "sanitizer_flags.h"
>  #include "sanitizer_stackdepot.h"
>  #include "sanitizer_stacktrace.h"
> @@ -46,6 +47,7 @@ void SetSandboxingCallback(void (*f)())
>  }
>
>  void ReportErrorSummary(const char *error_type, StackTrace *stack) {
> +#if !SANITIZER_GO
>    if (!common_flags()->print_summary)
>      return;
>    if (stack->size == 0) {
> @@ -58,6 +60,7 @@ void ReportErrorSummary(const char *erro
>    SymbolizedStack *frame = Symbolizer::GetOrInit()->SymbolizePC(pc);
>    ReportErrorSummary(error_type, frame->info);
>    frame->ClearAll();
> +#endif
>  }
>
>  static void (*SoftRssLimitExceededCallback)(bool exceeded);
> @@ -116,8 +119,30 @@ void BackgroundThread(void *arg) {
>    }
>  }
>
> +void WriteToSyslog(const char *buffer) {
> +  char *copy = internal_strdup(buffer);
> +  char *p = copy;
> +  char *q;
> +
> +  // Remove color sequences since syslogs cannot print them.
> +  RemoveANSIEscapeSequencesFromString(copy);
> +
> +  // Print one line at a time.
> +  // syslog, at least on Android, has an implicit message length limit.
> +  do {
> +    q = internal_strchr(p, '\n');
> +    if (q)
> +      *q = '\0';
> +    WriteOneLineToSyslog(p);
> +    if (q)
> +      p = q + 1;
> +  } while (q);
> +  InternalFree(copy);
> +}
> +
>  void MaybeStartBackgroudThread() {
> -#if SANITIZER_LINUX  // Need to implement/test on other platforms.
> +#if SANITIZER_LINUX && \
> +    !SANITIZER_GO  // Need to implement/test on other platforms.
>    // Start the background thread if one of the rss limits is given.
>    if (!common_flags()->hard_rss_limit_mb &&
>        !common_flags()->soft_rss_limit_mb) return;
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_nolibc.cc Wed
> Oct 28 18:18:44 2015
> @@ -18,9 +18,9 @@
>  namespace __sanitizer {
>
>  #if SANITIZER_LINUX
> -void WriteToSyslog(const char *buffer) {}
> +bool ShouldLogAfterPrintf() { return false; }
>  #endif
> -
> +void WriteToSyslog(const char *buffer) {}
>  void Abort() { internal__exit(1); }
>
>  }  // namespace __sanitizer
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.inc Wed Oct 28
> 18:18:44 2015
> @@ -56,7 +56,7 @@ COMMON_FLAG(
>      "Mention name of executable when reporting error and "
>      "append executable name to logs (as in \"log_path.exe_name.pid\").")
>  COMMON_FLAG(
> -    bool, log_to_syslog, SANITIZER_ANDROID,
> +    bool, log_to_syslog, SANITIZER_ANDROID || SANITIZER_MAC,
>      "Write all sanitizer output to syslog in addition to other means of "
>      "logging.")
>  COMMON_FLAG(
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc Wed
> Oct 28 18:18:44 2015
> @@ -548,16 +548,16 @@ void AndroidLogInit() {
>    atomic_store(&android_log_initialized, 1, memory_order_release);
>  }
>
> -static bool IsSyslogAvailable() {
> +bool ShouldLogAfterPrintf() {
>    return atomic_load(&android_log_initialized, memory_order_acquire);
>  }
>  #else
>  void AndroidLogInit() {}
>
> -static bool IsSyslogAvailable() { return true; }
> +bool ShouldLogAfterPrintf() { return true; }
>  #endif  // SANITIZER_ANDROID
>
> -static void WriteOneLineToSyslog(const char *s) {
> +void WriteOneLineToSyslog(const char *s) {
>  #if SANITIZER_ANDROID &&__ANDROID_API__ < 21
>    __android_log_write(ANDROID_LOG_INFO, NULL, s);
>  #else
> @@ -565,24 +565,6 @@ static void WriteOneLineToSyslog(const c
>  #endif
>  }
>
> -void WriteToSyslog(const char *buffer) {
> -  if (!IsSyslogAvailable())
> -    return;
> -  char *copy = internal_strdup(buffer);
> -  char *p = copy;
> -  char *q;
> -  // syslog, at least on Android, has an implicit message length limit.
> -  // Print one line at a time.
> -  do {
> -    q = internal_strchr(p, '\n');
> -    if (q)
> -      *q = '\0';
> -    WriteOneLineToSyslog(p);
> -    if (q)
> -      p = q + 1;
> -  } while (q);
> -  InternalFree(copy);
> -}
>  #endif // SANITIZER_LINUX
>
>  } // namespace __sanitizer
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Wed Oct 28
> 18:18:44 2015
> @@ -36,12 +36,14 @@
>  extern char **environ;
>  #endif
>
> +#include <asl.h>
>  #include <errno.h>
>  #include <fcntl.h>
>  #include <libkern/OSAtomic.h>
>  #include <mach-o/dyld.h>
>  #include <mach/mach.h>
>  #include <mach/vm_statistics.h>
> +#include <os/trace.h>
>  #include <pthread.h>
>  #include <sched.h>
>  #include <signal.h>
> @@ -371,6 +373,45 @@ uptr GetRSS() {
>    return info.resident_size;
>  }
>
> +static BlockingMutex syslog_lock(LINKER_INITIALIZED);
> +
> +void WriteOneLineToSyslog(const char *s) {
> +  syslog_lock.CheckLocked();
> +  asl_log(nullptr, nullptr, ASL_LEVEL_ERR, "%s", s);
> +}
> +
> +void LogFullErrorReport(const char *buffer) {
> +  // Log with os_trace. This will make it into the crash log.
> +  if (GetMacosVersion() >= MACOS_VERSION_MAVERICKS) {
> +    // os_trace requires the message (format parameter) to be a string
> literal.
> +    if (internal_strncmp(SanitizerToolName, "AddressSanitizer",
> +                         sizeof("AddressSanitizer") - 1) == 0)
> +      os_trace("Address Sanitizer reported a failure.");
> +    else if (internal_strncmp(SanitizerToolName,
> "UndefinedBehaviorSanitizer",
> +                              sizeof("UndefinedBehaviorSanitizer") - 1)
> == 0)
> +      os_trace("Undefined Behavior Sanitizer reported a failure.");
> +    else if (internal_strncmp(SanitizerToolName, "ThreadSanitizer",
> +                              sizeof("ThreadSanitizer") - 1) == 0)
> +      os_trace("Thread Sanitizer reported a failure.");
> +    else
> +      os_trace("Sanitizer tool reported a failure.");
> +
> +    if (common_flags()->log_to_syslog)
> +      os_trace("Consult syslog for more information.");
> +  }
> +
> +  // Log to syslog.
> +  // The logging on OS X may call pthread_create so we need the threading
> +  // environment to be fully initialized. Also, this should never be
> called when
> +  // holding the thread registry lock since that may result in a
> deadlock. If
> +  // the reporting thread holds the thread registry mutex, and asl_log
> waits
> +  // for GCD to dispatch a new thread, the process will deadlock, because
> the
> +  // pthread_create wrapper needs to acquire the lock as well.
> +  BlockingMutexLock l(&syslog_lock);
> +  if (common_flags()->log_to_syslog)
> +    WriteToSyslog(buffer);
> +}
> +
>  void *internal_start_thread(void (*func)(void *arg), void *arg) { return
> 0; }
>  void internal_join_thread(void *th) { }
>
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc Wed Oct 28
> 18:18:44 2015
> @@ -278,7 +278,7 @@ static void SharedPrintfCode(bool append
>  #   undef CHECK_NEEDED_LENGTH
>    }
>    RawWrite(buffer);
> -  if (common_flags()->log_to_syslog)
> +  if (common_flags()->log_to_syslog && ShouldLogAfterPrintf())
>      WriteToSyslog(buffer);
>    CallPrintfAndReportCallback(buffer);
>    // If we had mapped any memory, clean up.
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
> Wed Oct 28 18:18:44 2015
> @@ -208,6 +208,30 @@ TEST(SanitizerCommon, StripPathPrefix) {
>    EXPECT_STREQ("file.h", StripPathPrefix("/usr/lib/./file.h",
> "/usr/lib/"));
>  }
>
> +TEST(SanitizerCommon, RemoveANSIEscapeSequencesFromString) {
> +  RemoveANSIEscapeSequencesFromString(nullptr);
> +  const char *buffs[22] = {
> +    "Default",                                "Default",
> +    "\033[95mLight magenta",                  "Light magenta",
> +    "\033[30mBlack\033[32mGreen\033[90mGray", "BlackGreenGray",
> +    "\033[106mLight cyan \033[107mWhite ",    "Light cyan White ",
> +    "\033[31mHello\033[0m World",             "Hello World",
> +    "\033[38;5;82mHello \033[38;5;198mWorld", "Hello World",
> +    "123[653456789012",                       "123[653456789012",
> +    "Normal \033[5mBlink \033[25mNormal",     "Normal Blink Normal",
> +    "\033[106m\033[107m",                     "",
> +    "",                                       "",
> +    " ",                                      " ",
> +  };
> +
> +  for (size_t i = 0; i < ARRAY_SIZE(buffs); i+=2) {
> +    char *buffer_copy = internal_strdup(buffs[i]);
> +    RemoveANSIEscapeSequencesFromString(buffer_copy);
> +    EXPECT_STREQ(buffer_copy, buffs[i+1]);
> +    InternalFree(buffer_copy);
> +  }
> +}
> +
>  TEST(SanitizerCommon, InternalScopedString) {
>    InternalScopedString str(10);
>    EXPECT_EQ(0U, str.length());
>
> Modified: compiler-rt/trunk/lib/tsan/go/buildgo.sh
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/go/buildgo.sh?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/go/buildgo.sh (original)
> +++ compiler-rt/trunk/lib/tsan/go/buildgo.sh Wed Oct 28 18:18:44 2015
> @@ -20,6 +20,7 @@ SRCS="
>         ../rtl/tsan_sync.cc
>         ../../sanitizer_common/sanitizer_allocator.cc
>         ../../sanitizer_common/sanitizer_common.cc
> +       ../../sanitizer_common/sanitizer_common_libcdep.cc
>         ../../sanitizer_common/sanitizer_deadlock_detector2.cc
>         ../../sanitizer_common/sanitizer_flag_parser.cc
>         ../../sanitizer_common/sanitizer_flags.cc
>
> Modified: compiler-rt/trunk/test/asan/lit.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/lit.cfg?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/asan/lit.cfg (original)
> +++ compiler-rt/trunk/test/asan/lit.cfg Wed Oct 28 18:18:44 2015
> @@ -34,7 +34,9 @@ default_asan_opts = ''
>  if config.host_os == 'Darwin':
>    # On Darwin, we default to `abort_on_error=1`, which would make tests
> run
>    # much slower. Let's override this and run lit tests with
> 'abort_on_error=0'.
> +  # Also, make sure we do not overwhelm the syslog while testing.
>    default_asan_opts = 'abort_on_error=0'
> +  default_asan_opts += ':log_to_syslog=0'
>  if default_asan_opts:
>    config.environment['ASAN_OPTIONS'] = default_asan_opts
>    default_asan_opts += ':'
>
> Modified: compiler-rt/trunk/test/ubsan/lit.common.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/lit.common.cfg?rev=251577&r1=251576&r2=251577&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/ubsan/lit.common.cfg (original)
> +++ compiler-rt/trunk/test/ubsan/lit.common.cfg Wed Oct 28 18:18:44 2015
> @@ -42,6 +42,7 @@ if config.host_os == 'Darwin':
>    # On Darwin, we default to `abort_on_error=1`, which would make tests
> run
>    # much slower. Let's override this and run lit tests with
> 'abort_on_error=0'.
>    default_ubsan_opts += ['abort_on_error=0']
> +  default_ubsan_opts += ['log_to_syslog=0']
>  default_ubsan_opts_str = ':'.join(default_ubsan_opts)
>  if default_ubsan_opts_str:
>    config.environment['UBSAN_OPTIONS'] = default_ubsan_opts_str
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151104/3266a071/attachment.html>


More information about the llvm-commits mailing list