xref: /freebsd/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_libc.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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