[llvm-commits] [compiler-rt] r150812 - in /compiler-rt/trunk/lib/asan: asan_interceptors.cc asan_interceptors.h asan_rtl.cc

Alexey Samsonov samsonov at google.com
Fri Feb 17 08:15:09 PST 2012


Author: samsonov
Date: Fri Feb 17 10:15:09 2012
New Revision: 150812

URL: http://llvm.org/viewvc/llvm-project?rev=150812&view=rev
Log:
AddressSanitizer: use custom strtol/atoll functions

Modified:
    compiler-rt/trunk/lib/asan/asan_interceptors.cc
    compiler-rt/trunk/lib/asan/asan_interceptors.h
    compiler-rt/trunk/lib/asan/asan_rtl.cc

Modified: compiler-rt/trunk/lib/asan/asan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=150812&r1=150811&r2=150812&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_interceptors.cc Fri Feb 17 10:15:09 2012
@@ -24,7 +24,7 @@
 #include "interception/interception.h"
 
 #include <new>
-#include <ctype.h>
+#include <limits.h>
 
 #if defined(_WIN32)
 // FIXME: remove when we start intercepting on Windows. Currently it's needed to
@@ -102,6 +102,56 @@
   } \
 } while (0)
 
+static inline bool IsSpace(int c) {
+  return (c == ' ') || (c == '\n') || (c == '\t') ||
+         (c == '\f') || (c == '\r') || (c == '\v');
+}
+
+static inline bool IsDigit(int c) {
+  return (c >= '0') && (c <= '9');
+}
+
+static inline int ToLower(int c) {
+  return (c >= 'A' && c <= 'Z') ? (c + 'a' - 'A') : c;
+}
+
+// ---------------------- Internal string functions ---------------- {{{1
+
+int64_t internal_simple_strtoll(const char *nptr, char **endptr, int base) {
+  CHECK(base == 10);
+  while (IsSpace(*nptr)) nptr++;
+  int sgn = 1;
+  uint64_t res = 0;
+  bool have_digits = false;
+  char *old_nptr = (char*)nptr;
+  if (*nptr == '+') {
+    sgn = 1;
+    nptr++;
+  } else if (*nptr == '-') {
+    sgn = -1;
+    nptr++;
+  }
+  while (IsDigit(*nptr)) {
+    res = (res <= ULLONG_MAX / 10) ? res * 10 : ULLONG_MAX;
+    int digit = ((*nptr) - '0');
+    res = (res <= ULLONG_MAX - digit) ? res + digit : ULLONG_MAX;
+    have_digits = true;
+    nptr++;
+  }
+  if (endptr != NULL) {
+    *endptr = (have_digits) ? (char*)nptr : old_nptr;
+  }
+  if (sgn > 0) {
+    return (int64_t)(Min((uint64_t)LLONG_MAX, res));
+  } else {
+    return (res > LLONG_MAX) ? LLONG_MIN : ((int64_t)res * -1);
+  }
+}
+
+int64_t internal_atoll(const char *nptr) {
+  return internal_simple_strtoll(nptr, (char**)NULL, 10);
+}
+
 size_t internal_strlen(const char *s) {
   size_t i = 0;
   while (s[i]) i++;
@@ -314,8 +364,8 @@
 }
 
 static inline int CharCaseCmp(unsigned char c1, unsigned char c2) {
-  int c1_low = tolower(c1);
-  int c2_low = tolower(c2);
+  int c1_low = ToLower(c1);
+  int c2_low = ToLower(c2);
   return c1_low - c2_low;
 }
 

Modified: compiler-rt/trunk/lib/asan/asan_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.h?rev=150812&r1=150811&r2=150812&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interceptors.h (original)
+++ compiler-rt/trunk/lib/asan/asan_interceptors.h Fri Feb 17 10:15:09 2012
@@ -31,6 +31,7 @@
 namespace __asan {
 
 // __asan::internal_X() is the implementation of X() for use in RTL.
+int64_t internal_atoll(const char *nptr);
 size_t internal_strlen(const char *s);
 size_t internal_strnlen(const char *s, size_t maxlen);
 char* internal_strchr(const char *s, int c);
@@ -39,6 +40,8 @@
 char *internal_strstr(const char *haystack, const char *needle);
 char *internal_strncat(char *dst, const char *src, size_t n);
 int internal_strcmp(const char *s1, const char *s2);
+// Works only for base=10 and doesn't set errno.
+int64_t internal_simple_strtoll(const char *nptr, char **endptr, int base);
 
 void InitializeAsanInterceptors();
 

Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=150812&r1=150811&r2=150812&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_rtl.cc Fri Feb 17 10:15:09 2012
@@ -172,16 +172,16 @@
          addr, offset, buf, t->tid());
   // Report the number of stack objects.
   char *p;
-  size_t n_objects = strtol(name_end, &p, 10);
+  size_t n_objects = internal_simple_strtoll(name_end, &p, 10);
   CHECK(n_objects > 0);
   Printf("  This frame has %ld object(s):\n", n_objects);
   // Report all objects in this frame.
   for (size_t i = 0; i < n_objects; i++) {
     size_t beg, size;
     intptr_t len;
-    beg  = strtol(p, &p, 10);
-    size = strtol(p, &p, 10);
-    len  = strtol(p, &p, 10);
+    beg  = internal_simple_strtoll(p, &p, 10);
+    size = internal_simple_strtoll(p, &p, 10);
+    len  = internal_simple_strtoll(p, &p, 10);
     if (beg <= 0 || size <= 0 || len < 0 || *p != ' ') {
       Printf("AddressSanitizer can't parse the stack frame descriptor: |%s|\n",
              frame_descr);
@@ -258,20 +258,12 @@
 }
 
 // -------------------------- Init ------------------- {{{1
-#if defined(_WIN32)
-// atoll is not defined on Windows.
-int64_t atoll(const char *str) {
-  UNIMPLEMENTED();
-  return -1;
-}
-#endif
-
 static int64_t IntFlagValue(const char *flags, const char *flag,
                             int64_t default_val) {
   if (!flags) return default_val;
   const char *str = internal_strstr(flags, flag);
   if (!str) return default_val;
-  return atoll(str + internal_strlen(flag));
+  return internal_atoll(str + internal_strlen(flag));
 }
 
 static void asan_atexit() {





More information about the llvm-commits mailing list