[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