+#if HAVE_SANITIZE_ADDRESS
+#include <sanitizer/asan_interface.h>
+static void* asan_safe_memcpy(void* dest, void* src, size_t n)
+{
+ char* psrc = static_cast<char*>(src);
+ char* pdest = static_cast<char*>(dest);
+ for (size_t i = 0; i < n;) {
+ while (i < n && __asan_address_is_poisoned(psrc + i))
+ ++i;
+ if (i < n) {
+ char* p = static_cast<char*>(__asan_region_is_poisoned(psrc + i, n - i));
+ size_t j = p ? (p - psrc) : n;
+ memcpy(pdest + i, psrc + i, j - i);
+ i = j;
+ }
+ }
+ return dest;
+}
+#else
+#define asan_safe_memcpy(dest, src, n) memcpy(dest, src, n)
+#endif