[compiler-rt] r177052 - [msan] Intercept __strdup, strndup, __strndup.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Thu Mar 14 04:10:37 PDT 2013


Author: eugenis
Date: Thu Mar 14 06:10:36 2013
New Revision: 177052

URL: http://llvm.org/viewvc/llvm-project?rev=177052&view=rev
Log:
[msan] Intercept __strdup, strndup, __strndup.

Added:
    compiler-rt/trunk/lib/msan/lit_tests/c-strdup.c   (with props)
Modified:
    compiler-rt/trunk/lib/msan/lit_tests/lit.cfg
    compiler-rt/trunk/lib/msan/msan_interceptors.cc
    compiler-rt/trunk/lib/msan/tests/msan_test.cc

Added: compiler-rt/trunk/lib/msan/lit_tests/c-strdup.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/lit_tests/c-strdup.c?rev=177052&view=auto
==============================================================================
--- compiler-rt/trunk/lib/msan/lit_tests/c-strdup.c (added)
+++ compiler-rt/trunk/lib/msan/lit_tests/c-strdup.c Thu Mar 14 06:10:36 2013
@@ -0,0 +1,17 @@
+// RUN: %clang_msan -m64 -O0 %s -o %t && %t >%t.out 2>&1
+// RUN: %clang_msan -m64 -O1 %s -o %t && %t >%t.out 2>&1
+// RUN: %clang_msan -m64 -O2 %s -o %t && %t >%t.out 2>&1
+// RUN: %clang_msan -m64 -O3 %s -o %t && %t >%t.out 2>&1
+
+// Test that strdup in C programs is intercepted.
+// GLibC headers translate strdup to __strdup at -O1 and higher.
+
+#include <stdlib.h>
+#include <string.h>
+int main(int argc, char **argv) {
+  char buf[] = "abc";
+  char *p = strdup(buf);
+  if (*p)
+    exit(0);
+  return 0;
+}

Propchange: compiler-rt/trunk/lib/msan/lit_tests/c-strdup.c
------------------------------------------------------------------------------
    svn:eol-style = LF

Modified: compiler-rt/trunk/lib/msan/lit_tests/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/lit_tests/lit.cfg?rev=177052&r1=177051&r2=177052&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/lit_tests/lit.cfg (original)
+++ compiler-rt/trunk/lib/msan/lit_tests/lit.cfg Thu Mar 14 06:10:36 2013
@@ -57,14 +57,17 @@ if (not compiler_rt_lit_cfg) or (not os.
 lit.load_config(config, compiler_rt_lit_cfg)
 
 # Setup default compiler flags used with -fsanitize=memory option.
-clang_msan_cxxflags = ["-ccc-cxx ",
-                       "-fsanitize=memory",
-                       "-mno-omit-leaf-frame-pointer",
-                       "-fno-omit-frame-pointer",
-                       "-fno-optimize-sibling-calls",
-                       "-g",
-                       "-fPIE",
-                       "-pie"]
+clang_msan_cflags = ["-fsanitize=memory",
+                     "-mno-omit-leaf-frame-pointer",
+                     "-fno-omit-frame-pointer",
+                     "-fno-optimize-sibling-calls",
+                     "-g",
+                     "-fPIE",
+                     "-pie"]
+clang_msan_cxxflags = ["-ccc-cxx "] + clang_msan_cflags
+config.substitutions.append( ("%clang_msan ",
+                              " ".join([config.clang] + clang_msan_cflags) + 
+                              " ") )
 config.substitutions.append( ("%clangxx_msan ",
                               " ".join([config.clang] + clang_msan_cxxflags) + 
                               " ") )

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=177052&r1=177051&r2=177052&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Thu Mar 14 06:10:36 2013
@@ -161,6 +161,32 @@ INTERCEPTOR(char *, strdup, char *src) {
   return res;
 }
 
+INTERCEPTOR(char *, __strdup, char *src) {
+  ENSURE_MSAN_INITED();
+  SIZE_T n = REAL(strlen)(src);
+  char *res = REAL(__strdup)(src);
+  __msan_copy_poison(res, src, n + 1);
+  return res;
+}
+
+INTERCEPTOR(char *, strndup, char *src, SIZE_T n) {
+  ENSURE_MSAN_INITED();
+  SIZE_T copy_size = REAL(strnlen)(src, n);
+  char *res = REAL(strndup)(src, n);
+  __msan_copy_poison(res, src, copy_size);
+  __msan_unpoison(res + copy_size, 1); // \0
+  return res;
+}
+
+INTERCEPTOR(char *, __strndup, char *src, SIZE_T n) {
+  ENSURE_MSAN_INITED();
+  SIZE_T copy_size = REAL(strnlen)(src, n);
+  char *res = REAL(__strndup)(src, n);
+  __msan_copy_poison(res, src, copy_size);
+  __msan_unpoison(res + copy_size, 1); // \0
+  return res;
+}
+
 INTERCEPTOR(char *, gcvt, double number, SIZE_T ndigit, char *buf) {
   ENSURE_MSAN_INITED();
   char *res = REAL(gcvt)(number, ndigit, buf);
@@ -965,6 +991,9 @@ void InitializeInterceptors() {
   INTERCEPT_FUNCTION(wmemmove);
   INTERCEPT_FUNCTION(strcpy);  // NOLINT
   INTERCEPT_FUNCTION(strdup);
+  INTERCEPT_FUNCTION(__strdup);
+  INTERCEPT_FUNCTION(strndup);
+  INTERCEPT_FUNCTION(__strndup);
   INTERCEPT_FUNCTION(strncpy);  // NOLINT
   INTERCEPT_FUNCTION(strlen);
   INTERCEPT_FUNCTION(strnlen);

Modified: compiler-rt/trunk/lib/msan/tests/msan_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/tests/msan_test.cc?rev=177052&r1=177051&r2=177052&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/tests/msan_test.cc (original)
+++ compiler-rt/trunk/lib/msan/tests/msan_test.cc Thu Mar 14 06:10:36 2013
@@ -641,11 +641,39 @@ TEST(MemorySanitizer, memmove) {
 }
 
 TEST(MemorySanitizer, strdup) {
-  char *x = strdup("zzz");
-  EXPECT_NOT_POISONED(*x);
+  char buf[4] = "abc";
+  __msan_poison(buf + 2, sizeof(*buf));
+  char *x = strdup(buf);
+  EXPECT_NOT_POISONED(x[0]);
+  EXPECT_NOT_POISONED(x[1]);
+  EXPECT_POISONED(x[2]);
+  EXPECT_NOT_POISONED(x[3]);
   free(x);
 }
 
+TEST(MemorySanitizer, strndup) {
+  char buf[4] = "abc";
+  __msan_poison(buf + 2, sizeof(*buf));
+  char *x = strndup(buf, 3);
+  EXPECT_NOT_POISONED(x[0]);
+  EXPECT_NOT_POISONED(x[1]);
+  EXPECT_POISONED(x[2]);
+  EXPECT_NOT_POISONED(x[3]);
+  free(x);
+}
+
+TEST(MemorySanitizer, strndup_short) {
+  char buf[4] = "abc";
+  __msan_poison(buf + 1, sizeof(*buf));
+  __msan_poison(buf + 2, sizeof(*buf));
+  char *x = strndup(buf, 2);
+  EXPECT_NOT_POISONED(x[0]);
+  EXPECT_POISONED(x[1]);
+  EXPECT_NOT_POISONED(x[3]);
+  free(x);
+}
+
+
 template<class T, int size>
 void TestOverlapMemmove() {
   T *x = new T[size];





More information about the llvm-commits mailing list