sanitizer_libc.cc revision 88207ab15125e2f1e9b3d541b735b2b8aba9b6d9
19e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com//===-- sanitizer_libc.cc -------------------------------------------------===// 29e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// 39e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// The LLVM Compiler Infrastructure 49e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// 59e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// This file is distributed under the University of Illinois Open Source 69e49fb63d355446b91d20ff78ad78b297e89a50dcaryclark@google.com// License. See LICENSE.TXT for details. 7235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com// 8235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com//===----------------------------------------------------------------------===// 9235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com// 108dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com// This file is shared between AddressSanitizer and ThreadSanitizer 116d0032a8ec680221c2a704cac2391f2a2d77546fcaryclark@google.com// run-time libraries. See sanitizer_libc.h for details. 128dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com//===----------------------------------------------------------------------===// 1373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com#include "sanitizer_common.h" 149d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com#include "sanitizer_libc.h" 159d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com 169d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.comnamespace __sanitizer { 179d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.com 181304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.comvoid MiniLibcStub() { 1927accef223a27fba437f5e825d99edbae20a045bcaryclark@google.com} 20d68bc309bbc3f0f4c3107cf4fa60ce1ff4847b75caryclark@google.com 21d68bc309bbc3f0f4c3107cf4fa60ce1ff4847b75caryclark@google.comvoid *internal_memchr(const void *s, int c, uptr n) { 2273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com const char* t = (char*)s; 23c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com for (uptr i = 0; i < n; ++i, ++t) 241304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com if (*t == c) 259f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.com return (void*)t; 269f60291c5375457f8adf228dbe6e8ff1186b13e1caryclark@google.com return 0; 2773ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com} 2805c4bad470722bc4e5e6ae3d79aa8bcf9e732f06caryclark@google.com 2905c4bad470722bc4e5e6ae3d79aa8bcf9e732f06caryclark@google.comint internal_memcmp(const void* s1, const void* s2, uptr n) { 307ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com const char* t1 = (char*)s1; 317ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com const char* t2 = (char*)s2; 321304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com for (uptr i = 0; i < n; ++i, ++t1, ++t2) 3373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com if (*t1 != *t2) 341304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com return *t1 < *t2 ? -1 : 1; 351304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com return 0; 368dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com} 371304bb25aa3b0baa61fc2e2900fabcef88801b59caryclark@google.com 389d5f99bc309a7d733e33a149bef295ae3c8b3ac1caryclark@google.comvoid *internal_memcpy(void *dest, const void *src, uptr n) { 39c83c70e911a38aea03db4af8dd9841d0d77bd129caryclark@google.com char *d = (char*)dest; 4045a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.com char *s = (char*)src; 418dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com for (uptr i = 0; i < n; ++i) 4245a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.com d[i] = s[i]; 43235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com return dest; 447ff5c841bf669826b4cbd708ae1a6b3527f15dcacaryclark@google.com} 45beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com 46235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.comvoid *internal_memset(void* s, int c, uptr n) { 47 // The next line prevents Clang from making a call to memset() instead of the 48 // loop below. 49 // FIXME: building the runtime with -ffreestanding is a better idea. However 50 // there currently are linktime problems due to PR12396. 51 char volatile *t = (char*)s; 52 for (uptr i = 0; i < n; ++i, ++t) { 53 *t = c; 54 } 55 return s; 56} 57 58char* internal_strdup(const char *s) { 59 uptr len = internal_strlen(s); 60 char *s2 = (char*)InternalAlloc(len + 1); 61 internal_memcpy(s2, s, len); 62 s2[len] = 0; 63 return s2; 64} 65 66int internal_strcmp(const char *s1, const char *s2) { 67 while (true) { 68 unsigned c1 = *s1; 69 unsigned c2 = *s2; 70 if (c1 != c2) return (c1 < c2) ? -1 : 1; 71 if (c1 == 0) break; 72 s1++; 73 s2++; 74 } 75 return 0; 76} 77 78char* internal_strchr(const char *s, int c) { 79 while (true) { 80 if (*s == (char)c) 81 return (char*)s; 82 if (*s == 0) 83 return 0; 84 s++; 85 } 86} 87 88char *internal_strrchr(const char *s, int c) { 89 const char *res = 0; 90 for (uptr i = 0; s[i]; i++) { 91 if (s[i] == c) res = s + i; 92 } 93 return (char*)res; 94} 95 96uptr internal_strlen(const char *s) { 97 uptr i = 0; 98 while (s[i]) i++; 99 return i; 100} 101 102char *internal_strncpy(char *dst, const char *src, uptr n) { 103 uptr i; 104 for (i = 0; i < n && src[i]; i++) 105 dst[i] = src[i]; 106 for (; i < n; i++) 107 dst[i] = '\0'; 108 return dst; 109} 110 111} // namespace __sanitizer 112