sanitizer_libc.cc revision 4fac1482179c6bfd84fa129560caa43f341c7336
1//===-- sanitizer_libc.cc -------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is shared between AddressSanitizer and ThreadSanitizer 11// run-time libraries. See sanitizer_libc.h for details. 12//===----------------------------------------------------------------------===// 13#include "sanitizer_common.h" 14#include "sanitizer_libc.h" 15 16namespace __sanitizer { 17 18void MiniLibcStub() { 19} 20 21void *internal_memchr(const void *s, int c, uptr n) { 22 const char* t = (char*)s; 23 for (uptr i = 0; i < n; ++i, ++t) 24 if (*t == c) 25 return (void*)t; 26 return 0; 27} 28 29void *internal_memcpy(void *dest, const void *src, uptr n) { 30 char *d = (char*)dest; 31 char *s = (char*)src; 32 for (uptr i = 0; i < n; ++i) 33 d[i] = s[i]; 34 return dest; 35} 36 37void *internal_memset(void* s, int c, uptr n) { 38 // The next line prevents Clang from making a call to memset() instead of the 39 // loop below. 40 // FIXME: building the runtime with -ffreestanding is a better idea. However 41 // there currently are linktime problems due to PR12396. 42 char volatile *t = (char*)s; 43 for (uptr i = 0; i < n; ++i, ++t) { 44 *t = c; 45 } 46 return s; 47} 48 49char* internal_strdup(const char *s) { 50 uptr len = internal_strlen(s); 51 char *s2 = (char*)InternalAlloc(len + 1); 52 internal_memcpy(s2, s, len); 53 s2[len] = 0; 54 return s2; 55} 56 57int internal_strcmp(const char *s1, const char *s2) { 58 while (true) { 59 unsigned c1 = *s1; 60 unsigned c2 = *s2; 61 if (c1 != c2) return (c1 < c2) ? -1 : 1; 62 if (c1 == 0) break; 63 s1++; 64 s2++; 65 } 66 return 0; 67} 68 69char *internal_strrchr(const char *s, int c) { 70 const char *res = 0; 71 for (uptr i = 0; s[i]; i++) { 72 if (s[i] == c) res = s + i; 73 } 74 return (char*)res; 75} 76 77uptr internal_strlen(const char *s) { 78 uptr i = 0; 79 while (s[i]) i++; 80 return i; 81} 82 83char *internal_strncpy(char *dst, const char *src, uptr n) { 84 uptr i; 85 for (i = 0; i < n && src[i]; i++) 86 dst[i] = src[i]; 87 for (; i < n; i++) 88 dst[i] = '\0'; 89 return dst; 90} 91 92} // namespace __sanitizer 93