Gaia-ECS v0.9.3
A simple and powerful entity component system
Loading...
Searching...
No Matches
mem_sani.h
1#pragma once
2
3#ifndef GAIA_USE_MEM_SANI
4 #if defined(__has_feature)
5 #if __has_feature(address_sanitizer)
6 #define GAIA_HAS_SANI_FEATURE 1
7 #else
8 #define GAIA_HAS_SANI_FEATURE 0
9 #endif
10 #if (GAIA_HAS_SANI_FEATURE && GAIA_USE_SANITIZER) || defined(__SANITIZE_ADDRESS__)
11 #define GAIA_USE_MEM_SANI 1
12 #else
13 #define GAIA_USE_MEM_SANI 0
14 #endif
15 #else
16 #if GAIA_USE_SANITIZER || defined(__SANITIZE_ADDRESS__)
17 #define GAIA_USE_MEM_SANI 1
18 #else
19 #define GAIA_USE_MEM_SANI 0
20 #endif
21 #endif
22#endif
23
24#if GAIA_USE_MEM_SANI
25 #include <sanitizer/asan_interface.h>
26
27// Poison a new contiguous block of memory
28inline void GAIA_MEM_SANI_ADD_BLOCK(size_t type_size, void* ptr, size_t cap, size_t size) {
29 if (ptr == nullptr)
30 return;
31
32 __sanitizer_annotate_contiguous_container(
33 ptr,
34 (unsigned char*)(ptr) + ((cap)*type_size),
35 ptr,
36 (unsigned char*)(ptr) + ((size)*type_size));
37}
38
39// Unpoison an existing contiguous block of buffer
40inline void GAIA_MEM_SANI_DEL_BLOCK(size_t type_size, void* ptr, size_t cap, size_t size) {
41 if (ptr == nullptr)
42 return;
43
44 __sanitizer_annotate_contiguous_container(
45 ptr,
46 (unsigned char*)(ptr) + ((cap)*type_size),
47 (unsigned char*)(ptr) + ((size)*type_size),
48 ptr);
49}
50
51// Unpoison memory for N new elements, use before adding the elements
52inline void GAIA_MEM_SANI_PUSH_N(size_t type_size, void* ptr, size_t cap, size_t size, size_t diff) {
53 if (ptr == nullptr)
54 return;
55
56 __sanitizer_annotate_contiguous_container(
57 ptr,
58 (unsigned char*)(ptr) + ((cap)*type_size),
59 (unsigned char*)(ptr) + ((size)*type_size),
60 (unsigned char*)(ptr) + (((size) + (diff)) * type_size));
61}
62// Poison memory for last N elements, use after removing the elements
63inline void GAIA_MEM_SANI_POP_N(size_t type_size, void* ptr, size_t cap, size_t size, size_t diff) {
64 if (ptr == nullptr)
65 return;
66
67 __sanitizer_annotate_contiguous_container(
68 ptr,
69 (unsigned char*)(ptr) + ((cap)*type_size),
70 (unsigned char*)(ptr) + ((size)*type_size),
71 (unsigned char*)(ptr) + (((size) - (diff)) * type_size));
72}
73
74 // Unpoison memory for a new element, use before adding it
75 #define GAIA_MEM_SANI_PUSH(type_size, ptr, cap, size) GAIA_MEM_SANI_PUSH_N(type_size, ptr, cap, size, 1)
76 // Poison memory for the last elements, use after removing it
77 #define GAIA_MEM_SANI_POP(type_size, ptr, cap, size) GAIA_MEM_SANI_POP_N(type_size, ptr, cap, size, 1)
78
79#else
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))
88#endif