mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 23:39:31 +03:00
fix MI_GUARDED build
This commit is contained in:
parent
2a1c346281
commit
c478ddaab4
7 changed files with 30 additions and 11 deletions
|
@ -116,7 +116,7 @@
|
|||
<SDLCheck>true</SDLCheck>
|
||||
<ConformanceMode>Default</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>MI_DEBUG=3;MI_GUARDED=0;%(PreprocessorDefinitions);</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>MI_DEBUG=3;%(PreprocessorDefinitions);</PreprocessorDefinitions>
|
||||
<CompileAs>CompileAsCpp</CompileAs>
|
||||
<SupportJustMyCode>false</SupportJustMyCode>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
|
|
|
@ -628,6 +628,9 @@ static void* mi_block_ptr_set_guarded(mi_block_t* block, size_t obj_size) {
|
|||
return NULL;
|
||||
}
|
||||
uint8_t* guard_page = (uint8_t*)block + block_size - os_page_size;
|
||||
// note: the alignment of the guard page relies on blocks being os_page_size aligned which
|
||||
// is ensured in `mi_arena_page_alloc_fresh`.
|
||||
mi_assert_internal(_mi_is_aligned(block, os_page_size));
|
||||
mi_assert_internal(_mi_is_aligned(guard_page, os_page_size));
|
||||
if (!page->memid.is_pinned && _mi_is_aligned(guard_page, os_page_size)) {
|
||||
_mi_os_protect(guard_page, os_page_size);
|
||||
|
|
18
src/arena.c
18
src/arena.c
|
@ -624,7 +624,23 @@ static mi_page_t* mi_arena_page_alloc_fresh(size_t slice_count, size_t block_siz
|
|||
if (MI_PAGE_INFO_SIZE < _mi_align_up(sizeof(*page), MI_PAGE_MIN_BLOCK_ALIGN)) {
|
||||
_mi_error_message(EFAULT, "fatal internal error: MI_PAGE_INFO_SIZE is too small.\n");
|
||||
};
|
||||
const size_t block_start = (os_align ? MI_PAGE_ALIGN : MI_PAGE_INFO_SIZE);
|
||||
size_t block_start;
|
||||
#if MI_GUARDED
|
||||
// in a guarded build, we aling pages with blocks a multiple of an OS page size, to the OS page size
|
||||
// this ensures that all blocks in such pages are OS page size aligned (which is needed for the guard pages)
|
||||
const size_t os_page_size = _mi_os_page_size();
|
||||
mi_assert_internal(MI_PAGE_ALIGN >= os_page_size);
|
||||
if (block_size % os_page_size == 0) {
|
||||
block_start = _mi_align_up(MI_PAGE_INFO_SIZE, os_page_size);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (os_align) {
|
||||
block_start = MI_PAGE_ALIGN;
|
||||
}
|
||||
else {
|
||||
block_start = MI_PAGE_INFO_SIZE;
|
||||
}
|
||||
const size_t reserved = (os_align ? 1 : (mi_size_of_slices(slice_count) - block_start) / block_size);
|
||||
mi_assert_internal(reserved > 0 && reserved <= UINT16_MAX);
|
||||
page->reserved = (uint16_t)reserved;
|
||||
|
|
|
@ -180,7 +180,7 @@ mi_decl_export void mi_heap_guarded_set_sample_rate(mi_heap_t* heap, size_t samp
|
|||
if (heap->guarded_sample_rate >= 1) {
|
||||
heap->guarded_sample_seed = heap->guarded_sample_seed % heap->guarded_sample_rate;
|
||||
}
|
||||
heap->guarded_sample_count = heap->guarded_sample_seed; // count down samples
|
||||
heap->guarded_sample_count = 1 + heap->guarded_sample_seed; // count down samples
|
||||
}
|
||||
|
||||
mi_decl_export void mi_heap_guarded_set_size_bound(mi_heap_t* heap, size_t min, size_t max) {
|
||||
|
|
|
@ -84,8 +84,8 @@ bool _mi_getenv(const char* name, char* result, size_t result_size) {
|
|||
// This is mostly to avoid calling these when libc is not yet
|
||||
// initialized (and to reduce dependencies)
|
||||
//
|
||||
// format: d i, p x u, s
|
||||
// prec: z l ll L
|
||||
// format: d i, p, x, u, s
|
||||
// type: z l ll L
|
||||
// width: 10
|
||||
// align-left: -
|
||||
// fill: 0
|
||||
|
|
|
@ -233,8 +233,8 @@ static void test_heap_walk(void) {
|
|||
}
|
||||
|
||||
static void test_canary_leak(void) {
|
||||
char* p = mi_mallocn_tp(char, 23);
|
||||
for (int i = 0; i < 23; i++) {
|
||||
char* p = mi_mallocn_tp(char, 22);
|
||||
for (int i = 0; i < 22; i++) {
|
||||
p[i] = '0'+i;
|
||||
}
|
||||
puts(p);
|
||||
|
|
|
@ -42,7 +42,7 @@ static int SCALE = 10;
|
|||
static int ITER = 10;
|
||||
#elif 0
|
||||
static int THREADS = 4;
|
||||
static int SCALE = 100;
|
||||
static int SCALE = 10;
|
||||
static int ITER = 10;
|
||||
#define ALLOW_LARGE false
|
||||
#elif 0
|
||||
|
|
Loading…
Add table
Reference in a new issue