1 | //===-- sanitizer_libc.h ----------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file is shared between AddressSanitizer and ThreadSanitizer |
10 | // run-time libraries. |
11 | // These tools can not use some of the libc functions directly because those |
12 | // functions are intercepted. Instead, we implement a tiny subset of libc here. |
13 | // FIXME: Some of functions declared in this file are in fact POSIX, not libc. |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | #ifndef SANITIZER_LIBC_H |
17 | #define SANITIZER_LIBC_H |
18 | |
19 | // ----------- ATTENTION ------------- |
20 | // This header should NOT include any other headers from sanitizer runtime. |
21 | #include "sanitizer_internal_defs.h" |
22 | |
23 | namespace __sanitizer { |
24 | |
25 | // internal_X() is a custom implementation of X() for use in RTL. |
26 | |
27 | extern "C" { |
28 | // These are used as builtin replacements; see sanitizer_redefine_builtins.h. |
29 | // In normal runtime code, use the __sanitizer::internal_X() aliases instead. |
30 | SANITIZER_INTERFACE_ATTRIBUTE void *__sanitizer_internal_memcpy(void *dest, |
31 | const void *src, |
32 | uptr n); |
33 | SANITIZER_INTERFACE_ATTRIBUTE void *__sanitizer_internal_memmove( |
34 | void *dest, const void *src, uptr n); |
35 | SANITIZER_INTERFACE_ATTRIBUTE void *__sanitizer_internal_memset(void *s, int c, |
36 | uptr n); |
37 | } // extern "C" |
38 | |
39 | // String functions |
40 | s64 internal_atoll(const char *nptr); |
41 | void *internal_memchr(const void *s, int c, uptr n); |
42 | void *internal_memrchr(const void *s, int c, uptr n); |
43 | int internal_memcmp(const void* s1, const void* s2, uptr n); |
44 | ALWAYS_INLINE void *internal_memcpy(void *dest, const void *src, uptr n) { |
45 | return __sanitizer_internal_memcpy(dest, src, n); |
46 | } |
47 | ALWAYS_INLINE void *internal_memmove(void *dest, const void *src, uptr n) { |
48 | return __sanitizer_internal_memmove(dest, src, n); |
49 | } |
50 | // Should not be used in performance-critical places. |
51 | ALWAYS_INLINE void *internal_memset(void *s, int c, uptr n) { |
52 | return __sanitizer_internal_memset(s, c, n); |
53 | } |
54 | char* internal_strchr(const char *s, int c); |
55 | char *internal_strchrnul(const char *s, int c); |
56 | int internal_strcmp(const char *s1, const char *s2); |
57 | uptr internal_strcspn(const char *s, const char *reject); |
58 | char *internal_strdup(const char *s); |
59 | uptr internal_strlen(const char *s); |
60 | uptr internal_strlcat(char *dst, const char *src, uptr maxlen); |
61 | char *internal_strncat(char *dst, const char *src, uptr n); |
62 | int internal_strncmp(const char *s1, const char *s2, uptr n); |
63 | uptr internal_strlcpy(char *dst, const char *src, uptr maxlen); |
64 | char *internal_strncpy(char *dst, const char *src, uptr n); |
65 | uptr internal_strnlen(const char *s, uptr maxlen); |
66 | char *internal_strrchr(const char *s, int c); |
67 | char *internal_strstr(const char *haystack, const char *needle); |
68 | // Works only for base=10 and doesn't set errno. |
69 | s64 internal_simple_strtoll(const char *nptr, const char **endptr, int base); |
70 | int internal_snprintf(char *buffer, uptr length, const char *format, ...) |
71 | FORMAT(3, 4); |
72 | uptr internal_wcslen(const wchar_t *s); |
73 | uptr internal_wcsnlen(const wchar_t *s, uptr maxlen); |
74 | wchar_t *internal_wcscpy(wchar_t *dst, const wchar_t *src); |
75 | wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr maxlen); |
76 | // Return true if all bytes in [mem, mem+size) are zero. |
77 | // Optimized for the case when the result is true. |
78 | bool mem_is_zero(const char *mem, uptr size); |
79 | |
80 | // I/O |
81 | // Define these as macros so we can use them in linker initialized global |
82 | // structs without dynamic initialization. |
83 | #define kInvalidFd ((fd_t)-1) |
84 | #define kStdinFd ((fd_t)0) |
85 | #define kStdoutFd ((fd_t)1) |
86 | #define kStderrFd ((fd_t)2) |
87 | |
88 | uptr internal_ftruncate(fd_t fd, uptr size); |
89 | |
90 | // OS |
91 | void NORETURN internal__exit(int exitcode); |
92 | void internal_sleep(unsigned seconds); |
93 | void internal_usleep(u64 useconds); |
94 | |
95 | uptr internal_getpid(); |
96 | uptr internal_getppid(); |
97 | |
98 | int internal_dlinfo(void *handle, int request, void *p); |
99 | |
100 | // Threading |
101 | uptr internal_sched_yield(); |
102 | |
103 | // Error handling |
104 | bool internal_iserror(uptr retval, int *rverrno = nullptr); |
105 | |
106 | } // namespace __sanitizer |
107 | |
108 | #endif // SANITIZER_LIBC_H |
109 | |