[sanitizer] Intercept rand_r.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 28 Mar 2014 11:21:45 +0000 (11:21 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 28 Mar 2014 11:21:45 +0000 (11:21 +0000)
llvm-svn: 205001

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
compiler-rt/test/msan/rand_r.cc [new file with mode: 0644]

index dd60db2958221f5a798f65fa54f0e8ac74e9414d..21574093561b71a99f09d5de57efe764f3ddc27d 100644 (file)
@@ -3232,6 +3232,18 @@ INTERCEPTOR(int, lrand48_r, void *buffer, long *result) {
 #define INIT_DRAND48_R
 #endif
 
+#if SANITIZER_INTERCEPT_RAND_R
+INTERCEPTOR(int, rand_r, unsigned *seedp) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, rand_r, seedp);
+  COMMON_INTERCEPTOR_READ_RANGE(ctx, seedp, sizeof(*seedp));
+  return REAL(rand_r)(seedp);
+}
+#define INIT_RAND_R COMMON_INTERCEPT_FUNCTION(rand_r);
+#else
+#define INIT_RAND_R
+#endif
+
 #if SANITIZER_INTERCEPT_GETLINE
 INTERCEPTOR(SSIZE_T, getline, char **lineptr, SIZE_T *n, void *stream) {
   void *ctx;
@@ -3704,6 +3716,7 @@ INTERCEPTOR(int, ftime, __sanitizer_timeb *tp) {
   INIT_LGAMMA;                             \
   INIT_LGAMMA_R;                           \
   INIT_DRAND48_R;                          \
+  INIT_RAND_R;                             \
   INIT_GETLINE;                            \
   INIT_ICONV;                              \
   INIT_TIMES;                              \
index 055a13f31d23850018ae3e3123260b5978835f31..dc559398cf2fed5eb2be4af0d3bd9c7195689d53 100644 (file)
 #define SANITIZER_INTERCEPT_LGAMMA SI_NOT_WINDOWS
 #define SANITIZER_INTERCEPT_LGAMMA_R SI_LINUX
 #define SANITIZER_INTERCEPT_DRAND48_R SI_LINUX_NOT_ANDROID
+#define SANITIZER_INTERCEPT_RAND_R SI_MAC || SI_LINUX_NOT_ANDROID
 #define SANITIZER_INTERCEPT_ICONV SI_LINUX_NOT_ANDROID
 #define SANITIZER_INTERCEPT_TIMES SI_NOT_WINDOWS
 
diff --git a/compiler-rt/test/msan/rand_r.cc b/compiler-rt/test/msan/rand_r.cc
new file mode 100644 (file)
index 0000000..57574f0
--- /dev/null
@@ -0,0 +1,18 @@
+// RUN: %clangxx_msan -m64 -O0 -g %s -o %t && %t
+// RUN: %clangxx_msan -m64 -O0 -g -DUNINIT %s -o %t && not %t 2>&1 | FileCheck %s
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(void) {
+  unsigned seed;
+#ifndef UNINIT
+  seed = 42;
+#endif
+  int v = rand_r(&seed);
+  // CHECK: MemorySanitizer: use-of-uninitialized-value
+  // CHECK: in main{{.*}}rand_r.cc:[[@LINE-2]]
+  if (v) printf(".\n");
+  return 0;
+}