[compiler-rt] r221896 - [ASan] Add process basename to log name and error message to simplify analysis of sanitized systems logs.
David Blaikie
dblaikie at gmail.com
Thu Nov 13 09:21:43 PST 2014
On Thu, Nov 13, 2014 at 8:01 AM, Yury Gribov <y.gribov at samsung.com> wrote:
> Author: ygribov
> Date: Thu Nov 13 10:01:23 2014
> New Revision: 221896
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221896&view=rev
> Log:
> [ASan] Add process basename to log name and error message to simplify
> analysis of sanitized systems logs.
>
> Reviewed at http://reviews.llvm.org/D5724
>
> Modified:
> compiler-rt/trunk/lib/asan/asan_report.cc
> compiler-rt/trunk/lib/msan/msan_interceptors.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_flags.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc
>
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc
> compiler-rt/trunk/test/asan/TestCases/log-path_test.cc
> compiler-rt/trunk/test/asan/TestCases/log_path_fork_test.cc.disabled
>
> 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=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_report.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_report.cc Thu Nov 13 10:01:23 2014
> @@ -53,7 +53,7 @@ void AppendToErrorMessageBuffer(const ch
> buffer, remaining);
> error_message_buffer[error_message_buffer_size - 1] = '\0';
> // FIXME: reallocate the buffer instead of truncating the message.
> - error_message_buffer_pos += remaining > length ? length : remaining;
> + error_message_buffer_pos += Min(remaining, length);
> }
> }
>
>
> Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
> +++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Thu Nov 13 10:01:23
> 2014
> @@ -803,7 +803,7 @@ INTERCEPTOR(SSIZE_T, recvfrom, int fd, v
> __msan_unpoison(buf, res);
> if (srcaddr) {
> SIZE_T sz = *addrlen;
> - __msan_unpoison(srcaddr, (sz < srcaddr_sz) ? sz : srcaddr_sz);
> + __msan_unpoison(srcaddr, Min(sz, srcaddr_sz));
> }
> }
> return res;
>
> 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=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc Thu Nov 13
> 10:01:23 2014
> @@ -160,6 +160,8 @@ const char *StripModuleName(const char *
> return 0;
> if (const char *slash_pos = internal_strrchr(module, '/'))
> return slash_pos + 1;
> + else if (const char *backslash_pos = internal_strrchr(module, '\\'))
> + return backslash_pos + 1;
> return module;
> }
>
> @@ -225,6 +227,24 @@ void DecreaseTotalMmap(uptr size) {
> atomic_fetch_sub(&g_total_mmaped, size, memory_order_relaxed);
> }
>
> +static BlockingMutex binary_name_cache_lock(LINKER_INITIALIZED);
>
This breaks a clang build of compiler-rt:
llvm/src/projects/compiler-rt/lib/sanitizer_common/sanitizer_common.cc:230:22:
error: declaration requires a global constructor
[-Werror,-Wglobal-constructors]
static BlockingMutex binary_name_cache_lock(LINKER_INITIALIZED);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
While LINKER_INITIALIZED might sound nice, it seems it doesn't actually do
what it says on the tin - BlockingMutex still has a user defined (albeit
no-op in an optimized build) ctor, which produces a global ctor to run it,
etc...
> +static char binary_name_cache_str[kMaxPathLength];
> +static bool binary_name_cache_initialized = false;
> +
> +const char *GetBinaryName() {
> + BlockingMutexLock l(&binary_name_cache_lock);
> + if (!binary_name_cache_initialized) {
> + ReadBinaryName(binary_name_cache_str, sizeof(binary_name_cache_str));
> + binary_name_cache_initialized = true;
> + }
> + return binary_name_cache_str;
> +}
> +
> +void CacheBinaryName() {
> + // Call once to make sure that binary_name_cache_str is initialized
> + GetBinaryName();
> +}
> +
> } // namespace __sanitizer
>
> using namespace __sanitizer; // NOLINT
>
> 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=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Thu Nov 13
> 10:01:23 2014
> @@ -176,6 +176,9 @@ const char *StripPathPrefix(const char *
> const char *StripModuleName(const char *module);
>
> // OS
> +uptr ReadBinaryName(/*out*/char *buf, uptr buf_len);
> +const char *GetBinaryName();
> +void CacheBinaryName();
> void DisableCoreDumperIfNecessary();
> void DumpProcessMap();
> bool FileExists(const char *filename);
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_flags.cc Thu Nov 13
> 10:01:23 2014
> @@ -98,8 +98,8 @@ void ParseCommonFlagsFromString(CommonFl
> ParseFlag(str, &f->malloc_context_size, "malloc_context_size",
> "Max number of stack frames kept for each
> allocation/deallocation.");
> ParseFlag(str, &f->log_path, "log_path",
> - "Write logs to \"log_path.pid\". The special values are \"stdout\"
> and "
> - "\"stderr\". The default is \"stderr\".");
> + "Write logs to \"log_path.pname.pid\". The special values are
> \"stdout\" "
> + "and \"stderr\". The default is \"stderr\".");
> ParseFlag(str, &f->verbosity, "verbosity",
> "Verbosity level (0 - silent, 1 - a bit of output, 2+ - more
> output).");
> ParseFlag(str, &f->detect_leaks, "detect_leaks",
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Thu Nov 13
> 10:01:23 2014
> @@ -678,47 +678,31 @@ uptr GetPageSize() {
> #endif
> }
>
> -static char proc_self_exe_cache_str[kMaxPathLength];
> -static uptr proc_self_exe_cache_len = 0;
> -
> uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) {
> - if (proc_self_exe_cache_len > 0) {
> - // If available, use the cached module name.
> - uptr module_name_len =
> - internal_snprintf(buf, buf_len, "%s", proc_self_exe_cache_str);
> - CHECK_LT(module_name_len, buf_len);
> - return module_name_len;
> - }
> #if SANITIZER_FREEBSD
> - const int Mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
> + const int Mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
> + const char *default_module_name = "kern.proc.pathname";
> size_t Size = buf_len;
> - bool IsErr = (sysctl(Mib, 4, buf, &Size, NULL, 0) != 0);
> + bool IsErr = (sysctl(Mib, ARRAY_SIZE(Mib), buf, &Size, NULL, 0) != 0);
> int readlink_error = IsErr ? errno : 0;
> uptr module_name_len = Size;
> #else
> + const char *default_module_name = "/proc/self/exe";
> uptr module_name_len = internal_readlink(
> "/proc/self/exe", buf, buf_len);
> int readlink_error;
> bool IsErr = internal_iserror(module_name_len, &readlink_error);
> #endif
> if (IsErr) {
> - // We can't read /proc/self/exe for some reason, assume the name of
> the
> - // binary is unknown.
> - Report("WARNING: readlink(\"/proc/self/exe\") failed with errno %d, "
> + // We can't read binary name for some reason, assume it's unknown.
> + Report("WARNING: reading executable name failed with errno %d, "
> "some stack frames may not be symbolized\n", readlink_error);
> - module_name_len = internal_snprintf(buf, buf_len, "/proc/self/exe");
> + module_name_len = internal_snprintf(buf, buf_len,
> default_module_name);
> CHECK_LT(module_name_len, buf_len);
> }
> return module_name_len;
> }
>
> -void CacheBinaryName() {
> - if (!proc_self_exe_cache_len) {
> - proc_self_exe_cache_len =
> - ReadBinaryName(proc_self_exe_cache_str, kMaxPathLength);
> - }
> -}
> -
> // Match full names of the form /path/to/base_name{-,.}*
> bool LibraryNameIs(const char *full_name, const char *base_name) {
> const char *name = full_name;
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h Thu Nov 13
> 10:01:23 2014
> @@ -80,11 +80,6 @@ uptr ThreadSelfOffset();
> // information).
> bool LibraryNameIs(const char *full_name, const char *base_name);
>
> -// Read the name of the current binary from /proc/self/exe.
> -uptr ReadBinaryName(/*out*/char *buf, uptr buf_len);
> -// Cache the value of /proc/self/exe.
> -void CacheBinaryName();
> -
> // Call cb for each region mapped by map.
> void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));
> } // 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=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_mac.cc Thu Nov 13
> 10:01:23 2014
> @@ -317,6 +317,13 @@ MacosVersion GetMacosVersion() {
> return result;
> }
>
> +uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) {
> + // FIXME: Actually implement this function.
> + CHECK_GT(buf_len, 0);
> + buf[0] = 0;
> + return 0;
> +}
> +
> } // namespace __sanitizer
>
> #endif // SANITIZER_MAC
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc Thu Nov 13
> 10:01:23 2014
> @@ -289,13 +289,14 @@ char *FindPathToBinary(const char *name)
> void MaybeOpenReportFile() {
> if (!log_to_file) return;
> uptr pid = internal_getpid();
> + const char *pname = StripModuleName(GetBinaryName());
> // If in tracer, use the parent's file.
> if (pid == stoptheworld_tracer_pid)
> pid = stoptheworld_tracer_ppid;
> if (report_fd_pid == pid) return;
> InternalScopedBuffer<char> report_path_full(4096);
> internal_snprintf(report_path_full.data(), report_path_full.size(),
> - "%s.%zu", report_path_prefix, pid);
> + "%s.%s.%zu", report_path_prefix, pname, pid);
> uptr openrv = OpenFile(report_path_full.data(), true);
> if (internal_iserror(openrv)) {
> report_fd = kStderrFd;
>
> 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=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_printf.cc Thu Nov 13
> 10:01:23 2014
> @@ -253,9 +253,11 @@ static void SharedPrintfCode(bool append
> needed_length = 0;
> if (append_pid) {
> int pid = internal_getpid();
> - needed_length += internal_snprintf(buffer, buffer_size, "==%d==",
> pid);
> + const char *pname = StripModuleName(GetBinaryName());
> + needed_length += internal_snprintf(buffer, buffer_size,
> + "==%s %d==", pname, pid);
> if (needed_length >= buffer_size) {
> - // The pid doesn't fit into the current buffer.
> + // Process name + pid do not fit into the current buffer.
> if (!use_mmap)
> continue;
> RAW_CHECK_MSG(needed_length < kLen, "Buffer in Report is too
> short!\n");
>
> Modified:
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> ---
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> (original)
> +++
> compiler-rt/trunk/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc
> Thu Nov 13 10:01:23 2014
> @@ -643,11 +643,8 @@ class POSIXSymbolizer : public Symbolize
> }
>
> void PrepareForSandboxing() {
> -#if SANITIZER_LINUX && !SANITIZER_ANDROID
> BlockingMutexLock l(&mu_);
> - // Cache /proc/self/exe on Linux.
> CacheBinaryName();
> -#endif
> }
>
> private:
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc Thu Nov 13
> 10:01:23 2014
> @@ -527,6 +527,13 @@ bool IsAccessibleMemoryRange(uptr beg, u
> return true;
> }
>
> +uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) {
> + // FIXME: Actually implement this function.
> + CHECK_GT(buf_len, 0);
> + buf[0] = 0;
> + return 0;
> +}
> +
> } // namespace __sanitizer
>
> #endif // _WIN32
>
> Modified: compiler-rt/trunk/test/asan/TestCases/log-path_test.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/log-path_test.cc?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/log-path_test.cc (original)
> +++ compiler-rt/trunk/test/asan/TestCases/log-path_test.cc Thu Nov 13
> 10:01:23 2014
> @@ -10,7 +10,7 @@
> // Good log_path.
> // RUN: rm -f %t.log.*
> // RUN: env ASAN_OPTIONS=log_path=%t.log not %run %t 2> %t.out
> -// RUN: FileCheck %s --check-prefix=CHECK-ERROR < %t.log.*
> +// RUN: FileCheck %s --check-prefix=CHECK-ERROR < %t.log.log-path_test.cc
> *
>
> // Invalid log_path.
> // RUN: env ASAN_OPTIONS=log_path=/INVALID not %run %t 2> %t.out
> @@ -24,7 +24,7 @@
> // Run w/o errors should not produce any log.
> // RUN: rm -f %t.log.*
> // RUN: env ASAN_OPTIONS=log_path=%t.log %run %t ARG ARG ARG
> -// RUN: not cat %t.log.*
> +// RUN: not cat %t.log.log-path_test.cc*
>
> // FIXME: log_path is not supported on Windows yet.
> // XFAIL: win32
>
> Modified:
> compiler-rt/trunk/test/asan/TestCases/log_path_fork_test.cc.disabled
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/log_path_fork_test.cc.disabled?rev=221896&r1=221895&r2=221896&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/log_path_fork_test.cc.disabled
> (original)
> +++ compiler-rt/trunk/test/asan/TestCases/log_path_fork_test.cc.disabled
> Thu Nov 13 10:01:23 2014
> @@ -2,7 +2,7 @@
> // RUN: rm -f %t.log.*
> // Set verbosity to 1 so that the log files are opened prior to fork().
> // RUN: env ASAN_OPTIONS="log_path=%t.log verbosity=1" not %run %t 2>
> %t.out
> -// RUN: for f in %t.log.* ; do FileCheck %s < $f; done
> +// RUN: for f in %t.log.log_path_fork_test.cc* ; do FileCheck %s < $f;
> done
> // RUN: [ `ls %t.log.* | wc -l` == 2 ]
>
> #include <stdlib.h>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141113/c166cf93/attachment.html>
More information about the llvm-commits
mailing list