dqn: Reduce ASAN guard size to 128 bytes, make it configurable
This commit is contained in:
parent
85c0fdf5fd
commit
b624ef1da5
5
dqn.h
5
dqn.h
@ -246,6 +246,11 @@
|
|||||||
//
|
//
|
||||||
// DQN_ASAN_VET_POISON 1
|
// DQN_ASAN_VET_POISON 1
|
||||||
//
|
//
|
||||||
|
// - Define this macro to the size of the guard memory reserved before and after
|
||||||
|
// allocations made that are poisoned to protect against out-of-bounds memory
|
||||||
|
// accesses. By default the library sets the guard to 128 bytes.
|
||||||
|
//
|
||||||
|
// DQN_ASAN_POISON_GUARD_SIZE 128
|
||||||
|
|
||||||
// NOTE: Dqn_Strings ===============================================================================
|
// NOTE: Dqn_Strings ===============================================================================
|
||||||
// [$CSTR] Dqn_CString8 | | C-string helpers
|
// [$CSTR] Dqn_CString8 | | C-string helpers
|
||||||
|
10
dqn_debug.h
10
dqn_debug.h
@ -38,9 +38,13 @@
|
|||||||
#define DQN_ASAN_POISON_VET 0
|
#define DQN_ASAN_POISON_VET 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(DQN_ASAN_POISON_ALIGNMENT)
|
#define DQN_ASAN_POISON_ALIGNMENT 8
|
||||||
#define DQN_ASAN_POISON_ALIGNMENT 8
|
#if !defined(DQN_ASAN_POISON_GUARD_SIZE)
|
||||||
|
#define DQN_ASAN_POISON_GUARD_SIZE 128
|
||||||
#endif
|
#endif
|
||||||
|
static_assert(Dqn_IsPowerOfTwoAligned(DQN_ASAN_POISON_GUARD_SIZE, DQN_ASAN_POISON_ALIGNMENT),
|
||||||
|
"ASAN poison guard size must be a power-of-two and aligned to ASAN's alignment"
|
||||||
|
"requirement (8 bytes)");
|
||||||
|
|
||||||
// NOTE: MSVC does not support the feature detection macro for instance so we
|
// NOTE: MSVC does not support the feature detection macro for instance so we
|
||||||
// compile it out
|
// compile it out
|
||||||
@ -48,7 +52,7 @@
|
|||||||
#define __has_feature(x) 0
|
#define __has_feature(x) 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// NOTE: [$ASAN] Dqn_Asan ========================================================================== ===
|
// NOTE: [$ASAN] Dqn_Asan ==========================================================================
|
||||||
#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
|
#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
|
||||||
#include <sanitizer/asan_interface.h>
|
#include <sanitizer/asan_interface.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -844,8 +844,10 @@ DQN_API Dqn_Library *Dqn_Library_Init()
|
|||||||
Dqn_Log_DebugF("Dqn Library initialised:\n");
|
Dqn_Log_DebugF("Dqn Library initialised:\n");
|
||||||
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " OS Page Size/Alloc Granularity: %$$_I32u/%$$_I32u", result->os_page_size, result->os_alloc_granularity);
|
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " OS Page Size/Alloc Granularity: %$$_I32u/%$$_I32u", result->os_page_size, result->os_alloc_granularity);
|
||||||
|
|
||||||
if (DQN_ASAN_POISON)
|
if (DQN_ASAN_POISON) {
|
||||||
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " ASAN manual poisoning%s", DQN_ASAN_VET_POISON ? " (+vet sanity checks)" : "");
|
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " ASAN manual poisoning%s", DQN_ASAN_VET_POISON ? " (+vet sanity checks)" : "");
|
||||||
|
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " ASAN poison guard size: %$$_I32u", DQN_ASAN_POISON_GUARD_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(DQN_LEAK_TRACING)
|
#if defined(DQN_LEAK_TRACING)
|
||||||
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " Allocation leak tracing");
|
Dqn_Print_StdLnF(Dqn_PrintStd_Err, " Allocation leak tracing");
|
||||||
|
@ -179,7 +179,7 @@ DQN_API Dqn_MemBlockSizeRequiredResult Dqn_MemBlock_SizeRequired(Dqn_MemBlock co
|
|||||||
// is always guarded with poison-ed memory to prevent read/writes behind
|
// is always guarded with poison-ed memory to prevent read/writes behind
|
||||||
// the block of memory.
|
// the block of memory.
|
||||||
if ((block_flags & Dqn_MemBlockFlag_AllocsAreContiguous) == 0) {
|
if ((block_flags & Dqn_MemBlockFlag_AllocsAreContiguous) == 0) {
|
||||||
result.alloc_size = Dqn_AlignUpPowerOfTwo(size + g_dqn_library->os_page_size, DQN_ASAN_POISON_ALIGNMENT);
|
result.alloc_size = Dqn_AlignUpPowerOfTwo(size + DQN_ASAN_POISON_GUARD_SIZE, DQN_ASAN_POISON_ALIGNMENT);
|
||||||
}
|
}
|
||||||
ptr_alignment = DQN_MAX(alignment, DQN_ASAN_POISON_ALIGNMENT);
|
ptr_alignment = DQN_MAX(alignment, DQN_ASAN_POISON_ALIGNMENT);
|
||||||
}
|
}
|
||||||
@ -199,7 +199,7 @@ DQN_API Dqn_MemBlockSizeRequiredResult Dqn_MemBlock_SizeRequired(Dqn_MemBlock co
|
|||||||
|
|
||||||
Dqn_usize Dqn_MemBlock_MetadataSize()
|
Dqn_usize Dqn_MemBlock_MetadataSize()
|
||||||
{
|
{
|
||||||
Dqn_usize init_poison_page = DQN_ASAN_POISON ? g_dqn_library->os_page_size : 0;
|
Dqn_usize init_poison_page = DQN_ASAN_POISON ? DQN_ASAN_POISON_GUARD_SIZE : 0;
|
||||||
Dqn_usize poison_alignment = DQN_ASAN_POISON ? DQN_ASAN_POISON_ALIGNMENT : 0;
|
Dqn_usize poison_alignment = DQN_ASAN_POISON ? DQN_ASAN_POISON_ALIGNMENT : 0;
|
||||||
Dqn_usize result = Dqn_AlignUpPowerOfTwo(sizeof(Dqn_MemBlock), poison_alignment) + init_poison_page;
|
Dqn_usize result = Dqn_AlignUpPowerOfTwo(sizeof(Dqn_MemBlock), poison_alignment) + init_poison_page;
|
||||||
return result;
|
return result;
|
||||||
@ -236,7 +236,7 @@ DQN_API Dqn_MemBlock *Dqn_MemBlock_Init(Dqn_usize reserve, Dqn_usize commit, uin
|
|||||||
DQN_ASSERT(Dqn_IsPowerOfTwoAligned(result->data, DQN_ASAN_POISON_ALIGNMENT));
|
DQN_ASSERT(Dqn_IsPowerOfTwoAligned(result->data, DQN_ASAN_POISON_ALIGNMENT));
|
||||||
DQN_ASSERT(Dqn_IsPowerOfTwoAligned(result->size, DQN_ASAN_POISON_ALIGNMENT));
|
DQN_ASSERT(Dqn_IsPowerOfTwoAligned(result->size, DQN_ASAN_POISON_ALIGNMENT));
|
||||||
void *poison_ptr = DQN_CAST(void *)Dqn_AlignUpPowerOfTwo(DQN_CAST(char *)result + sizeof(Dqn_MemBlock), DQN_ASAN_POISON_ALIGNMENT);
|
void *poison_ptr = DQN_CAST(void *)Dqn_AlignUpPowerOfTwo(DQN_CAST(char *)result + sizeof(Dqn_MemBlock), DQN_ASAN_POISON_ALIGNMENT);
|
||||||
Dqn_usize bytes_to_poison = g_dqn_library->os_page_size + result->size;
|
Dqn_usize bytes_to_poison = DQN_ASAN_POISON_GUARD_SIZE + result->size;
|
||||||
Dqn_ASAN_PoisonMemoryRegion(poison_ptr, bytes_to_poison);
|
Dqn_ASAN_PoisonMemoryRegion(poison_ptr, bytes_to_poison);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user