asan_interceptors.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //===-- asan_interceptors.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 a part of AddressSanitizer, an address sanity checker.
  10. //
  11. // ASan-private header for asan_interceptors.cpp
  12. //===----------------------------------------------------------------------===//
  13. #ifndef ASAN_INTERCEPTORS_H
  14. #define ASAN_INTERCEPTORS_H
  15. #include "asan_interceptors_memintrinsics.h"
  16. #include "asan_internal.h"
  17. #include "interception/interception.h"
  18. #include "sanitizer_common/sanitizer_platform.h"
  19. #include "sanitizer_common/sanitizer_platform_interceptors.h"
  20. namespace __asan {
  21. void InitializeAsanInterceptors();
  22. void InitializePlatformInterceptors();
  23. } // namespace __asan
  24. // There is no general interception at all on Fuchsia.
  25. // Only the functions in asan_interceptors_memintrinsics.h are
  26. // really defined to replace libc functions.
  27. #if !SANITIZER_FUCHSIA
  28. // Use macro to describe if specific function should be
  29. // intercepted on a given platform.
  30. #if !SANITIZER_WINDOWS
  31. # define ASAN_INTERCEPT__LONGJMP 1
  32. # define ASAN_INTERCEPT_INDEX 1
  33. # define ASAN_INTERCEPT_PTHREAD_CREATE 1
  34. #else
  35. # define ASAN_INTERCEPT__LONGJMP 0
  36. # define ASAN_INTERCEPT_INDEX 0
  37. # define ASAN_INTERCEPT_PTHREAD_CREATE 0
  38. #endif
  39. #if SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD || \
  40. SANITIZER_SOLARIS
  41. # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 1
  42. #else
  43. # define ASAN_USE_ALIAS_ATTRIBUTE_FOR_INDEX 0
  44. #endif
  45. #if SANITIZER_GLIBC || SANITIZER_SOLARIS
  46. # define ASAN_INTERCEPT_SWAPCONTEXT 1
  47. #else
  48. # define ASAN_INTERCEPT_SWAPCONTEXT 0
  49. #endif
  50. #if !SANITIZER_WINDOWS
  51. # define ASAN_INTERCEPT_SIGLONGJMP 1
  52. #else
  53. # define ASAN_INTERCEPT_SIGLONGJMP 0
  54. #endif
  55. #if SANITIZER_GLIBC
  56. # define ASAN_INTERCEPT___LONGJMP_CHK 1
  57. #else
  58. # define ASAN_INTERCEPT___LONGJMP_CHK 0
  59. #endif
  60. #if ASAN_HAS_EXCEPTIONS && !SANITIZER_SOLARIS && !SANITIZER_NETBSD && \
  61. (!SANITIZER_WINDOWS || (defined(__MINGW32__) && defined(__i386__)))
  62. # define ASAN_INTERCEPT___CXA_THROW 1
  63. # define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 1
  64. # if defined(_GLIBCXX_SJLJ_EXCEPTIONS) || (SANITIZER_IOS && defined(__arm__))
  65. # define ASAN_INTERCEPT__UNWIND_SJLJ_RAISEEXCEPTION 1
  66. # else
  67. # define ASAN_INTERCEPT__UNWIND_RAISEEXCEPTION 1
  68. # endif
  69. #else
  70. # define ASAN_INTERCEPT___CXA_THROW 0
  71. # define ASAN_INTERCEPT___CXA_RETHROW_PRIMARY_EXCEPTION 0
  72. # define ASAN_INTERCEPT__UNWIND_RAISEEXCEPTION 0
  73. # define ASAN_INTERCEPT__UNWIND_SJLJ_RAISEEXCEPTION 0
  74. #endif
  75. #if !SANITIZER_WINDOWS
  76. # define ASAN_INTERCEPT___CXA_ATEXIT 1
  77. #else
  78. # define ASAN_INTERCEPT___CXA_ATEXIT 0
  79. #endif
  80. #if SANITIZER_NETBSD
  81. # define ASAN_INTERCEPT_ATEXIT 1
  82. #else
  83. # define ASAN_INTERCEPT_ATEXIT 0
  84. #endif
  85. #if SANITIZER_GLIBC
  86. # define ASAN_INTERCEPT___STRDUP 1
  87. #else
  88. # define ASAN_INTERCEPT___STRDUP 0
  89. #endif
  90. #if SANITIZER_GLIBC && ASAN_INTERCEPT_PTHREAD_CREATE
  91. # define ASAN_INTERCEPT_TIMEDJOIN 1
  92. # define ASAN_INTERCEPT_TRYJOIN 1
  93. #else
  94. # define ASAN_INTERCEPT_TIMEDJOIN 0
  95. # define ASAN_INTERCEPT_TRYJOIN 0
  96. #endif
  97. #if SANITIZER_LINUX && \
  98. (defined(__arm__) || defined(__aarch64__) || defined(__i386__) || \
  99. defined(__x86_64__) || SANITIZER_RISCV64 || SANITIZER_LOONGARCH64)
  100. # define ASAN_INTERCEPT_VFORK 1
  101. #else
  102. # define ASAN_INTERCEPT_VFORK 0
  103. #endif
  104. #if SANITIZER_NETBSD
  105. # define ASAN_INTERCEPT_PTHREAD_ATFORK 1
  106. #else
  107. # define ASAN_INTERCEPT_PTHREAD_ATFORK 0
  108. #endif
  109. DECLARE_REAL(int, memcmp, const void *a1, const void *a2, uptr size)
  110. DECLARE_REAL(char*, strchr, const char *str, int c)
  111. DECLARE_REAL(SIZE_T, strlen, const char *s)
  112. DECLARE_REAL(char*, strncpy, char *to, const char *from, uptr size)
  113. DECLARE_REAL(uptr, strnlen, const char *s, uptr maxlen)
  114. DECLARE_REAL(char*, strstr, const char *s1, const char *s2)
  115. # if !SANITIZER_APPLE
  116. # define ASAN_INTERCEPT_FUNC(name) \
  117. do { \
  118. if (!INTERCEPT_FUNCTION(name)) \
  119. VReport(1, "AddressSanitizer: failed to intercept '%s'\n", #name); \
  120. } while (0)
  121. # define ASAN_INTERCEPT_FUNC_VER(name, ver) \
  122. do { \
  123. if (!INTERCEPT_FUNCTION_VER(name, ver)) \
  124. VReport(1, "AddressSanitizer: failed to intercept '%s@@%s'\n", \
  125. #name, ver); \
  126. } while (0)
  127. # define ASAN_INTERCEPT_FUNC_VER_UNVERSIONED_FALLBACK(name, ver) \
  128. do { \
  129. if (!INTERCEPT_FUNCTION_VER(name, ver) && !INTERCEPT_FUNCTION(name)) \
  130. VReport(1, \
  131. "AddressSanitizer: failed to intercept '%s@@%s' or '%s'\n", \
  132. #name, ver, #name); \
  133. } while (0)
  134. # else
  135. // OS X interceptors don't need to be initialized with INTERCEPT_FUNCTION.
  136. # define ASAN_INTERCEPT_FUNC(name)
  137. # endif // SANITIZER_APPLE
  138. #define ASAN_INTERCEPTOR_ENTER(ctx, func) \
  139. AsanInterceptorContext _ctx = {#func}; \
  140. ctx = (void *)&_ctx; \
  141. (void) ctx;
  142. #define COMMON_INTERCEPT_FUNCTION(name) ASAN_INTERCEPT_FUNC(name)
  143. #endif // !SANITIZER_FUCHSIA
  144. #endif // ASAN_INTERCEPTORS_H