3#ifndef GAIA_USE_MEM_SANI
4 #if defined(__has_feature)
5 #if __has_feature(address_sanitizer)
6 #define GAIA_HAS_SANI_FEATURE 1
8 #define GAIA_HAS_SANI_FEATURE 0
10 #if (GAIA_HAS_SANI_FEATURE && GAIA_USE_SANITIZER) || defined(__SANITIZE_ADDRESS__)
11 #define GAIA_USE_MEM_SANI 1
13 #define GAIA_USE_MEM_SANI 0
16 #if GAIA_USE_SANITIZER || defined(__SANITIZE_ADDRESS__)
17 #define GAIA_USE_MEM_SANI 1
19 #define GAIA_USE_MEM_SANI 0
25 #include <sanitizer/asan_interface.h>
28inline void GAIA_MEM_SANI_ADD_BLOCK(
size_t type_size,
void* ptr,
size_t cap,
size_t size) {
32 __sanitizer_annotate_contiguous_container(
34 (
unsigned char*)(ptr) + ((cap)*type_size),
36 (
unsigned char*)(ptr) + ((size)*type_size));
40inline void GAIA_MEM_SANI_DEL_BLOCK(
size_t type_size,
void* ptr,
size_t cap,
size_t size) {
44 __sanitizer_annotate_contiguous_container(
46 (
unsigned char*)(ptr) + ((cap)*type_size),
47 (
unsigned char*)(ptr) + ((size)*type_size),
52inline void GAIA_MEM_SANI_PUSH_N(
size_t type_size,
void* ptr,
size_t cap,
size_t size,
size_t diff) {
56 __sanitizer_annotate_contiguous_container(
58 (
unsigned char*)(ptr) + ((cap)*type_size),
59 (
unsigned char*)(ptr) + ((size)*type_size),
60 (
unsigned char*)(ptr) + (((size) + (diff)) * type_size));
63inline void GAIA_MEM_SANI_POP_N(
size_t type_size,
void* ptr,
size_t cap,
size_t size,
size_t diff) {
67 __sanitizer_annotate_contiguous_container(
69 (
unsigned char*)(ptr) + ((cap)*type_size),
70 (
unsigned char*)(ptr) + ((size)*type_size),
71 (
unsigned char*)(ptr) + (((size) - (diff)) * type_size));
75 #define GAIA_MEM_SANI_PUSH(type_size, ptr, cap, size) GAIA_MEM_SANI_PUSH_N(type_size, ptr, cap, size, 1)
77 #define GAIA_MEM_SANI_POP(type_size, ptr, cap, size) GAIA_MEM_SANI_POP_N(type_size, ptr, cap, size, 1)
80 #define GAIA_MEM_SANI_ADD_BLOCK(type_size, ptr, cap, size) ((void)(type_size), (void)(ptr), (void)(cap), (void)(size))
81 #define GAIA_MEM_SANI_DEL_BLOCK(type_size, ptr, cap, size) ((void)(type_size), (void)(ptr), (void)(cap), (void)(size))
82 #define GAIA_MEM_SANI_PUSH_N(type_size, ptr, cap, size, diff) \
83 ((void)(type_size), (void)(ptr), (void)(cap), (void)(size), (void)(diff))
84 #define GAIA_MEM_SANI_POP_N(type_size, ptr, cap, size, diff) \
85 ((void)(type_size), (void)(ptr), (void)(cap), (void)(size), (void)(diff))
86 #define GAIA_MEM_SANI_PUSH(type_size, ptr, cap, size) ((void)(type_size), (void)(ptr), (void)(cap), (void)(size))
87 #define GAIA_MEM_SANI_POP(type_size, ptr, cap, size) ((void)(type_size), (void)(ptr), (void)(cap), (void)(size))