10b57cec5SDimitry Andric //===-- sanitizer_libc.h ----------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file is shared between AddressSanitizer and ThreadSanitizer 100b57cec5SDimitry Andric // run-time libraries. 110b57cec5SDimitry Andric // These tools can not use some of the libc functions directly because those 120b57cec5SDimitry Andric // functions are intercepted. Instead, we implement a tiny subset of libc here. 130b57cec5SDimitry Andric // FIXME: Some of functions declared in this file are in fact POSIX, not libc. 140b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #ifndef SANITIZER_LIBC_H 170b57cec5SDimitry Andric #define SANITIZER_LIBC_H 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric // ----------- ATTENTION ------------- 200b57cec5SDimitry Andric // This header should NOT include any other headers from sanitizer runtime. 210b57cec5SDimitry Andric #include "sanitizer_internal_defs.h" 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric namespace __sanitizer { 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric // internal_X() is a custom implementation of X() for use in RTL. 260b57cec5SDimitry Andric 2706c3fb27SDimitry Andric extern "C" { 2806c3fb27SDimitry Andric // These are used as builtin replacements; see sanitizer_redefine_builtins.h. 2906c3fb27SDimitry Andric // In normal runtime code, use the __sanitizer::internal_X() aliases instead. 3006c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE void *__sanitizer_internal_memcpy(void *dest, 3106c3fb27SDimitry Andric const void *src, 3206c3fb27SDimitry Andric uptr n); 3306c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE void *__sanitizer_internal_memmove( 3406c3fb27SDimitry Andric void *dest, const void *src, uptr n); 3506c3fb27SDimitry Andric SANITIZER_INTERFACE_ATTRIBUTE void *__sanitizer_internal_memset(void *s, int c, 3606c3fb27SDimitry Andric uptr n); 3706c3fb27SDimitry Andric } // extern "C" 3806c3fb27SDimitry Andric 390b57cec5SDimitry Andric // String functions 400b57cec5SDimitry Andric s64 internal_atoll(const char *nptr); 410b57cec5SDimitry Andric void *internal_memchr(const void *s, int c, uptr n); 420b57cec5SDimitry Andric void *internal_memrchr(const void *s, int c, uptr n); 430b57cec5SDimitry Andric int internal_memcmp(const void* s1, const void* s2, uptr n); 4406c3fb27SDimitry Andric ALWAYS_INLINE void *internal_memcpy(void *dest, const void *src, uptr n) { 4506c3fb27SDimitry Andric return __sanitizer_internal_memcpy(dest, src, n); 4606c3fb27SDimitry Andric } 4706c3fb27SDimitry Andric ALWAYS_INLINE void *internal_memmove(void *dest, const void *src, uptr n) { 4806c3fb27SDimitry Andric return __sanitizer_internal_memmove(dest, src, n); 4906c3fb27SDimitry Andric } 500b57cec5SDimitry Andric // Should not be used in performance-critical places. 5106c3fb27SDimitry Andric ALWAYS_INLINE void *internal_memset(void *s, int c, uptr n) { 5206c3fb27SDimitry Andric return __sanitizer_internal_memset(s, c, n); 5306c3fb27SDimitry Andric } 540b57cec5SDimitry Andric char* internal_strchr(const char *s, int c); 550b57cec5SDimitry Andric char *internal_strchrnul(const char *s, int c); 560b57cec5SDimitry Andric int internal_strcmp(const char *s1, const char *s2); 570b57cec5SDimitry Andric uptr internal_strcspn(const char *s, const char *reject); 580b57cec5SDimitry Andric char *internal_strdup(const char *s); 590b57cec5SDimitry Andric uptr internal_strlen(const char *s); 600b57cec5SDimitry Andric uptr internal_strlcat(char *dst, const char *src, uptr maxlen); 610b57cec5SDimitry Andric char *internal_strncat(char *dst, const char *src, uptr n); 620b57cec5SDimitry Andric int internal_strncmp(const char *s1, const char *s2, uptr n); 630b57cec5SDimitry Andric uptr internal_strlcpy(char *dst, const char *src, uptr maxlen); 640b57cec5SDimitry Andric char *internal_strncpy(char *dst, const char *src, uptr n); 650b57cec5SDimitry Andric uptr internal_strnlen(const char *s, uptr maxlen); 660b57cec5SDimitry Andric char *internal_strrchr(const char *s, int c); 670b57cec5SDimitry Andric char *internal_strstr(const char *haystack, const char *needle); 680b57cec5SDimitry Andric // Works only for base=10 and doesn't set errno. 690b57cec5SDimitry Andric s64 internal_simple_strtoll(const char *nptr, const char **endptr, int base); 70349cc55cSDimitry Andric int internal_snprintf(char *buffer, uptr length, const char *format, ...) 71349cc55cSDimitry Andric FORMAT(3, 4); 72349cc55cSDimitry Andric uptr internal_wcslen(const wchar_t *s); 73349cc55cSDimitry Andric uptr internal_wcsnlen(const wchar_t *s, uptr maxlen); 74*5f757f3fSDimitry Andric wchar_t *internal_wcscpy(wchar_t *dst, const wchar_t *src); 75*5f757f3fSDimitry Andric wchar_t *internal_wcsncpy(wchar_t *dst, const wchar_t *src, uptr maxlen); 760b57cec5SDimitry Andric // Return true if all bytes in [mem, mem+size) are zero. 770b57cec5SDimitry Andric // Optimized for the case when the result is true. 780b57cec5SDimitry Andric bool mem_is_zero(const char *mem, uptr size); 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric // I/O 810b57cec5SDimitry Andric // Define these as macros so we can use them in linker initialized global 820b57cec5SDimitry Andric // structs without dynamic initialization. 830b57cec5SDimitry Andric #define kInvalidFd ((fd_t)-1) 840b57cec5SDimitry Andric #define kStdinFd ((fd_t)0) 850b57cec5SDimitry Andric #define kStdoutFd ((fd_t)1) 860b57cec5SDimitry Andric #define kStderrFd ((fd_t)2) 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric uptr internal_ftruncate(fd_t fd, uptr size); 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric // OS 910b57cec5SDimitry Andric void NORETURN internal__exit(int exitcode); 92fe6060f1SDimitry Andric void internal_sleep(unsigned seconds); 93fe6060f1SDimitry Andric void internal_usleep(u64 useconds); 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric uptr internal_getpid(); 960b57cec5SDimitry Andric uptr internal_getppid(); 970b57cec5SDimitry Andric 985ffd83dbSDimitry Andric int internal_dlinfo(void *handle, int request, void *p); 995ffd83dbSDimitry Andric 1000b57cec5SDimitry Andric // Threading 1010b57cec5SDimitry Andric uptr internal_sched_yield(); 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric // Error handling 1040b57cec5SDimitry Andric bool internal_iserror(uptr retval, int *rverrno = nullptr); 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric } // namespace __sanitizer 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric #endif // SANITIZER_LIBC_H 109