[compiler-rt] r193730 - [sanitizer] Intercept getline, getdelim.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Wed Oct 30 18:17:42 PDT 2013


Author: eugenis
Date: Wed Oct 30 20:17:41 2013
New Revision: 193730

URL: http://llvm.org/viewvc/llvm-project?rev=193730&view=rev
Log:
[sanitizer] Intercept getline, getdelim.

Added:
    compiler-rt/trunk/lib/msan/lit_tests/getline.cc
    compiler-rt/trunk/lib/msan/lit_tests/getline_test_data
Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
    compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc
    compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h

Added: compiler-rt/trunk/lib/msan/lit_tests/getline.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/lit_tests/getline.cc?rev=193730&view=auto
==============================================================================
--- compiler-rt/trunk/lib/msan/lit_tests/getline.cc (added)
+++ compiler-rt/trunk/lib/msan/lit_tests/getline.cc Wed Oct 30 20:17:41 2013
@@ -0,0 +1,30 @@
+// RUN: %clangxx_msan -O0 %s -o %t && %t %p
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char **argv) {
+  assert(argc == 2);
+  char buf[1024];
+  snprintf(buf, sizeof(buf), "%s/%s", argv[1], "getline_test_data");
+
+  FILE *fp = fopen(buf, "r");
+  assert(fp);
+
+  char *line = 0;
+  size_t len = 0;
+  int n = getline(&line, &len, fp);
+  assert(n == 6);
+  assert(strcmp(line, "abcde\n") == 0);
+
+  n = getline(&line, &len, fp);
+  assert(n == 6);
+  assert(strcmp(line, "12345\n") == 0);
+  
+  free(line);
+  fclose(fp);
+
+  return 0;
+}

Added: compiler-rt/trunk/lib/msan/lit_tests/getline_test_data
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/lit_tests/getline_test_data?rev=193730&view=auto
==============================================================================
--- compiler-rt/trunk/lib/msan/lit_tests/getline_test_data (added)
+++ compiler-rt/trunk/lib/msan/lit_tests/getline_test_data Wed Oct 30 20:17:41 2013
@@ -0,0 +1,2 @@
+abcde
+12345

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=193730&r1=193729&r2=193730&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Wed Oct 30 20:17:41 2013
@@ -2811,6 +2811,37 @@ INTERCEPTOR(int, lrand48_r, void *buffer
 #define INIT_DRAND48_R
 #endif
 
+#if SANITIZER_INTERCEPT_GETLINE
+INTERCEPTOR(SSIZE_T, getline, char **lineptr, SIZE_T *n, void *stream) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, getline, lineptr, n, stream);
+  SSIZE_T res = REAL(getline)(lineptr, n, stream);
+  if (res > 0) {
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lineptr, sizeof(*lineptr));
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, n, sizeof(*n));
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *lineptr, res + 1);
+  }
+  return res;
+}
+INTERCEPTOR(SSIZE_T, getdelim, char **lineptr, SIZE_T *n, int delim,
+            void *stream) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, getdelim, lineptr, n, delim, stream);
+  SSIZE_T res = REAL(getdelim)(lineptr, n, delim, stream);
+  if (res > 0) {
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lineptr, sizeof(*lineptr));
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, n, sizeof(*n));
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *lineptr, res + 1);
+  }
+  return res;
+}
+#define INIT_GETLINE           \
+  INTERCEPT_FUNCTION(getline); \
+  INTERCEPT_FUNCTION(getdelim);
+#else
+#define INIT_GETLINE
+#endif
+
 #define SANITIZER_COMMON_INTERCEPTORS_INIT \
   INIT_STRCMP;                             \
   INIT_STRNCMP;                            \
@@ -2918,4 +2949,5 @@ INTERCEPTOR(int, lrand48_r, void *buffer
   INIT_LGAMMA;                             \
   INIT_LGAMMA_R;                           \
   INIT_DRAND48_R;                          \
+  INIT_GETLINE;                            \
 /**/

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=193730&r1=193729&r2=193730&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h Wed Oct 30 20:17:41 2013
@@ -150,6 +150,9 @@
 # define SANITIZER_INTERCEPT_LGAMMA_R SI_LINUX
 # define SANITIZER_INTERCEPT_DRAND48_R SI_LINUX_NOT_ANDROID
 
+// FIXME: getline seems to be available on OSX 10.7
+# define SANITIZER_INTERCEPT_GETLINE SI_LINUX_NOT_ANDROID
+
 # define SANITIZER_INTERCEPT__EXIT SI_LINUX
 
 # define SANITIZER_INTERCEPT_PHTREAD_MUTEX SI_NOT_WINDOWS

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc?rev=193730&r1=193729&r2=193730&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.cc Wed Oct 30 20:17:41 2013
@@ -412,6 +412,8 @@ void StatOutput(u64 *stat) {
   name[StatInt_lgammal_r]                = "  lgammal_r                       ";
   name[StatInt_drand48_r]                = "  drand48_r                       ";
   name[StatInt_lrand48_r]                = "  lrand48_r                       ";
+  name[StatInt_getline]                  = "  getline                         ";
+  name[StatInt_getdelim]                 = "  getdelim                        ";
 
   name[StatInt_pthread_attr_getdetachstate]  = "  pthread_addr_getdetachstate     ";  // NOLINT
   name[StatInt_pthread_attr_getguardsize]    = "  pthread_addr_getguardsize       ";  // NOLINT

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h?rev=193730&r1=193729&r2=193730&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_stat.h Wed Oct 30 20:17:41 2013
@@ -407,6 +407,8 @@ enum StatType {
   StatInt_lgammal_r,
   StatInt_drand48_r,
   StatInt_lrand48_r,
+  StatInt_getline,
+  StatInt_getdelim,
 
   StatInt_pthread_attr_getdetachstate,
   StatInt_pthread_attr_getguardsize,





More information about the llvm-commits mailing list