mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-13 13:45:16 +00:00
Revert "[asan] On OS X, log reports to syslog and os_trace"
This reverts commit 251447. (Which caused failures on a Linux bot.) llvm-svn: 251467
This commit is contained in:
parent
6c583b8b25
commit
55fbb6d7f5
@ -31,7 +31,6 @@ static void (*error_report_callback)(const char*);
|
|||||||
static char *error_message_buffer = nullptr;
|
static char *error_message_buffer = nullptr;
|
||||||
static uptr error_message_buffer_pos = 0;
|
static uptr error_message_buffer_pos = 0;
|
||||||
static uptr error_message_buffer_size = 0;
|
static uptr error_message_buffer_size = 0;
|
||||||
static BlockingMutex error_message_buf_mutex(LINKER_INITIALIZED);
|
|
||||||
|
|
||||||
struct ReportData {
|
struct ReportData {
|
||||||
uptr pc;
|
uptr pc;
|
||||||
@ -47,21 +46,16 @@ static bool report_happened = false;
|
|||||||
static ReportData report_data = {};
|
static ReportData report_data = {};
|
||||||
|
|
||||||
void AppendToErrorMessageBuffer(const char *buffer) {
|
void AppendToErrorMessageBuffer(const char *buffer) {
|
||||||
BlockingMutexLock l(&error_message_buf_mutex);
|
if (error_message_buffer) {
|
||||||
if (!error_message_buffer) {
|
uptr length = internal_strlen(buffer);
|
||||||
error_message_buffer_size = 1 << 16;
|
CHECK_GE(error_message_buffer_size, error_message_buffer_pos);
|
||||||
error_message_buffer =
|
uptr remaining = error_message_buffer_size - error_message_buffer_pos;
|
||||||
(char*)MmapOrDie(error_message_buffer_size, __func__);
|
internal_strncpy(error_message_buffer + error_message_buffer_pos,
|
||||||
error_message_buffer_pos = 0;
|
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);
|
||||||
}
|
}
|
||||||
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
|
// ---------------------- Decorator ------------------------------ {{{1
|
||||||
@ -670,13 +664,8 @@ class ScopedInErrorReport {
|
|||||||
// Print memory stats.
|
// Print memory stats.
|
||||||
if (flags()->print_stats)
|
if (flags()->print_stats)
|
||||||
__asan_print_accumulated_stats();
|
__asan_print_accumulated_stats();
|
||||||
{
|
if (error_report_callback) {
|
||||||
BlockingMutexLock l(&error_message_buf_mutex);
|
error_report_callback(error_message_buffer);
|
||||||
LogFullErrorReport(error_message_buffer);
|
|
||||||
|
|
||||||
if (error_report_callback) {
|
|
||||||
error_report_callback(error_message_buffer);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Report("ABORTING\n");
|
Report("ABORTING\n");
|
||||||
Die();
|
Die();
|
||||||
@ -1072,8 +1061,13 @@ void __asan_report_error(uptr pc, uptr bp, uptr sp, uptr addr, int is_write,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NOINLINE __asan_set_error_report_callback(void (*callback)(const char*)) {
|
void NOINLINE __asan_set_error_report_callback(void (*callback)(const char*)) {
|
||||||
BlockingMutexLock l(&error_message_buf_mutex);
|
|
||||||
error_report_callback = callback;
|
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) {
|
void __asan_describe_address(uptr addr) {
|
||||||
|
@ -19,8 +19,7 @@ extern "C" const char* __asan_default_options() {
|
|||||||
#if SANITIZER_MAC
|
#if SANITIZER_MAC
|
||||||
// On Darwin, we default to `abort_on_error=1`, which would make tests run
|
// 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'.
|
// 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.
|
return "symbolize=false:abort_on_error=0";
|
||||||
return "symbolize=false:abort_on_error=0:log_to_syslog=0";
|
|
||||||
#else
|
#else
|
||||||
return "symbolize=false";
|
return "symbolize=false";
|
||||||
#endif
|
#endif
|
||||||
|
@ -295,40 +295,6 @@ void ReportErrorSummary(const char *error_type, const AddressInfo &info) {
|
|||||||
}
|
}
|
||||||
#endif
|
#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) {
|
void LoadedModule::set(const char *module_name, uptr base_address) {
|
||||||
clear();
|
clear();
|
||||||
full_name_ = internal_strdup(module_name);
|
full_name_ = internal_strdup(module_name);
|
||||||
|
@ -162,7 +162,6 @@ void SetLowLevelAllocateCallback(LowLevelAllocateCallback callback);
|
|||||||
// IO
|
// IO
|
||||||
void RawWrite(const char *buffer);
|
void RawWrite(const char *buffer);
|
||||||
bool ColorizeReports();
|
bool ColorizeReports();
|
||||||
void RemoveANSIEscapeSequencesFromString(char *buffer);
|
|
||||||
void Printf(const char *format, ...);
|
void Printf(const char *format, ...);
|
||||||
void Report(const char *format, ...);
|
void Report(const char *format, ...);
|
||||||
void SetPrintfAndReportCallback(void (*callback)(const char *));
|
void SetPrintfAndReportCallback(void (*callback)(const char *));
|
||||||
@ -649,27 +648,13 @@ enum AndroidApiLevel {
|
|||||||
ANDROID_POST_LOLLIPOP = 23
|
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
|
#if SANITIZER_LINUX
|
||||||
// Initialize Android logging. Any writes before this are silently lost.
|
// Initialize Android logging. Any writes before this are silently lost.
|
||||||
void AndroidLogInit();
|
void AndroidLogInit();
|
||||||
bool ShouldLogAfterPrintf();
|
void WriteToSyslog(const char *buffer);
|
||||||
#else
|
#else
|
||||||
INLINE void AndroidLogInit() {}
|
INLINE void AndroidLogInit() {}
|
||||||
INLINE bool ShouldLogAfterPrintf() { return false; }
|
INLINE void WriteToSyslog(const char *buffer) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SANITIZER_ANDROID
|
#if SANITIZER_ANDROID
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "sanitizer_common.h"
|
#include "sanitizer_common.h"
|
||||||
#include "sanitizer_allocator_internal.h"
|
|
||||||
#include "sanitizer_flags.h"
|
#include "sanitizer_flags.h"
|
||||||
#include "sanitizer_stackdepot.h"
|
#include "sanitizer_stackdepot.h"
|
||||||
#include "sanitizer_stacktrace.h"
|
#include "sanitizer_stacktrace.h"
|
||||||
@ -117,27 +116,6 @@ 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() {
|
void MaybeStartBackgroudThread() {
|
||||||
#if SANITIZER_LINUX // Need to implement/test on other platforms.
|
#if SANITIZER_LINUX // Need to implement/test on other platforms.
|
||||||
// Start the background thread if one of the rss limits is given.
|
// Start the background thread if one of the rss limits is given.
|
||||||
|
@ -56,7 +56,7 @@ COMMON_FLAG(
|
|||||||
"Mention name of executable when reporting error and "
|
"Mention name of executable when reporting error and "
|
||||||
"append executable name to logs (as in \"log_path.exe_name.pid\").")
|
"append executable name to logs (as in \"log_path.exe_name.pid\").")
|
||||||
COMMON_FLAG(
|
COMMON_FLAG(
|
||||||
bool, log_to_syslog, SANITIZER_ANDROID || SANITIZER_MAC,
|
bool, log_to_syslog, SANITIZER_ANDROID,
|
||||||
"Write all sanitizer output to syslog in addition to other means of "
|
"Write all sanitizer output to syslog in addition to other means of "
|
||||||
"logging.")
|
"logging.")
|
||||||
COMMON_FLAG(
|
COMMON_FLAG(
|
||||||
|
@ -548,16 +548,16 @@ void AndroidLogInit() {
|
|||||||
atomic_store(&android_log_initialized, 1, memory_order_release);
|
atomic_store(&android_log_initialized, 1, memory_order_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShouldLogAfterPrintf() {
|
static bool IsSyslogAvailable() {
|
||||||
return atomic_load(&android_log_initialized, memory_order_acquire);
|
return atomic_load(&android_log_initialized, memory_order_acquire);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void AndroidLogInit() {}
|
void AndroidLogInit() {}
|
||||||
|
|
||||||
bool ShouldLogAfterPrintf() { return true; }
|
static bool IsSyslogAvailable() { return true; }
|
||||||
#endif // SANITIZER_ANDROID
|
#endif // SANITIZER_ANDROID
|
||||||
|
|
||||||
void WriteOneLineToSyslog(const char *s) {
|
static void WriteOneLineToSyslog(const char *s) {
|
||||||
#if SANITIZER_ANDROID &&__ANDROID_API__ < 21
|
#if SANITIZER_ANDROID &&__ANDROID_API__ < 21
|
||||||
__android_log_write(ANDROID_LOG_INFO, NULL, s);
|
__android_log_write(ANDROID_LOG_INFO, NULL, s);
|
||||||
#else
|
#else
|
||||||
@ -565,6 +565,24 @@ void WriteOneLineToSyslog(const char *s) {
|
|||||||
#endif
|
#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
|
#endif // SANITIZER_LINUX
|
||||||
|
|
||||||
} // namespace __sanitizer
|
} // namespace __sanitizer
|
||||||
|
@ -36,14 +36,12 @@
|
|||||||
extern char **environ;
|
extern char **environ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <asl.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <libkern/OSAtomic.h>
|
#include <libkern/OSAtomic.h>
|
||||||
#include <mach-o/dyld.h>
|
#include <mach-o/dyld.h>
|
||||||
#include <mach/mach.h>
|
#include <mach/mach.h>
|
||||||
#include <mach/vm_statistics.h>
|
#include <mach/vm_statistics.h>
|
||||||
#include <os/trace.h>
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
@ -373,45 +371,6 @@ uptr GetRSS() {
|
|||||||
return info.resident_size;
|
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_start_thread(void (*func)(void *arg), void *arg) { return 0; }
|
||||||
void internal_join_thread(void *th) { }
|
void internal_join_thread(void *th) { }
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ static void SharedPrintfCode(bool append_pid, const char *format,
|
|||||||
# undef CHECK_NEEDED_LENGTH
|
# undef CHECK_NEEDED_LENGTH
|
||||||
}
|
}
|
||||||
RawWrite(buffer);
|
RawWrite(buffer);
|
||||||
if (common_flags()->log_to_syslog && ShouldLogAfterPrintf())
|
if (common_flags()->log_to_syslog)
|
||||||
WriteToSyslog(buffer);
|
WriteToSyslog(buffer);
|
||||||
CallPrintfAndReportCallback(buffer);
|
CallPrintfAndReportCallback(buffer);
|
||||||
// If we had mapped any memory, clean up.
|
// If we had mapped any memory, clean up.
|
||||||
|
@ -208,30 +208,6 @@ TEST(SanitizerCommon, StripPathPrefix) {
|
|||||||
EXPECT_STREQ("file.h", StripPathPrefix("/usr/lib/./file.h", "/usr/lib/"));
|
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) {
|
TEST(SanitizerCommon, InternalScopedString) {
|
||||||
InternalScopedString str(10);
|
InternalScopedString str(10);
|
||||||
EXPECT_EQ(0U, str.length());
|
EXPECT_EQ(0U, str.length());
|
||||||
|
@ -34,9 +34,7 @@ default_asan_opts = ''
|
|||||||
if config.host_os == 'Darwin':
|
if config.host_os == 'Darwin':
|
||||||
# On Darwin, we default to `abort_on_error=1`, which would make tests run
|
# 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'.
|
# 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 = 'abort_on_error=0'
|
||||||
default_asan_opts += ':log_to_syslog=0'
|
|
||||||
if default_asan_opts:
|
if default_asan_opts:
|
||||||
config.environment['ASAN_OPTIONS'] = default_asan_opts
|
config.environment['ASAN_OPTIONS'] = default_asan_opts
|
||||||
default_asan_opts += ':'
|
default_asan_opts += ':'
|
||||||
|
@ -42,7 +42,6 @@ if config.host_os == 'Darwin':
|
|||||||
# On Darwin, we default to `abort_on_error=1`, which would make tests run
|
# 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'.
|
# 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 += ['abort_on_error=0']
|
||||||
default_ubsan_opts += ['log_to_syslog=0']
|
|
||||||
default_ubsan_opts_str = ':'.join(default_ubsan_opts)
|
default_ubsan_opts_str = ':'.join(default_ubsan_opts)
|
||||||
if default_ubsan_opts_str:
|
if default_ubsan_opts_str:
|
||||||
config.environment['UBSAN_OPTIONS'] = default_ubsan_opts_str
|
config.environment['UBSAN_OPTIONS'] = default_ubsan_opts_str
|
||||||
|
Loading…
x
Reference in New Issue
Block a user