tsan: prevent insertion of unwanted memset/memcpy/memcmp into runtime


git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@159294 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/sanitizer_common/sanitizer_internal_defs.h b/lib/sanitizer_common/sanitizer_internal_defs.h
index 5e0fb69..ea914ab 100644
--- a/lib/sanitizer_common/sanitizer_internal_defs.h
+++ b/lib/sanitizer_common/sanitizer_internal_defs.h
@@ -26,6 +26,7 @@
 // Platform-specific defs.
 #if defined(_WIN32)
 typedef unsigned long    DWORD;  // NOLINT
+# define ALWAYS_INLINE __declspec(forceinline)
 // FIXME(timurrrr): do we need this on Windows?
 # define ALIAS(x)
 # define ALIGNED(x) __declspec(align(x))
@@ -33,18 +34,24 @@
 # define NOINLINE __declspec(noinline)
 # define NORETURN __declspec(noreturn)
 # define THREADLOCAL   __declspec(thread)
+# define NOTHROW
 #else  // _WIN32
+# define ALWAYS_INLINE __attribute__((always_inline))
 # define ALIAS(x) __attribute__((alias(x)))
 # define ALIGNED(x) __attribute__((aligned(x)))
 # define FORMAT(f, a)  __attribute__((format(printf, f, a)))
 # define NOINLINE __attribute__((noinline))
 # define NORETURN  __attribute__((noreturn))
 # define THREADLOCAL   __thread
+# ifdef __cplusplus
+#   define NOTHROW throw()
+# else
+#   define NOTHROW __attribute__((__nothrow__))
+#endif
 #endif  // _WIN32
 
 // We have no equivalent of these on Windows.
 #ifndef _WIN32
-# define ALWAYS_INLINE __attribute__((always_inline))
 # define LIKELY(x)     __builtin_expect(!!(x), 1)
 # define UNLIKELY(x)   __builtin_expect(!!(x), 0)
 # define UNUSED __attribute__((unused))
diff --git a/lib/tsan/rtl/tsan_defs.h b/lib/tsan/rtl/tsan_defs.h
index ae99ecc..a37c0a3 100644
--- a/lib/tsan/rtl/tsan_defs.h
+++ b/lib/tsan/rtl/tsan_defs.h
@@ -14,7 +14,6 @@
 #ifndef TSAN_DEFS_H
 #define TSAN_DEFS_H
 
-#include "interception/interception.h"
 #include "sanitizer_common/sanitizer_internal_defs.h"
 #include "sanitizer_common/sanitizer_libc.h"
 #include "tsan_stat.h"
@@ -155,9 +154,29 @@
 
 }  // namespace __tsan
 
-DECLARE_REAL(void*, memset, void *ptr, int v, uptr size);
-DECLARE_REAL(void*, memcpy, void *dst, const void *src, uptr size);
-DECLARE_REAL(int, strncmp, const char *s1, const char *s2, uptr n);
-DECLARE_REAL(const char*, strstr, const char *s1, const char *s2);
+extern "C" inline void *ALWAYS_INLINE
+memset(void *ptr, int v, uptr size) NOTHROW {
+  for (uptr i = 0; i < size; i++)
+    ((char*)ptr)[i] = (char)v;
+  return ptr;
+}
+
+extern "C" inline void *ALWAYS_INLINE
+memcpy(void *dst, const void *src, uptr size) NOTHROW {
+  for (uptr i = 0; i < size; i++)
+    ((char*)dst)[i] = ((char*)src)[i];
+  return dst;
+}
+
+extern "C" inline int ALWAYS_INLINE
+memcmp(const void *p1, const void *p2, uptr size) NOTHROW {
+  for (uptr i = 0; i < size; i++) {
+    if (((unsigned char*)p1)[i] < ((unsigned char*)p2)[i])
+      return -1;
+    if (((unsigned char*)p1)[i] > ((unsigned char*)p2)[i])
+      return 1;
+  }
+  return 0;
+}
 
 #endif  // TSAN_DEFS_H
diff --git a/lib/tsan/rtl/tsan_flags.cc b/lib/tsan/rtl/tsan_flags.cc
index 1722ad1..7224f4b 100644
--- a/lib/tsan/rtl/tsan_flags.cc
+++ b/lib/tsan/rtl/tsan_flags.cc
@@ -32,7 +32,7 @@
 }
 
 void InitializeFlags(Flags *f, const char *env) {
-  REAL(memset)(f, 0, sizeof(*f));
+  internal_memset(f, 0, sizeof(*f));
 
   // Default values.
   f->enable_annotations = true;
@@ -78,7 +78,7 @@
                                 const char **end) {
   if (env == 0)
     return *end = 0;
-  const char *pos = REAL(strstr)(env, name);
+  const char *pos = internal_strstr(env, name);
   if (pos == 0)
     return *end = 0;
   pos += internal_strlen(name);
@@ -139,7 +139,7 @@
     return;
   int len = end - val;
   char *f = (char*)internal_alloc(MBlockFlag, len + 1);
-  REAL(memcpy)(f, val, len);
+  internal_memcpy(f, val, len);
   f[len] = 0;
   *flag = f;
 }
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc
index 9cb9da2..50045ad 100644
--- a/lib/tsan/rtl/tsan_interceptors.cc
+++ b/lib/tsan/rtl/tsan_interceptors.cc
@@ -172,6 +172,17 @@
       return REAL(func)(__VA_ARGS__); \
 /**/
 
+#define SCOPED_INTERCEPTOR_LIBC(func, ...) \
+    ThreadState *thr = cur_thread(); \
+    StatInc(thr, StatInterceptor); \
+    StatInc(thr, StatInt_##func); \
+    ScopedInterceptor si(thr, #func, callpc); \
+    const uptr pc = (uptr)&func; \
+    (void)pc; \
+    if (thr->in_rtl > 1) \
+      return REAL(func)(__VA_ARGS__); \
+/**/
+
 #define TSAN_INTERCEPTOR(ret, func, ...) INTERCEPTOR(ret, func, __VA_ARGS__)
 #define TSAN_INTERCEPT(func) INTERCEPT_FUNCTION(func)
 
@@ -321,7 +332,7 @@
   {
     SCOPED_INTERCEPTOR_RAW(calloc, size, n);
     p = user_alloc(thr, pc, n * size);
-    REAL(memset)(p, 0, n * size);
+    internal_memset(p, 0, n * size);
   }
   invoke_malloc_hook(p, n * size);
   return p;
@@ -354,26 +365,48 @@
   user_free(thr, pc, p);
 }
 
-TSAN_INTERCEPTOR(uptr, strlen, const void *s) {
+TSAN_INTERCEPTOR(uptr, strlen, const char *s) {
   SCOPED_TSAN_INTERCEPTOR(strlen, s);
-  uptr len = REAL(strlen)(s);
+  uptr len = internal_strlen(s);
   MemoryAccessRange(thr, pc, (uptr)s, len + 1, false);
   return len;
 }
 
-TSAN_INTERCEPTOR(void*, memset, void *dst, int v, uptr size) {
-  SCOPED_TSAN_INTERCEPTOR(memset, dst, v, size);
+DECLARE_REAL(void*, memset, void *dst, int v, uptr size);
+DECLARE_REAL(void*, memcpy, void *dst, const void *src, uptr size);
+DECLARE_REAL(int, memcmp, const void *s1, const void *s2, uptr n);
+extern "C" void *__interceptor_memset(void *dst, int v, uptr size);
+extern "C" void *__interceptor_memcpy(void *dst, const void *src, uptr size);
+extern "C" int __interceptor_memcmp(const void *s1, const void *s2, uptr n);
+
+namespace __tsan {
+void *intercept_memset(uptr callpc, void *dst, int v, uptr size) {
+  SCOPED_INTERCEPTOR_LIBC(memset, dst, v, size);
   MemoryAccessRange(thr, pc, (uptr)dst, size, true);
   return REAL(memset)(dst, v, size);
 }
 
-TSAN_INTERCEPTOR(void*, memcpy, void *dst, const void *src, uptr size) {
-  SCOPED_TSAN_INTERCEPTOR(memcpy, dst, src, size);
+void *intercept_memcpy(uptr callpc, void *dst, const void *src, uptr size) {
+  SCOPED_INTERCEPTOR_LIBC(memcpy, dst, src, size);
   MemoryAccessRange(thr, pc, (uptr)dst, size, true);
   MemoryAccessRange(thr, pc, (uptr)src, size, false);
   return REAL(memcpy)(dst, src, size);
 }
 
+int intercept_memcmp(uptr callpc, const void *s1, const void *s2, uptr n) {
+  SCOPED_INTERCEPTOR_LIBC(memcmp, s1, s2, n);
+  int res = 0;
+  uptr len = 0;
+  for (; len < n; len++) {
+    if ((res = ((unsigned char*)s1)[len] - ((unsigned char*)s2)[len]))
+      break;
+  }
+  MemoryAccessRange(thr, pc, (uptr)s1, len < n ? len + 1 : n, false);
+  MemoryAccessRange(thr, pc, (uptr)s2, len < n ? len + 1 : n, false);
+  return res;
+}
+}
+
 TSAN_INTERCEPTOR(int, strcmp, const char *s1, const char *s2) {
   SCOPED_TSAN_INTERCEPTOR(strcmp, s1, s2);
   uptr len = 0;
@@ -419,52 +452,39 @@
   return REAL(memmove)(dst, src, n);
 }
 
-TSAN_INTERCEPTOR(int, memcmp, const void *s1, const void *s2, uptr n) {
-  SCOPED_TSAN_INTERCEPTOR(memcmp, s1, s2, n);
-  int res = 0;
-  uptr len = 0;
-  for (; len < n; len++) {
-    if ((res = ((unsigned char*)s1)[len] - ((unsigned char*)s2)[len]))
-      break;
-  }
-  MemoryAccessRange(thr, pc, (uptr)s1, len < n ? len + 1 : n, false);
-  MemoryAccessRange(thr, pc, (uptr)s2, len < n ? len + 1 : n, false);
-  return res;
-}
-
-TSAN_INTERCEPTOR(void*, strchr, void *s, int c) {
+TSAN_INTERCEPTOR(char*, strchr, char *s, int c) {
   SCOPED_TSAN_INTERCEPTOR(strchr, s, c);
-  void *res = REAL(strchr)(s, c);
-  uptr len = res ? (char*)res - (char*)s + 1 : REAL(strlen)(s) + 1;
+  char *res = REAL(strchr)(s, c);
+  uptr len = res ? (char*)res - (char*)s + 1 : internal_strlen(s) + 1;
   MemoryAccessRange(thr, pc, (uptr)s, len, false);
   return res;
 }
 
-TSAN_INTERCEPTOR(void*, strchrnul, void *s, int c) {
+TSAN_INTERCEPTOR(char*, strchrnul, char *s, int c) {
   SCOPED_TSAN_INTERCEPTOR(strchrnul, s, c);
-  void *res = REAL(strchrnul)(s, c);
+  char *res = REAL(strchrnul)(s, c);
   uptr len = (char*)res - (char*)s + 1;
   MemoryAccessRange(thr, pc, (uptr)s, len, false);
   return res;
 }
 
-TSAN_INTERCEPTOR(void*, strrchr, void *s, int c) {
+TSAN_INTERCEPTOR(char*, strrchr, char *s, int c) {
   SCOPED_TSAN_INTERCEPTOR(strrchr, s, c);
-  MemoryAccessRange(thr, pc, (uptr)s, REAL(strlen)(s) + 1, false);
+  MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s) + 1, false);
   return REAL(strrchr)(s, c);
 }
 
-TSAN_INTERCEPTOR(void*, strcpy, void *dst, const void *src) {  // NOLINT
+TSAN_INTERCEPTOR(char*, strcpy, char *dst, const char *src) {  // NOLINT
   SCOPED_TSAN_INTERCEPTOR(strcpy, dst, src);  // NOLINT
-  uptr srclen = REAL(strlen)(src);
+  uptr srclen = internal_strlen(src);
   MemoryAccessRange(thr, pc, (uptr)dst, srclen + 1, true);
   MemoryAccessRange(thr, pc, (uptr)src, srclen + 1, false);
   return REAL(strcpy)(dst, src);  // NOLINT
 }
 
-TSAN_INTERCEPTOR(void*, strncpy, void *dst, void *src, uptr n) {
+TSAN_INTERCEPTOR(char*, strncpy, char *dst, char *src, uptr n) {
   SCOPED_TSAN_INTERCEPTOR(strncpy, dst, src, n);
-  uptr srclen = REAL(strlen)(src);
+  uptr srclen = internal_strlen(src);
   MemoryAccessRange(thr, pc, (uptr)dst, n, true);
   MemoryAccessRange(thr, pc, (uptr)src, min(srclen + 1, n), false);
   return REAL(strncpy)(dst, src, n);
@@ -473,8 +493,8 @@
 TSAN_INTERCEPTOR(const char*, strstr, const char *s1, const char *s2) {
   SCOPED_TSAN_INTERCEPTOR(strstr, s1, s2);
   const char *res = REAL(strstr)(s1, s2);
-  uptr len1 = REAL(strlen)(s1);
-  uptr len2 = REAL(strlen)(s2);
+  uptr len1 = internal_strlen(s1);
+  uptr len2 = internal_strlen(s2);
   MemoryAccessRange(thr, pc, (uptr)s1, len1 + 1, false);
   MemoryAccessRange(thr, pc, (uptr)s2, len2 + 1, false);
   return res;
@@ -1224,7 +1244,7 @@
 
 TSAN_INTERCEPTOR(int, puts, const char *s) {
   SCOPED_TSAN_INTERCEPTOR(puts, s);
-  MemoryAccessRange(thr, pc, (uptr)s, REAL(strlen)(s), false);
+  MemoryAccessRange(thr, pc, (uptr)s, internal_strlen(s), false);
   return REAL(puts)(s);
 }
 
diff --git a/lib/tsan/rtl/tsan_md5.cc b/lib/tsan/rtl/tsan_md5.cc
index 00e7b83..c9d671f 100644
--- a/lib/tsan/rtl/tsan_md5.cc
+++ b/lib/tsan/rtl/tsan_md5.cc
@@ -166,11 +166,11 @@
     free = 64 - used;
 
     if (size < free) {
-      REAL(memcpy)(&ctx->buffer[used], data, size);
+      internal_memcpy(&ctx->buffer[used], data, size);
       return;
     }
 
-    REAL(memcpy)(&ctx->buffer[used], data, free);
+    internal_memcpy(&ctx->buffer[used], data, free);
     data = (unsigned char *)data + free;
     size -= free;
     body(ctx, ctx->buffer, 64);
@@ -181,7 +181,7 @@
     size &= 0x3f;
   }
 
-  REAL(memcpy)(ctx->buffer, data, size);
+  internal_memcpy(ctx->buffer, data, size);
 }
 
 void MD5_Final(unsigned char *result, MD5_CTX *ctx) {
@@ -194,13 +194,13 @@
   free = 64 - used;
 
   if (free < 8) {
-    REAL(memset)(&ctx->buffer[used], 0, free);
+    internal_memset(&ctx->buffer[used], 0, free);
     body(ctx, ctx->buffer, 64);
     used = 0;
     free = 64;
   }
 
-  REAL(memset)(&ctx->buffer[used], 0, free - 8);
+  internal_memset(&ctx->buffer[used], 0, free - 8);
 
   ctx->lo <<= 3;
   ctx->buffer[56] = ctx->lo;
@@ -231,7 +231,7 @@
   result[14] = ctx->d >> 16;
   result[15] = ctx->d >> 24;
 
-  REAL(memset)(ctx, 0, sizeof(*ctx));
+  internal_memset(ctx, 0, sizeof(*ctx));
 }
 
 MD5Hash md5_hash(const void *data, uptr size) {
diff --git a/lib/tsan/rtl/tsan_rtl_report.cc b/lib/tsan/rtl/tsan_rtl_report.cc
index b6065d3..c6832da 100644
--- a/lib/tsan/rtl/tsan_rtl_report.cc
+++ b/lib/tsan/rtl/tsan_rtl_report.cc
@@ -50,9 +50,9 @@
   const char *path_prefix = flags()->strip_path_prefix;
   uptr path_prefix_len = internal_strlen(path_prefix);
   for (ReportStack *ent = stack; ent; ent = ent->next) {
-    if (ent->func && 0 == REAL(strncmp)(ent->func, prefix, prefix_len))
+    if (ent->func && 0 == internal_strncmp(ent->func, prefix, prefix_len))
       ent->func += prefix_len;
-    if (ent->file && 0 == REAL(strncmp)(ent->file, path_prefix,
+    if (ent->file && 0 == internal_strncmp(ent->file, path_prefix,
                                            path_prefix_len))
       ent->file += path_prefix_len;
     if (ent->file && ent->file[0] == '.' && ent->file[1] == '/')
diff --git a/lib/tsan/rtl/tsan_rtl_thread.cc b/lib/tsan/rtl/tsan_rtl_thread.cc
index 2e32252..147e383 100644
--- a/lib/tsan/rtl/tsan_rtl_thread.cc
+++ b/lib/tsan/rtl/tsan_rtl_thread.cc
@@ -212,7 +212,7 @@
   // Save from info about the thread.
   tctx->dead_info = new(internal_alloc(MBlockDeadInfo, sizeof(ThreadDeadInfo)))
       ThreadDeadInfo();
-  REAL(memcpy)(&tctx->dead_info->trace.events[0],
+  internal_memcpy(&tctx->dead_info->trace.events[0],
       &thr->trace.events[0], sizeof(thr->trace.events));
   for (int i = 0; i < kTraceParts; i++) {
     tctx->dead_info->trace.headers[i].stack0.CopyFrom(
diff --git a/lib/tsan/rtl/tsan_suppressions.cc b/lib/tsan/rtl/tsan_suppressions.cc
index 50e27cf..7549a4f 100644
--- a/lib/tsan/rtl/tsan_suppressions.cc
+++ b/lib/tsan/rtl/tsan_suppressions.cc
@@ -69,7 +69,7 @@
     tpos = (char*)internal_strchr(templ, '*');
     if (tpos != 0)
       tpos[0] = 0;
-    spos = REAL(strstr)(str, templ);
+    spos = internal_strstr(str, templ);
     str = spos + internal_strlen(templ);
     templ = tpos;
     if (tpos)
@@ -94,18 +94,18 @@
       while (line != end2 && (end2[-1] == ' ' || end2[-1] == '\t'))
         end2--;
       SuppressionType stype;
-      if (0 == REAL(strncmp)(line, "race:", sizeof("race:") - 1)) {
+      if (0 == internal_strncmp(line, "race:", sizeof("race:") - 1)) {
         stype = SuppressionRace;
         line += sizeof("race:") - 1;
-      } else if (0 == REAL(strncmp)(line, "thread:",
+      } else if (0 == internal_strncmp(line, "thread:",
           sizeof("thread:") - 1)) {
         stype = SuppressionThread;
         line += sizeof("thread:") - 1;
-      } else if (0 == REAL(strncmp)(line, "mutex:",
+      } else if (0 == internal_strncmp(line, "mutex:",
           sizeof("mutex:") - 1)) {
         stype = SuppressionMutex;
         line += sizeof("mutex:") - 1;
-      } else if (0 == REAL(strncmp)(line, "signal:",
+      } else if (0 == internal_strncmp(line, "signal:",
           sizeof("signal:") - 1)) {
         stype = SuppressionSignal;
         line += sizeof("signal:") - 1;
@@ -119,7 +119,7 @@
       head = s;
       s->type = stype;
       s->templ = (char*)internal_alloc(MBlockSuppression, end2 - line + 1);
-      REAL(memcpy)(s->templ, line, end2 - line);
+      internal_memcpy(s->templ, line, end2 - line);
       s->templ[end2 - line] = 0;
     }
     if (end[0] == 0)
diff --git a/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc b/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc
index 03dd51a..c5bed5d 100644
--- a/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc
+++ b/lib/tsan/rtl/tsan_symbolize_addr2line_linux.cc
@@ -149,7 +149,7 @@
 static ReportStack *NewFrame(uptr addr) {
   ReportStack *ent = (ReportStack*)internal_alloc(MBlockReportStack,
                                                   sizeof(ReportStack));
-  REAL(memset)(ent, 0, sizeof(*ent));
+  internal_memset(ent, 0, sizeof(*ent));
   ent->pc = addr;
   return ent;
 }
@@ -181,12 +181,12 @@
   char *pos = (char*)internal_strchr(func, '\n');
   if (pos && func[0] != '?') {
     res->func = (char*)internal_alloc(MBlockReportStack, pos - func + 1);
-    REAL(memcpy)(res->func, func, pos - func);
+    internal_memcpy(res->func, func, pos - func);
     res->func[pos - func] = 0;
     char *pos2 = (char*)internal_strchr(pos, ':');
     if (pos2) {
       res->file = (char*)internal_alloc(MBlockReportStack, pos2 - pos - 1 + 1);
-      REAL(memcpy)(res->file, pos + 1, pos2 - pos - 1);
+      internal_memcpy(res->file, pos + 1, pos2 - pos - 1);
       res->file[pos2 - pos - 1] = 0;
       res->line = atoi(pos2 + 1);
      }
@@ -196,43 +196,6 @@
 
 ReportStack *SymbolizeData(uptr addr) {
   return 0;
-  /*
-  if (base == 0)
-    base = GetImageBase();
-  int res = 0;
-  InternalScopedBuf<char> cmd(1024);
-  internal_snprintf(cmd, cmd.Size(),
-  "nm -alC %s|grep \"%zx\"|awk '{printf(\"%%s\\n%%s\", $3, $4)}' > tsan.tmp2",
-    exe, (addr - base));
-  if (system(cmd))
-    return 0;
-  FILE* f3 = fopen("tsan.tmp2", "rb");
-  if (f3) {
-    InternalScopedBuf<char> tmp(1024);
-    if (fread(tmp, 1, tmp.Size(), f3) <= 0)
-      return 0;
-    char *pos = strchr(tmp, '\n');
-    if (pos && tmp[0] != '?') {
-      res = 1;
-      symb[0].module = 0;
-      symb[0].offset = addr;
-      symb[0].name = alloc->Alloc<char>(pos - tmp + 1);
-      REAL(memcpy)(symb[0].name, tmp, pos - tmp);
-      symb[0].name[pos - tmp] = 0;
-      symb[0].file = 0;
-      symb[0].line = 0;
-      char *pos2 = strchr(pos, ':');
-      if (pos2) {
-        symb[0].file = alloc->Alloc<char>(pos2 - pos - 1 + 1);
-        REAL(memcpy)(symb[0].file, pos + 1, pos2 - pos - 1);
-        symb[0].file[pos2 - pos - 1] = 0;
-        symb[0].line = atoi(pos2 + 1);
-      }
-    }
-    fclose(f3);
-  }
-  return res;
-  */
 }
 
 }  // namespace __tsan
diff --git a/lib/tsan/rtl/tsan_vector.h b/lib/tsan/rtl/tsan_vector.h
index 9852d77..d41063d 100644
--- a/lib/tsan/rtl/tsan_vector.h
+++ b/lib/tsan/rtl/tsan_vector.h
@@ -94,7 +94,7 @@
       cap = size;
     T *p = (T*)internal_alloc(typ_, cap * sizeof(T));
     if (cap0) {
-      REAL(memcpy)(p, begin_, cap0 * sizeof(T));
+      internal_memcpy(p, begin_, cap0 * sizeof(T));
       internal_free(begin_);
     }
     begin_ = p;
diff --git a/lib/tsan/rtl_tests/tsan_test_util_linux.cc b/lib/tsan/rtl_tests/tsan_test_util_linux.cc
index d2c06b5..35a7c48 100644
--- a/lib/tsan/rtl_tests/tsan_test_util_linux.cc
+++ b/lib/tsan/rtl_tests/tsan_test_util_linux.cc
@@ -33,6 +33,9 @@
 static __thread bool expect_report_reported;
 static __thread ReportType expect_report_type;
 
+extern "C" void *__interceptor_memcpy(void*, const void*, uptr);
+extern "C" void *__interceptor_memset(void*, int, uptr);
+
 static void *BeforeInitThread(void *param) {
   (void)param;
   return 0;
@@ -298,10 +301,10 @@
     static_cast<Mutex*>(ev->ptr)->ReadUnlock();
     break;
   case Event::MEMCPY:
-    memcpy(ev->ptr, (void*)ev->arg, ev->arg2);
+    __interceptor_memcpy(ev->ptr, (void*)ev->arg, ev->arg2);
     break;
   case Event::MEMSET:
-    memset(ev->ptr, ev->arg, ev->arg2);
+    __interceptor_memset(ev->ptr, ev->arg, ev->arg2);
     break;
   default: CHECK(0);
   }
diff --git a/lib/tsan/unit_tests/tsan_platform_test.cc b/lib/tsan/unit_tests/tsan_platform_test.cc
index b9ff0d1..64c4499 100644
--- a/lib/tsan/unit_tests/tsan_platform_test.cc
+++ b/lib/tsan/unit_tests/tsan_platform_test.cc
@@ -79,7 +79,7 @@
   EXPECT_EQ(len1, internal_read(fd, buf, len1));
   EXPECT_EQ(0, internal_memcmp(buf, str1, len1));
   EXPECT_EQ((char)0, buf[len1 + 1]);
-  REAL(memset)(buf, 0, len1);
+  internal_memset(buf, 0, len1);
   EXPECT_EQ(len2, internal_read(fd, buf, len2));
   EXPECT_EQ(0, internal_memcmp(buf, str2, len2));
   internal_close(fd);