116e0075746b21ed866ec3be21ef0d1e46f0efed5Kostya Serebryany//===-- sanitizer_libc.h ----------------------------------------*- C++ -*-===// 2b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// 3b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// The LLVM Compiler Infrastructure 4b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// 5b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// This file is distributed under the University of Illinois Open Source 6b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// License. See LICENSE.TXT for details. 7b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// 8b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany//===----------------------------------------------------------------------===// 9b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// 10b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// This file is shared between AddressSanitizer and ThreadSanitizer 11b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// run-time libraries. 12b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// These tools can not use some of the libc functions directly because those 13b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany// functions are intercepted. Instead, we implement a tiny subset of libc here. 14b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany//===----------------------------------------------------------------------===// 159aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryany#ifndef SANITIZER_LIBC_H 169aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryany#define SANITIZER_LIBC_H 17b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany 18a92c0cb873b67babb1aa4bc9aaa5c3b4d6c2772eAlexey Samsonov// ----------- ATTENTION ------------- 19a92c0cb873b67babb1aa4bc9aaa5c3b4d6c2772eAlexey Samsonov// This header should NOT include any other headers from sanitizer runtime. 20250f221ae0dee295098da8aa631977b6c2ebc99bEvgeniy Stepanov#include "sanitizer_internal_defs.h" 213836ff2733d40e1182e301ef7de3eff9469777aeAlexey Samsonov 22b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryanynamespace __sanitizer { 23b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany 243836ff2733d40e1182e301ef7de3eff9469777aeAlexey Samsonov// internal_X() is a custom implementation of X() for use in RTL. 251f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov 261f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov// String functions 27c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonovs64 internal_atoll(const char *nptr); 281f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovvoid *internal_memchr(const void *s, int c, uptr n); 29327c1c17d9557ed8b197f732c8a070fd6ba821b5Alexey Samsonovint internal_memcmp(const void* s1, const void* s2, uptr n); 30f7667cc84cdd8923c0b6c7cfc92b7bd5692ce18cAlexey Samsonovvoid *internal_memcpy(void *dest, const void *src, uptr n); 31f1673e61768cb08d488a75584b61bfdf24ffdac1Alexander Potapenkovoid *internal_memmove(void *dest, const void *src, uptr n); 324fac1482179c6bfd84fa129560caa43f341c7336Alexey Samsonov// Should not be used in performance-critical places. 334fac1482179c6bfd84fa129560caa43f341c7336Alexey Samsonovvoid *internal_memset(void *s, int c, uptr n); 3488207ab15125e2f1e9b3d541b735b2b8aba9b6d9Alexey Samsonovchar* internal_strchr(const char *s, int c); 35c0d78c1de1f2607c874020d27b72cf989c5ce092Alexey Samsonovint internal_strcmp(const char *s1, const char *s2); 36251134734f71a7e21a7bd17bc7b5821f07c803b2Alexey Samsonovuptr internal_strcspn(const char *s, const char *reject); 37f7667cc84cdd8923c0b6c7cfc92b7bd5692ce18cAlexey Samsonovchar *internal_strdup(const char *s); 38230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovuptr internal_strlen(const char *s); 39c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonovchar *internal_strncat(char *dst, const char *src, uptr n); 408cd0df78c317106be477c5496f481af0563a5208Alexey Samsonovint internal_strncmp(const char *s1, const char *s2, uptr n); 413836ff2733d40e1182e301ef7de3eff9469777aeAlexey Samsonovchar *internal_strncpy(char *dst, const char *src, uptr n); 42c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonovuptr internal_strnlen(const char *s, uptr maxlen); 434fac1482179c6bfd84fa129560caa43f341c7336Alexey Samsonovchar *internal_strrchr(const char *s, int c); 44c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonov// This is O(N^2), but we are not using it in hot places. 45c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonovchar *internal_strstr(const char *haystack, const char *needle); 46c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonov// Works only for base=10 and doesn't set errno. 47c925697df6626bb0ea27ea96539bf0580f8f3d3dAlexey Samsonovs64 internal_simple_strtoll(const char *nptr, char **endptr, int base); 48f882247088952deed954a19d745c2dd8871e2035Alexey Samsonovint internal_snprintf(char *buffer, uptr length, const char *format, ...); 493836ff2733d40e1182e301ef7de3eff9469777aeAlexey Samsonov 50eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// Return true if all bytes in [mem, mem+size) are zero. 51eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany// Optimized for the case when the result is true. 52eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryanybool mem_is_zero(const char *mem, uptr size); 53eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany 54eb2809311c94b73c269ccef8d68ae368642e5754Kostya Serebryany 551f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov// Memory 569578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_mmap(void *addr, uptr length, int prot, int flags, 579578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourne int fd, u64 offset); 589578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_munmap(void *addr, uptr length); 59c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 601f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov// I/O 61a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovconst fd_t kInvalidFd = -1; 62f3457cb9c3e1ddbbea07ee97b22ca387687b72e0Alexey Samsonovconst fd_t kStdinFd = 0; 63f3457cb9c3e1ddbbea07ee97b22ca387687b72e0Alexey Samsonovconst fd_t kStdoutFd = 1; 64f3457cb9c3e1ddbbea07ee97b22ca387687b72e0Alexey Samsonovconst fd_t kStderrFd = 2; 659578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_close(fd_t fd); 6684d57b4ce545d6c19effac01124749a9df0fd0a5Alexey Samsonovint internal_isatty(fd_t fd); 67ee7cc4454421a176d23442382afd9a01d36e7ad4Alexey Samsonov 68ee7cc4454421a176d23442382afd9a01d36e7ad4Alexey Samsonov// Use __sanitizer::OpenFile() instead. 699578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_open(const char *filename, int flags); 709578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_open(const char *filename, int flags, u32 mode); 71ee7cc4454421a176d23442382afd9a01d36e7ad4Alexey Samsonov 72a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_read(fd_t fd, void *buf, uptr count); 73a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_write(fd_t fd, const void *buf, uptr count); 74f882247088952deed954a19d745c2dd8871e2035Alexey Samsonov 75f882247088952deed954a19d745c2dd8871e2035Alexey Samsonov// OS 768e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovuptr internal_filesize(fd_t fd); // -1 on error. 779578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_stat(const char *path, void *buf); 789578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_lstat(const char *path, void *buf); 799578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_fstat(fd_t fd, void *buf); 809578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_dup2(int oldfd, int newfd); 81d1b8f588d6b712b6ff2b3d58c73d71614f520122Alexey Samsonovuptr internal_readlink(const char *path, char *buf, uptr bufsize); 829578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_unlink(const char *path); 83f882247088952deed954a19d745c2dd8871e2035Alexey Samsonovvoid NORETURN internal__exit(int exitcode); 849578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_lseek(fd_t fd, OFF_T offset, int whence); 856fb47af2d2d305adbfc3d41bea589d1527a364a9Kostya Serebryany 869578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_ptrace(int request, int pid, void *addr, void *data); 879578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_waitpid(int pid, int *status, int options); 880b694fcab9b2f33bdd6691cbea4e80a5c27191b1Peter Collingbourneuptr internal_getpid(); 899578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_getppid(); 90ae4d9caa4f47fa6abcd641719e9f520622940c17Alexey Samsonov 910969bcf2c936126b1f6e636b978aade8fc207437Alexey Samsonov// Threading 929578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourneuptr internal_sched_yield(); 939578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourne 949578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbourne// Error handling 959578a3ecfc35a264ede1135033398e2a77a6cad6Peter Collingbournebool internal_iserror(uptr retval, int *rverrno = 0); 960969bcf2c936126b1f6e636b978aade8fc207437Alexey Samsonov 97b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany} // namespace __sanitizer 98b3cedf98a3c8545da2234c2d35cb5d687984035fKostya Serebryany 999aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryany#endif // SANITIZER_LIBC_H 100