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