<div dir="ltr">Hi Derek,<div><br></div><div>I am getting many uninitialized variable errors in my builds (which enable -Werror) after this change. They all look like:</div><div><br></div><div><div>In file included from /usr/local/google/home/tejohnson/llvm/llvm_13/projects/compiler-rt/lib/esan/esan_interceptors.cpp:89:</div><div>/usr/local/google/home/tejohnson/llvm/llvm_13/projects/compiler-rt/lib/esan/../sanitizer_common/sanitizer_common_interceptors.inc:377:17: error: variable 'ctx' is uninitialized when used here [-Werror,-Wuninitialized]</div><div>    StrstrCheck(ctx, r, s1, s2);</div><div>                ^~~</div><div>/usr/local/google/home/tejohnson/llvm/llvm_13/projects/compiler-rt/lib/esan/../sanitizer_common/sanitizer_common_interceptors.inc:373:12: note: initialize the variable 'ctx' to silence this warning</div><div>  void *ctx;</div><div>           ^</div><div>            = nullptr</div></div><div><br></div><div><br></div><div>I took a quick look to see if it was a spurious warning, but it does seem in fact that ctx is uninitialized when it is passed to StrstrCheck, so I am not sure what was intended.</div><div><br></div><div>Thanks,</div><div>Teresa</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Apr 23, 2016 at 9:41 AM, Derek Bruening via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: bruening<br>
Date: Sat Apr 23 11:41:24 2016<br>
New Revision: 267293<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=267293&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=267293&view=rev</a><br>
Log:<br>
[esan] EfficiencySanitizer libc interceptors<br>
<br>
Summary:<br>
Adds libc interceptors to the runtime library for the new<br>
EfficiencySanitizer ("esan") family of tools.  The interceptors cover<br>
the memory operations in most common library calls and will be shared<br>
among all esan tools.<br>
<br>
Reviewers: aizatsky<br>
<br>
Subscribers: zhaoqin, tberghammer, danalbert, srhines, llvm-commits, vitalybuka, eugenis, kcc<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D19411" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19411</a><br>
<br>
Added:<br>
    compiler-rt/trunk/lib/esan/esan_interceptors.cpp<br>
    compiler-rt/trunk/test/esan/TestCases/libc-intercept.c<br>
Modified:<br>
    compiler-rt/trunk/lib/esan/CMakeLists.txt<br>
    compiler-rt/trunk/lib/esan/esan.cpp<br>
    compiler-rt/trunk/lib/esan/esan.h<br>
    compiler-rt/trunk/test/esan/TestCases/verbose-simple.c<br>
<br>
Modified: compiler-rt/trunk/lib/esan/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/CMakeLists.txt?rev=267293&r1=267292&r2=267293&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/CMakeLists.txt?rev=267293&r1=267292&r2=267293&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/esan/CMakeLists.txt (original)<br>
+++ compiler-rt/trunk/lib/esan/CMakeLists.txt Sat Apr 23 11:41:24 2016<br>
@@ -9,7 +9,8 @@ include_directories(..)<br>
<br>
 set(ESAN_SOURCES<br>
   esan.cpp<br>
-  esan_interface.cpp)<br>
+  esan_interface.cpp<br>
+  esan_interceptors.cpp)<br>
<br>
 foreach (arch ${ESAN_SUPPORTED_ARCH})<br>
   add_compiler_rt_runtime(clang_rt.esan<br>
<br>
Modified: compiler-rt/trunk/lib/esan/esan.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan.cpp?rev=267293&r1=267292&r2=267293&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan.cpp?rev=267293&r1=267292&r2=267293&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/esan/esan.cpp (original)<br>
+++ compiler-rt/trunk/lib/esan/esan.cpp Sat Apr 23 11:41:24 2016<br>
@@ -95,6 +95,8 @@ void initializeLibrary(ToolType Tool) {<br>
     Die();<br>
   }<br>
<br>
+  initializeInterceptors();<br>
+<br>
   EsanIsInitialized = true;<br>
 }<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/esan/esan.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan.h?rev=267293&r1=267292&r2=267293&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan.h?rev=267293&r1=267292&r2=267293&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/esan/esan.h (original)<br>
+++ compiler-rt/trunk/lib/esan/esan.h Sat Apr 23 11:41:24 2016<br>
@@ -38,6 +38,7 @@ extern ToolType WhichTool;<br>
 void initializeLibrary(ToolType Tool);<br>
 int finalizeLibrary();<br>
 void processRangeAccess(uptr PC, uptr Addr, int Size, bool IsWrite);<br>
+void initializeInterceptors();<br>
<br>
 } // namespace __esan<br>
<br>
<br>
Added: compiler-rt/trunk/lib/esan/esan_interceptors.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan_interceptors.cpp?rev=267293&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/esan/esan_interceptors.cpp?rev=267293&view=auto</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/esan/esan_interceptors.cpp (added)<br>
+++ compiler-rt/trunk/lib/esan/esan_interceptors.cpp Sat Apr 23 11:41:24 2016<br>
@@ -0,0 +1,338 @@<br>
+//===-- esan_interceptors.cpp ---------------------------------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This file is a part of EfficiencySanitizer, a family of performance tuners.<br>
+//<br>
+// Interception routines for the esan run-time.<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "esan.h"<br>
+#include "interception/interception.h"<br>
+#include "sanitizer_common/sanitizer_common.h"<br>
+#include "sanitizer_common/sanitizer_libc.h"<br>
+#include "sanitizer_common/sanitizer_stacktrace.h"<br>
+<br>
+using namespace __esan; // NOLINT<br>
+<br>
+#define CUR_PC() (StackTrace::GetCurrentPc())<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Interception via sanitizer common interceptors<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// Get the per-platform defines for what is possible to intercept<br>
+#include "sanitizer_common/sanitizer_platform_interceptors.h"<br>
+<br>
+// TODO(bruening): tsan disables several interceptors (getpwent, etc.) claiming<br>
+// that interception is a perf hit: should we do the same?<br>
+<br>
+// We have no need to intercept:<br>
+#undef SANITIZER_INTERCEPT_TLS_GET_ADDR<br>
+<br>
+// TODO(bruening): the common realpath interceptor assumes malloc is<br>
+// intercepted!  We should try to parametrize that, though we'll<br>
+// intercept malloc soon ourselves and can then remove this undef.<br>
+#undef SANITIZER_INTERCEPT_REALPATH<br>
+<br>
+#define COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED (!EsanIsInitialized)<br>
+<br>
+#define COMMON_INTERCEPT_FUNCTION(name) INTERCEPT_FUNCTION(name)<br>
+<br>
+#define COMMON_INTERCEPTOR_ENTER(ctx, func, ...)                               \<br>
+  do {                                                                         \<br>
+    if (UNLIKELY(COMMON_INTERCEPTOR_NOTHING_IS_INITIALIZED)) {                 \<br>
+      return REAL(func)(__VA_ARGS__);                                          \<br>
+    }                                                                          \<br>
+    (void)ctx;                                                                 \<br>
+  } while (false)<br>
+<br>
+#define COMMON_INTERCEPTOR_ENTER_NOIGNORE(ctx, func, ...)                      \<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, func, __VA_ARGS__)<br>
+<br>
+#define COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size)                         \<br>
+  processRangeAccess(CUR_PC(), (uptr)ptr, size, true)<br>
+<br>
+#define COMMON_INTERCEPTOR_READ_RANGE(ctx, ptr, size)                          \<br>
+  processRangeAccess(CUR_PC(), (uptr)ptr, size, false)<br>
+<br>
+// This is only called if the app explicitly calls exit(), not on<br>
+// a normal exit.<br>
+#define COMMON_INTERCEPTOR_ON_EXIT(ctx) finalizeLibrary()<br>
+<br>
+#define COMMON_INTERCEPTOR_FILE_OPEN(ctx, file, path) {}<br>
+#define COMMON_INTERCEPTOR_FILE_CLOSE(ctx, file) {}<br>
+#define COMMON_INTERCEPTOR_LIBRARY_LOADED(filename, handle) {}<br>
+#define COMMON_INTERCEPTOR_LIBRARY_UNLOADED() {}<br>
+#define COMMON_INTERCEPTOR_ACQUIRE(ctx, u) {}<br>
+#define COMMON_INTERCEPTOR_RELEASE(ctx, u) {}<br>
+#define COMMON_INTERCEPTOR_DIR_ACQUIRE(ctx, path) {}<br>
+#define COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd) {}<br>
+#define COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd) {}<br>
+#define COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd) {}<br>
+#define COMMON_INTERCEPTOR_FD_SOCKET_ACCEPT(ctx, fd, newfd) {}<br>
+#define COMMON_INTERCEPTOR_SET_THREAD_NAME(ctx, name) {}<br>
+#define COMMON_INTERCEPTOR_SET_PTHREAD_NAME(ctx, thread, name) {}<br>
+#define COMMON_INTERCEPTOR_BLOCK_REAL(name) REAL(name)<br>
+#define COMMON_INTERCEPTOR_MUTEX_LOCK(ctx, m) {}<br>
+#define COMMON_INTERCEPTOR_MUTEX_UNLOCK(ctx, m) {}<br>
+#define COMMON_INTERCEPTOR_MUTEX_REPAIR(ctx, m) {}<br>
+#define COMMON_INTERCEPTOR_HANDLE_RECVMSG(ctx, msg) {}<br>
+#define COMMON_INTERCEPTOR_USER_CALLBACK_START() {}<br>
+#define COMMON_INTERCEPTOR_USER_CALLBACK_END() {}<br>
+<br>
+#include "sanitizer_common/sanitizer_common_interceptors.inc"<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Syscall interception<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// We want the caller's PC b/c unlike the other function interceptors these<br>
+// are separate pre and post functions called around the app's syscall().<br>
+<br>
+#define COMMON_SYSCALL_PRE_READ_RANGE(ptr, size)                               \<br>
+  processRangeAccess(GET_CALLER_PC(), (uptr)ptr, size, false)<br>
+<br>
+#define COMMON_SYSCALL_PRE_WRITE_RANGE(ptr, size) {}<br>
+<br>
+#define COMMON_SYSCALL_POST_READ_RANGE(ptr, size) {}<br>
+<br>
+// The actual amount written is in post, not pre.<br>
+#define COMMON_SYSCALL_POST_WRITE_RANGE(ptr, size)                             \<br>
+  processRangeAccess(GET_CALLER_PC(), (uptr)ptr, size, true)<br>
+<br>
+#define COMMON_SYSCALL_ACQUIRE(addr) {}<br>
+#define COMMON_SYSCALL_RELEASE(addr) { (void)addr; }<br>
+#define COMMON_SYSCALL_FD_CLOSE(fd) {}<br>
+#define COMMON_SYSCALL_FD_ACQUIRE(fd) {}<br>
+#define COMMON_SYSCALL_FD_RELEASE(fd) {}<br>
+#define COMMON_SYSCALL_PRE_FORK() {}<br>
+#define COMMON_SYSCALL_POST_FORK(res) {}<br>
+<br>
+#include "sanitizer_common/sanitizer_common_syscalls.inc"<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Custom interceptors<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// TODO(bruening): move more of these to the common interception pool as they<br>
+// are shared with tsan and asan.<br>
+// While our other files match LLVM style, here we match sanitizer style as we<br>
+// expect to move these to the common pool.<br>
+<br>
+INTERCEPTOR(char *, strcpy, char *dst, const char *src) { // NOLINT<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, strcpy, dst, src);<br>
+  uptr srclen = internal_strlen(src);<br>
+  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, srclen + 1);<br>
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, src, srclen + 1);<br>
+  return REAL(strcpy)(dst, src); // NOLINT<br>
+}<br>
+<br>
+INTERCEPTOR(char *, strncpy, char *dst, char *src, uptr n) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, strncpy, dst, src, n);<br>
+  uptr srclen = internal_strnlen(src, n);<br>
+  uptr copied_size = srclen + 1 > n ? n : srclen + 1;<br>
+  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dst, copied_size);<br>
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, src, copied_size);<br>
+  return REAL(strncpy)(dst, src, n);<br>
+}<br>
+<br>
+#if SANITIZER_FREEBSD || SANITIZER_MAC || SANITIZER_ANDROID<br>
+INTERCEPTOR(int, stat, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, stat, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(stat)(path, buf);<br>
+#define ESAN_INTERCEPT_STAT INTERCEPT_FUNCTION(stat)<br>
+#else<br>
+INTERCEPTOR(int, __xstat, int version, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, __xstat, version, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(__xstat)(version, path, buf);<br>
+}<br>
+#define ESAN_INTERCEPT_STAT INTERCEPT_FUNCTION(__xstat)<br>
+#endif<br>
+<br>
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_FREEBSD<br>
+INTERCEPTOR(int, __xstat64, int version, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, __xstat64, version, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(__xstat64)(version, path, buf);<br>
+}<br>
+#define ESAN_MAYBE_INTERCEPT___XSTAT64 INTERCEPT_FUNCTION(__xstat64)<br>
+#else<br>
+#define ESAN_MAYBE_INTERCEPT___XSTAT64<br>
+#endif<br>
+<br>
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_FREEBSD<br>
+INTERCEPTOR(int, stat64, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, stat64, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(stat64)(path, buf);<br>
+}<br>
+#define ESAN_MAYBE_INTERCEPT_STAT64 INTERCEPT_FUNCTION(stat64)<br>
+#else<br>
+#define ESAN_MAYBE_INTERCEPT_STAT64<br>
+#endif<br>
+<br>
+#if SANITIZER_FREEBSD || SANITIZER_MAC || SANITIZER_ANDROID<br>
+INTERCEPTOR(int, lstat, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, lstat, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(lstat)(path, buf);<br>
+}<br>
+#define ESAN_INTERCEPT_LSTAT INTERCEPT_FUNCTION(lstat)<br>
+#else<br>
+INTERCEPTOR(int, __lxstat, int version, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, __lxstat, version, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(__lxstat)(version, path, buf);<br>
+}<br>
+#define ESAN_INTERCEPT_LSTAT INTERCEPT_FUNCTION(__lxstat)<br>
+#endif<br>
+<br>
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_FREEBSD<br>
+INTERCEPTOR(int, __lxstat64, int version, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, __lxstat64, version, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(__lxstat64)(version, path, buf);<br>
+}<br>
+#define ESAN_MAYBE_INTERCEPT___LXSTAT64 INTERCEPT_FUNCTION(__lxstat64)<br>
+#else<br>
+#define ESAN_MAYBE_INTERCEPT___LXSTAT64<br>
+#endif<br>
+<br>
+#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_FREEBSD<br>
+INTERCEPTOR(int, lstat64, const char *path, void *buf) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, lstat64, path, buf);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(lstat64)(path, buf);<br>
+}<br>
+#define ESAN_MAYBE_INTERCEPT_LSTAT64 INTERCEPT_FUNCTION(lstat64)<br>
+#else<br>
+#define ESAN_MAYBE_INTERCEPT_LSTAT64<br>
+#endif<br>
+<br>
+INTERCEPTOR(int, open, const char *name, int flags, int mode) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, open, name, flags, mode);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, name, 0);<br>
+  return REAL(open)(name, flags, mode);<br>
+}<br>
+<br>
+#if SANITIZER_LINUX<br>
+INTERCEPTOR(int, open64, const char *name, int flags, int mode) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, open64, name, flags, mode);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, name, 0);<br>
+  return REAL(open64)(name, flags, mode);<br>
+}<br>
+#define ESAN_MAYBE_INTERCEPT_OPEN64 INTERCEPT_FUNCTION(open64)<br>
+#else<br>
+#define ESAN_MAYBE_INTERCEPT_OPEN64<br>
+#endif<br>
+<br>
+INTERCEPTOR(int, creat, const char *name, int mode) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, creat, name, mode);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, name, 0);<br>
+  return REAL(creat)(name, mode);<br>
+}<br>
+<br>
+#if SANITIZER_LINUX<br>
+INTERCEPTOR(int, creat64, const char *name, int mode) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, creat64, name, mode);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, name, 0);<br>
+  return REAL(creat64)(name, mode);<br>
+}<br>
+#define ESAN_MAYBE_INTERCEPT_CREAT64 INTERCEPT_FUNCTION(creat64)<br>
+#else<br>
+#define ESAN_MAYBE_INTERCEPT_CREAT64<br>
+#endif<br>
+<br>
+INTERCEPTOR(int, unlink, char *path) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, unlink, path);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(unlink)(path);<br>
+}<br>
+<br>
+INTERCEPTOR(uptr, fread, void *ptr, uptr size, uptr nmemb, void *f) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, fread, ptr, size, nmemb, f);<br>
+  COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ptr, size * nmemb);<br>
+  return REAL(fread)(ptr, size, nmemb, f);<br>
+}<br>
+<br>
+INTERCEPTOR(uptr, fwrite, const void *p, uptr size, uptr nmemb, void *f) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, fwrite, p, size, nmemb, f);<br>
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, p, size * nmemb);<br>
+  return REAL(fwrite)(p, size, nmemb, f);<br>
+}<br>
+<br>
+INTERCEPTOR(int, puts, const char *s) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, puts, s);<br>
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, s, internal_strlen(s));<br>
+  return REAL(puts)(s);<br>
+}<br>
+<br>
+INTERCEPTOR(int, rmdir, char *path) {<br>
+  void *ctx;<br>
+  COMMON_INTERCEPTOR_ENTER(ctx, rmdir, path);<br>
+  COMMON_INTERCEPTOR_READ_STRING(ctx, path, 0);<br>
+  return REAL(rmdir)(path);<br>
+}<br>
+<br>
+namespace __esan {<br>
+<br>
+void initializeInterceptors() {<br>
+  InitializeCommonInterceptors();<br>
+<br>
+  INTERCEPT_FUNCTION(strcpy); // NOLINT<br>
+  INTERCEPT_FUNCTION(strncpy);<br>
+<br>
+  ESAN_INTERCEPT_STAT;<br>
+  ESAN_MAYBE_INTERCEPT_STAT64;<br>
+  ESAN_MAYBE_INTERCEPT___XSTAT64;<br>
+  ESAN_INTERCEPT_LSTAT;<br>
+  ESAN_MAYBE_INTERCEPT_LSTAT64;<br>
+  ESAN_MAYBE_INTERCEPT___LXSTAT64;<br>
+  INTERCEPT_FUNCTION(open);<br>
+  ESAN_MAYBE_INTERCEPT_OPEN64;<br>
+  INTERCEPT_FUNCTION(creat);<br>
+  ESAN_MAYBE_INTERCEPT_CREAT64;<br>
+  INTERCEPT_FUNCTION(unlink);<br>
+  INTERCEPT_FUNCTION(fread);<br>
+  INTERCEPT_FUNCTION(fwrite);<br>
+  INTERCEPT_FUNCTION(puts);<br>
+  INTERCEPT_FUNCTION(rmdir);<br>
+<br>
+  // TODO(bruening): we should intercept calloc() and other memory allocation<br>
+  // routines that zero memory and update our shadow memory appropriately.<br>
+<br>
+  // TODO(bruening): intercept routines that other sanitizers intercept that<br>
+  // are not in the common pool or here yet, ideally by adding to the common<br>
+  // pool.  Examples include wcslen and bcopy.<br>
+<br>
+  // TODO(bruening): there are many more libc routines that read or write data<br>
+  // structures that no sanitizer is intercepting: sigaction, strtol, etc.<br>
+}<br>
+<br>
+} // namespace __esan<br>
<br>
Added: compiler-rt/trunk/test/esan/TestCases/libc-intercept.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/esan/TestCases/libc-intercept.c?rev=267293&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/esan/TestCases/libc-intercept.c?rev=267293&view=auto</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/esan/TestCases/libc-intercept.c (added)<br>
+++ compiler-rt/trunk/test/esan/TestCases/libc-intercept.c Sat Apr 23 11:41:24 2016<br>
@@ -0,0 +1,20 @@<br>
+// RUN: %clang_esan_frag -O0 %s -o %t 2>&1<br>
+// RUN: %env_esan_opts=verbosity=3 %run %t 2>&1 | FileCheck %s<br>
+<br>
+#include <string.h><br>
+<br>
+int main(int argc, char **argv) {<br>
+  char Buf[2048];<br>
+  const char Str[] = "TestStringOfParticularLength"; // 29 chars.<br>
+  strcpy(Buf, Str);<br>
+  strncpy(Buf, Str, 17);<br>
+  return strncmp(Buf, Str, 17);<br>
+  // CHECK:      in esan::initializeLibrary<br>
+  // CHECK:      in esan::processRangeAccess {{.*}} 29<br>
+  // CHECK:      in esan::processRangeAccess {{.*}} 29<br>
+  // CHECK:      in esan::processRangeAccess {{.*}} 17<br>
+  // CHECK:      in esan::processRangeAccess {{.*}} 17<br>
+  // CHECK:      in esan::processRangeAccess {{.*}} 17<br>
+  // CHECK:      in esan::processRangeAccess {{.*}} 17<br>
+  // CHECK:      in esan::finalizeLibrary<br>
+}<br>
<br>
Modified: compiler-rt/trunk/test/esan/TestCases/verbose-simple.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/esan/TestCases/verbose-simple.c?rev=267293&r1=267292&r2=267293&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/esan/TestCases/verbose-simple.c?rev=267293&r1=267292&r2=267293&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/esan/TestCases/verbose-simple.c (original)<br>
+++ compiler-rt/trunk/test/esan/TestCases/verbose-simple.c Sat Apr 23 11:41:24 2016<br>
@@ -1,8 +1,6 @@<br>
 // RUN: %clang_esan_frag -O0 %s -o %t 2>&1<br>
 // RUN: %env_esan_opts=verbosity=1 %run %t 2>&1 | FileCheck %s<br>
<br>
-#include <stdlib.h><br>
-#include <string.h><br>
 int main(int argc, char **argv) {<br>
   // CHECK:      in esan::initializeLibrary<br>
   // CHECK-NEXT: in esan::finalizeLibrary<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> 408-460-2413</td></tr></tbody></table></span></div>
</div>